Google Kubernetes Engine Ingress TLS не работает

Используя gitlab auto DevOps CI, он настроил ingress контроллер:

spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - backend:
          serviceName: production-auto-deploy
          servicePort: 5000
        path: /
  tls:
  - hosts:
    - api.example.com
    secretName: production-auto-deploy-tls
status:
  loadBalancer:
    ingress:
    - ip: xxx.xxx.xxx.xxx

http://api.example.com отлично работает, но https://api.example.com сначала выдает ошибку сертификата, а затем, после добавления исключения, я получаю 404 от Google Kubernetes Engine.

Почему сертификат TLS настроен неправильно?

Почему он не направляет хост к службе?

Балансировщик нагрузки

apiVersion: v1
kind: Service
spec:
  clusterIP: xxx.xxx.xxx.xxx
  externalTrafficPolicy: Cluster
  ports:
  - name: http
    nodePort: 30408
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    nodePort: 31101
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app: nginx-ingress
    component: controller
release: ingress

sessionAffinity: None тип: LoadBalancer status: loadBalancer: ingress: - ip: xxx.xxx.xxx.xxx

Ingress

apiVersion: v1
kind: Service
spec:
  clusterIP: xxx.xxx.xxx.xxx
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: http
  selector:
    app: nginx-ingress
    component: default-backend
    release: ingress
  sessionAffinity: None
  type: ClusterIP

status:
  loadBalancer: {}

person itaied    schedule 08.10.2018    source источник
comment
Какой у вас контроллер Ingress?   -  person Rico    schedule 09.10.2018
comment
Это yml, который я прикрепил. Что ты конкретно имеешь ввиду?   -  person itaied    schedule 09.10.2018
comment
Это правила входа из вашего входящего ресурса Kubernetes. Объект Ingress управляется контроллером входящего трафика, который может быть чем-то вроде traefik или nginx.   -  person Rico    schedule 09.10.2018
comment
Хорошо, теперь я это вижу. На самом деле это просто имя порта 80. Мне нужно установить там сертификат или просто добавить порт https, а все остальное обработать контроллер?   -  person itaied    schedule 09.10.2018
comment
@itaied: различные функции и аннотации могут поддерживаться или не поддерживаться в зависимости от выбранного Ingress контроллера: вход через kubernetes, Nginx, Traefik   -  person Konstantin Vustin    schedule 09.10.2018
comment
Вы можете опубликовать то, что видите? Похоже, он уже должен прослушивать порт 443, так как вы получаете ошибку сертификата на https://api.example.com, иначе вы не получите ответа   -  person Rico    schedule 09.10.2018
comment
Контроллер по умолчанию на GKE GCLB   -  person Grigoriev Nick    schedule 09.10.2018
comment
Я отредактировал вопрос более подробно. Это конфигурация по умолчанию из gitlab auto DevOps.   -  person itaied    schedule 09.10.2018
comment
Я не понимаю, где вы хотите проводить переговоры TLS, на LB или на Сервисе?   -  person Grigoriev Nick    schedule 09.10.2018
comment
Я думаю, что лучше быть на балансировщике нагрузки, чтобы у каждой службы был tls   -  person itaied    schedule 09.10.2018
comment
Также в вашем примере я вижу, что вы используете контроллер nginx, а не GKE GCLB по умолчанию. Вы правильно установили контроллер nginx с сертификатом tls?   -  person Grigoriev Nick    schedule 09.10.2018
comment
@itaied, если вы предпочитаете согласование tls на LB, вам не нужно прослушивать порт 443 на службе.   -  person Grigoriev Nick    schedule 09.10.2018


Ответы (1)


Хорошо, в конце концов я понимаю, что вы делаете. Вы создаете сервис NGINX, который будет балансировать между вашими услугами, как Ingress. Я не понимаю, как служба NGINX с CLUSTER_IP может быть открыта для мира и служить входом.

Но вот план, что нужно сделать, чтобы предоставить сервису GKE доступ для WORLD. 1) настроенный сервис с clusterIp, который будет прослушивать доступный внутри кластера k8s 2) настроенные правила входа. 3) Если вы хотите использовать дополнительный входной контроллер на GKE, установите свой контроллер. Вот пример того, как это может работать на GCLB. (В случае GCLB сервис должен быть представлен на NodePort, плохой дизайн)

service apiVersion: v1 kind: Service labels: app: service-nm name: service-name namespace: your-nm spec: externalTrafficPolicy: Cluster ports: - nodePort: 30200 port: 80 protocol: TCP targetPort: 3001 selector: app: operator sessionAffinity: None type: NodePort Igress apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.allow-http: false ingress.gcp.kubernetes.io/pre-shared-cert: np-ssl-certificate spec: rules: - host: your domain-name http: paths: - backend: serviceName: your-sn servicePort: 80 - host: your-domain-name Подробнее о том, как установить nginx на GKE, https://cloud.google.com/community/tutorials/nginx-ingress-gke

person Grigoriev Nick    schedule 09.10.2018