kubernetes https входное правило - PullRequest
0 голосов
/ 01 апреля 2020

Я определил в ранчере внешнюю службу и правило доступа, которое позволяет мне получить доступ к моей службе, используя: http://test.mycluster.ml

Что я должен изменить, чтобы сделать https://test.mycluster.ml вместо http?

Теперь у меня есть это:

apiVersion: v1
kind: Service
metadata:
  name: test
  namespace: default
spec:
  externalName: main.mycluster.ml
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  sessionAffinity: None
  type: ExternalName

и правило доступа вот так:

apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      nginx.ingress.kubernetes.io/upstream-vhost: main.mycluster.ml
    name: test
    namespace: default
  spec:
    rules:
    - host: test.mycluster.ml
      http:
        paths:
        - backend:
            serviceName: test
            servicePort: 80

Как это сделать?

Я попытался изменить службу на порт 443 и цель 80, а вход на 443, но безуспешно

 apiVersion: v1
    kind: Service
    metadata:
      name: test
      namespace: default
    spec:
      externalName: main.mycluster.ml
      ports:
      - port: 443
        protocol: TCP
        targetPort: 80
      sessionAffinity: None
      type: ExternalName

и правило входа, подобное этому:

apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      nginx.ingress.kubernetes.io/upstream-vhost: main.mycluster.ml
    name: test
    namespace: default
  spec:
    rules:
    - host: test.mycluster.ml
      http:
        paths:
        - backend:
            serviceName: test
            servicePort: 443

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Это выглядит как плохая практика (завершение tls для входящих запросов, в то время как исходящие запросы все еще находятся в обычном http). Пожалуйста, обратите внимание на использование типа службы: ExternlName - в ссылках ниже - для связи внутренних служб с внешними службами), однако:

  • Предполагается, что вы используете nginx -ingress контроллер поддерживается сообществом kubernetes .
  • для службы тип: ExternalName служба DNS кластера возвращает запись CNAME со значением, указанным в spe c .externalName . В вашем примере указанные порты не будут иметь эффекта :

spec:
  externalName: main.mycluster.ml
  ports:
  - port: 443
    protocol: TCP
    targetPort: 80
  • Пример использования типа сервиса: externalName. Обратите внимание на spe c .tls part :

apiVersion: v1
kind: Service
metadata:
  name: example
spec:
  type: ExternalName
  externalName: example.com
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/upstream-vhost: example.com    # add custom your upstream host
spec:
  rules:
  - host: xxx.xx
    http:
      paths:
      - backend:
          serviceName: example
          servicePort: 80
        path: /
  tls:                    # missing tls part
  - hosts:                 
    - xxx.xx
    secretName: api-cert  

В этом примере по умолчанию контроллер перенаправляет на HTTPS , если TLS включен для этого входа

В конфигурации контроллера по умолчанию этот параметр выглядит следующим образом: nginx.ingress.kubernetes.io/ssl-redirect: "true"

Дополнительная информация:


openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ${KEY_FILE} -out ${CERT_FILE} -subj "/CN=${HOST}/O=${HOST}"
  • Создание кубернетов tls secret

kubectl create secret tls api-cert --key ${KEY_FILE} --cert ${CERT_FILE}
  • Сконфигурируйте входной ресурс с разделом spe c .tls (секрет хоста и tls)

Имейте в виду, что при использовании службы kubernetes тип: ExternalName с ingress servicePort: 443 попытается связаться с вашим внешним доменом через порт 443 и (если внешняя служба прослушивает порт 80, это решение не будет работать).

В качестве обходного пути вы можете использовать Сервис без селектора:


kind: Service
apiVersion: v1
metadata:
 name: example2
spec:
 ports:
 - port: 443
   targetPort: 80
---
kind: Endpoints
apiVersion: v1
metadata:
 name: example2
subsets:
 - addresses:
     - ip: 93.184.216.34
   ports:
     - port: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/upstream-vhost: example.com    # add custom your upstream host
spec:
  rules:
  - host: xxx.xx
    http:
      paths:
      - backend:
          serviceName: example2
          servicePort: 443
        path: /
  tls:
  - hosts:
    - xxx.xx
    secretName: api-cert

Использовать kubectl describe ingress <your_ingress> взять Посмотрите на исходящий backend_service с примененным портом.

Rules:
  Host             Path  Backends
  ----             ----  --------
  xxx.xx  
                   /   example2:443 (93.184.216.34:80)

Надеюсь, эта помощь

1 голос
/ 01 апреля 2020

В настоящее время ваш входящий сервер получает запрос незашифрованного запроса на порт 80 и перенаправляет его на порт 80 вашей службы.

Поэтому, если вы хотите переключиться на зашифрованный 443 порт TCP (он же) https):

  • - это группа брандмауэра / безопасности перед входным сервером, которая авторизует запрос на порт 443?
  • , это ваш входной сервер или ваши модули, которые запускают SSL-соединение?
  • если это вход, вам нужно настроить его на прием SSL-соединения и установить сертификат для домена test.mycluster.ml
  • , если это pod (ы), вы нужно настроить их на прием SSL-соединения и установить сертификат для домена test.mycluster.ml
0 голосов
/ 01 апреля 2020

Вы не можете просто преобразовать свой вход, изменив порт с 80 на 443.

Сначала необходимо установить входной контроллер NGINX, а затем настроить TLS с сертификатами Let's Encrypt и сертификатом cert-manager. Вы можете проверить эти документы с более подробными инструкциями по реализации этого решения:

Защищенные сервисы Kubernetes с Ingress, TLS и Let's Encrypt

Развертывание Nginx Вход и контроллер Cert-Manager на GKE с использованием Helm 3

...