Разоблачение Дженкинса в GKE с использованием Ingress NGINX Controller с плагином входа в Google - PullRequest
1 голос
/ 24 марта 2020

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

Домен, в котором я хочу получить доступ к 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 без части "Дженкинс", что не так с мои настройки?

1 Ответ

0 голосов
/ 24 марта 2020

Добро пожаловать в Stack Laimis!

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

В вашем входе отсутствует цель перезаписи :

В некоторых сценариях ios открытый 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
  • Я буду использовать вход, так же как и у вас, единственные отличия:
    • Изменен сервис на echo1-svc, эмулирующий ваш jenkins-sv c
    • Добавлен еще один сервис к 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
  • С помощью правила входа мы можем свернуть порт 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, но я Я бы предложил вам сначала исправить ваш вход, затем вы можете вставить сюда статус, который он вернет, если у вас все еще есть проблемы с правильным перенаправлением входа.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...