контроллер nginx-входа для Azure Kubernetes Service 502 Bad Gateway - PullRequest
0 голосов
/ 25 апреля 2019

У меня проблемы с настройкой контроллера nginx-ingress для работы в службе Azure Kubernetes;в настоящее время он возвращает 502 Bad Gateway каждый раз, когда я пытаюсь поразить некоторые веб-API, представленные как Сервисы.Поскольку я должен использовать существующий сертификат, я следовал https://docs.microsoft.com/en-us/azure/aks/ingress-own-tls для настройки контроллера и следовал https://www.markbrilman.nl/2011/08/howto-convert-a-pfx-to-a-seperate-key-crt-file/ для генерации сертификата и ключа из PFX (как сертификат был экспортирован из хранилища ключей Azure).Я создал секретный «aks-ingress-tls», используя сертификат, включающий промежуточные и корневые сертификаты и расшифрованный файл ключей.У меня есть YAML-файл для создания развертывания, сервис для его раскрытия и вход для маршрутизации к нему.Применяя этот YAML, я могу получить доступ к сервисам через их IP-адреса в HTTP, но использование HTTPS для EXTERNAL_IP контроллера входа всегда дает ошибку 502.Мой YAML-файл (отредактированный):

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-api
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: my-api
  replicas: 3
  template:
    metadata:
      labels:
        app: my-api
    spec:
      containers:
      - name: my-api
        image: [REDACTED]/my-api:1.0
        ports:
        - containerPort: 443
        - containerPort: 80
      imagePullSecrets: 
      - name: data-creds
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: my-service
spec:
  ports:
  - name: https
    port: 443
    targetPort: 443
    protocol: TCP
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: my-api
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  tls:
  - hosts: 
    - [REDACTED].co.uk
    secretName: aks-ingress-tls
  rules:
  - host: [REDACTED].co.uk
    http:
      paths:
      - path: /
        backend:
          serviceName: my-service
          servicePort: 443

Я добавил запись в свой файл hosts (я в Windows, поэтому не могу использовать curl --resolve) для сопоставления [УДАЛЕНО] .co.uk свходной контроллер EXTERNAL_IP, поэтому я могу попробовать получить к нему доступ.Вот когда я получаю ошибки.A curl -v https://[REDACTED].co.uk дает следующее:

VERBOSE: GET https://[REDACTED].co.uk/ with 0-byte payload
curl : The request was aborted: Could not create SSL/TLS secure channel.
At line:1 char:1
+ curl -v https://[REDACTED].co.uk
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Просмотр журналов для одного из модулей входного контроллера:

10.244.1.1 - [10.244.1.1] - - [25/Apr/2019:13:39:20 +0000] "GET / HTTP/2.0" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36" 10 0.001 [default-sub360-auth-service-443] 10.244.1.254:443, 10.244.1.3:443, 10.244.1.4:443 0, 0, 0 0.000, 0.000, 0.000 502, 502, 502 e44e21c8a2f61f5137c9afdfc64c6584
2019/04/25 13:39:20 [error] 1622#1622: *1127096 connect() failed (111: Connection refused) while connecting to upstream, client: 10.244.1.1, server: [REDACTED].co.uk, request: "GET /favicon.ico HTTP/2.0", upstream: "https://10.244.1.254:443/favicon.ico", host: "[REDACTED].co.uk", referrer: "https://[REDACTED].co.uk/"
2019/04/25 13:39:20 [error] 1622#1622: *1127096 connect() failed (111: Connection refused) while connecting to upstream, client: 10.244.1.1, server: [REDACTED].co.uk, request: "GET /favicon.ico HTTP/2.0", upstream: "https://10.244.1.3:443/favicon.ico", host: "[REDACTED].co.uk", referrer: "https://[REDACTED].co.uk/"
2019/04/25 13:39:20 [error] 1622#1622: *1127096 connect() failed (111: Connection refused) while connecting to upstream, client: 10.244.1.1, server: [REDACTED].co.uk, request: "GET /favicon.ico HTTP/2.0", upstream: "https://10.244.1.4:443/favicon.ico", host: "[REDACTED].co.uk", referrer: "https://[REDACTED].co.uk/"
10.244.1.1 - [10.244.1.1] - - [25/Apr/2019:13:39:20 +0000] "GET /favicon.ico HTTP/2.0" 502 559 "https://[REDACTED].co.uk/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36" 26 0.000 [default-sub360-auth-service-443] 10.244.1.254:443, 10.244.1.3:443, 10.244.1.4:443 0, 0, 0 0.000, 0.000, 0.004 502, 502, 502 63b6ed4414bf32694de3d136f7f277aa

Может кто-нибудь указать мне, что мне нужно посмотреть или сделать, чтобызаставить это работать сейчас?

1 Ответ

1 голос
/ 26 апреля 2019

Для вашей проблемы вход использует протокол HTTPS с портом 443, поэтому вам не нужно открывать порт 443 для вашего контейнера. Просто предоставьте порт, который слушает ваше приложение.

Для вас это означает, что вы просто выставляете порт 80 для своего контейнера и сервиса. Вам также необходимо удалить аннотацию nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" и изменить значение servicePort на 80.

Примечание. Добавление DNS-имени в сертификат также важно.

...