Squeak.ru - шаблоны программирования

Разоблачение Jenkins в GKE с помощью Ingress NGINX Controller с плагином для входа в Google

Я пытаюсь настроить свой экземпляр Jenkins в Google Kubernetes Engine, также я использую плагин для входа в Google, чтобы я мог войти в Jenkins с помощью своего пользователя GCP, я установил Контроллер входящего трафика, который представляет собой NGINX и предоставляет доступ к службе Jenkins с помощью входа.

Домен, под которым я хочу получить доступ к Jenkins: util.my-app.com/jenkins

В конфигурации Jenkins в параметре Jenkins URL я также установил это доменное имя util.my-app.com/jenkins.

А вот мой Ингресс:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ing
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: util.my-app.com
    http:
      paths:
      - path: /jenkins/*
        backend:
          serviceName: jenkins-svc
          servicePort: 80

На странице учетных данных GCP в разделе Авторизованные источники JavaScript я установил http://util.my-app.com и в разделе Авторизованные URI перенаправления я установил http://util.my-app.com/jenkins/securityRealm/finishLogin

Он либо возвращает мне статус 404, либо выполняет бесконечные перенаправления, и я заметил, что когда плагин входа в систему Jenkins Google действительно перенаправляет, это выглядит так http://util.my-app.com/securityRealm/finishLogin без части "jenkins", что не так с моей настройкой?


Ответы:


1

Добро пожаловать в Стек Лаймис!

Я протестировал ваш входной объект и обнаружил одну проблему.

В вашем Ingress отсутствует rewrite-target:

В некоторых сценариях открытый URL-адрес в серверной службе отличается от пути, указанного в правиле Ingress. Без перезаписи любой запрос вернет 404. Установите аннотацию nginx.ingress.kubernetes.io/rewrite-target на путь, ожидаемый службой.

Этот пример из документации показывает требуемую структуру:

Вот ваш вход с правкой:

  • добавил строку nginx.ingress.kubernetes.io/rewrite-target: /$1
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ing
  annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: util.my-app.com
      http:
        paths:
          - path: /jenkins/*
            backend:
              serviceName: jenkins-svc
              servicePort: 80

Воспроизведение:

  • Сначала я создал развертывание. Для этого я использую echo-app для поясняющего вывода.
  • Добавьте службу, чтобы представить ее внутри кластера на port 8080 и снаружи как NodePort.
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo1-deploy
spec:
 selector:
   matchLabels:
     app: echo1-app
 template:
   metadata:
     labels:
       app: echo1-app
   spec:
     containers:
     - name: echo1-app
       image: mendhak/http-https-echo
       ports:
       - name: http
         containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: echo1-svc
spec:
 type: NodePort
 selector:
   app: echo1-app
 ports:
   - protocol: TCP
     port: 8080
     targetPort: 80
  • Я создам еще одно развертывание и службу, таким образом, мы можем попробовать немного дальше с Ingress и продемонстрировать, что делать, когда у вас есть более одной службы, которую вам нужно предоставить при входе.
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo2-deploy
spec:
 selector:
   matchLabels:
     app: echo2-app
 template:
   metadata:
     labels:
       app: echo2-app
   spec:
     containers:
     - name: echo2-app
       image: mendhak/http-https-echo
       ports:
       - name: http
         containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: echo2-svc
spec:
 type: NodePort
 selector:
   app: echo2-app
 ports:
   - protocol: TCP
     port: 8080
     targetPort: 80
  • I'll use an ingress, just like yours, the only diferences are:
    • Changed the service to echo1-svc emulating your jenkins-svc
    • В echo2-svc добавлен еще один сервис для перенаправления всех http-запросов, кроме тех, которые соответствуют первому правилу.
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ing
  annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: util.my-app.com
      http:
        paths:
          - path: /jenkins/*
            backend:
              serviceName: echo1-svc
              servicePort: 80
          - path: /(.*)
            backend:
              serviceName: echo2-svc
              servicePort: 80
  • Теперь я разверну эти приложения и вход:
$ kubectl apply -f echo1-deploy.yaml 
deployment.apps/echo1-deploy created
service/echo1-svc created

$ kubectl apply -f echo2-deploy.yaml 
deployment.apps/echo2-deploy created
service/echo2-svc created

$ kubectl apply -f jenkins-ing.yaml 
ingress.networking.k8s.io/jenkins-ing created
  • Теперь давайте проверим, все ли работает:
$ kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/echo1-deploy-989766d57-8pmhj   1/1     Running   0          27m
pod/echo2-deploy-65b6ffbcf-lfgzk   1/1     Running   0          27m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/echo1-svc    NodePort    10.101.127.78   <none>        8080:30443/TCP   27m
service/echo2-svc    NodePort    10.106.34.91    <none>        8080:32628/TCP   27m

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/echo1-deploy   1/1     1            1           27m
deployment.apps/echo2-deploy   1/1     1            1           27m

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/echo1-deploy-989766d57   1         1         1       27m
replicaset.apps/echo2-deploy-65b6ffbcf   1         1         1       27m

$ kubectl get ingress
NAME          HOSTS             ADDRESS   PORTS   AGE
jenkins-ing   util.my-app.com             80      4s
  • Как видите, echo1-svc выставлен за пределы kubernetes на port 30443 и echo2-svc на port 32628.
  • С помощью правила входа мы можем использовать Curl на порту 80, и он будет перенаправляться на указанную службу.
  • Поскольку у меня нет этого домена, я добавлю запись в свой файл /etc/hosts, чтобы эмулировать разрешение DNS, направляя его на мой IP-адрес kubernetes.
$ cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

192.168.39.240  util.my-app.com

$ curl util.my-app.com/jenkins
{
  "headers": {
    "host": "util.my-app.com",
    "x-real-ip": "192.168.39.1",
    "x-forwarded-host": "util.my-app.com",
    "x-forwarded-port": "80",
    "x-forwarded-proto": "http",
    "user-agent": "curl/7.52.1",
  },
  "method": "GET",
  "hostname": "util.my-app.com",
  "ip": "::ffff:172.17.0.6",
  "protocol": "http",
   "subdomains": [
    "util"
  ],
  "os": {
    "hostname": "echo1-deploy-989766d57-8pmhj"
  }

Вы можете видеть, что HTTP GET был перенаправлен на модуль на серверной части echo1-svc. Теперь давайте проверим, что происходит, когда мы скручиваем домен без /jenkins/.

$ curl util.my-app.com
{
  "headers": {
    "host": "util.my-app.com",
    "x-real-ip": "192.168.39.1",
    "x-forwarded-host": "util.my-app.com",
    "x-forwarded-port": "80",
    "x-forwarded-proto": "http",
    "user-agent": "curl/7.52.1",
 },
  "method": "GET",
  "hostname": "util.my-app.com",
  "ip": "::ffff:172.17.0.6",
  "protocol": "http",
  "subdomains": [
    "util"
  ],
  "os": {
    "hostname": "echo2-deploy-65b6ffbcf-lfgzk"

Вы можете видеть, что HTTP GET был перенаправлен на модуль на серверной части echo2-svc.


  • Я знаю, что ваш вопрос также касается проблем с вашей аутентификацией Google, но я предлагаю вам сначала исправить свой вход, а затем вы можете вставить сюда статус, который он вернет, если у вас все еще есть проблемы с правильным перенаправлением входа.

Если у вас есть какие-либо сомнения, дайте мне знать в комментариях.

24.03.2020
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...