Kubernetes SSL Redirect Ingress - PullRequest
       17

Kubernetes SSL Redirect Ingress

2 голосов
/ 04 мая 2020

Я очень новичок в Kubernetes и пытаюсь выяснить, как настроить перенаправление http -> https для моего кластера kubernetes. Я искал и пробовал много разных аннотаций, и я не уверен, правильно ли я их применяю или нет. Я вставил свои файлы ниже и был бы рад поделиться, если потребуется больше.

Я пытался добавить эти строки в раздел аннотаций

nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"

Я также пытался реализовать этот обходной путь, но безуспешно.

Обходной путь перенаправления

Я ценю помощь!

service.yaml

kind: Service
apiVersion: v1
metadata:
  name: loadbalancer-ingress
  annotations:
    {{- if .Values.loadbalancer.cert }}
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: {{ .Values.loadbalancer.cert | quote }}
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "{{- range .Values.loadbalancer.ports -}}{{- if .ssl -}}{{ .name }},{{- end -}}{{- end -}}"
    {{- end }}
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: {{ .Values.loadbalancer.backend_protocol | quote }}
    service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60"
spec:
  type: LoadBalancer
  selector: 
    pod: {{ .Chart.Name }}
  ports:
    {{- range .Values.loadbalancer.ports }}
    - name: {{ .name }}
      port: {{ .port }}
      targetPort: {{ .targetPort }}
    {{- end }}

configmap.yaml

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: {{ .Chart.Name }}-nginx-configuration
data:
  use-proxy-protocol: "false"
  use-forwarded-headers: "true"
  server-tokens: "false"

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: {{ .Chart.Name }}-tcp-services

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: {{ .Chart.Name }}-udp-services

values.yaml

loadbalancer:
  backend_protocol: http
  cert: MY_AWS_CERT
  ports:
    - name: http
      port: 80
      targetPort: 80
      ssl: false
    - name: https
      port: 443
      targetPort: 80
      ssl: true

Ответы [ 2 ]

1 голос
/ 06 мая 2020

HTTPS для бэкэнда

Если вы хотите установить https в качестве бэкэнда traffi c, то замените http -> https в values.yaml

Объяснение:

service.yaml имеет:

service.beta.kubernetes.io/aws-load-balancer-backend-protocol: {{ .Values.loadbalancer.backend_protocol | quote }}

Это означает, что aws-load-balancer-backend-protocol объявлено в values.yaml

loadbalancer:
  backend_protocol: http

Согласно AWS части k8s man :

service.beta.kubernetes.io/aws-load-balancer-backend-protocol: Используется в службе для указания протокола, на котором говорит сервер (модуль) за слушателем. Если http (по умолчанию) или https, создается прослушиватель HTTPS, который завершает соединение и анализирует заголовки. Если установлено значение ssl или tcp, используется «необработанный» прослушиватель SSL. Если установлено значение http, а aws-load-balancer-ssl-cert не используется, то используется прослушиватель HTTP.

HTTPS для интерфейса

Если вы задали вопрос о https для интерфейса, то вы нужно настроить ingress -контроллер. Согласно ingress man из k8s:

У вас должен быть входной контроллер , чтобы удовлетворить вход. Только создание ресурса Ingress не имеет никакого эффекта.

Вам может потребоваться развернуть контроллер Ingress, например, ingress- nginx.

AWS часть NGINX ingress руководство по установке контроллера здесь :

В AWS мы используем балансировщик сетевой нагрузки (NLB) для предоставления входного контроллера NGINX за службой Type=LoadBalancer.

балансировщик сетевой нагрузки (NLB)
70
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/aws/deploy.yaml

`

TLS-завершение в AWS Балансировщик нагрузки (ELB)> В некоторых случаях ios требуется для завершения TLS в Балансировщике нагрузки, а не во входном контроллере.

Для этого мы предоставляем шаблон: deploy-tls-termination.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/aws/deploy-tls-termination.yaml
  • Отредактируйте файл и измените:
  • VP C CIDR, используемый для кластера Kubernetes: proxy-real-ip-cidr: XXX.XXX.XXX/XX
  • AWS Идентификатор диспетчера сертификатов (ACM) arn:aws:acm:us-west-2:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX
  • Развертывание манифеста: kubectl apply -f deploy-tls-termination.yaml
1 голос
/ 04 мая 2020

Перед этими модулями должны быть pods и сервис clusterIP, а затем во входном ресурсе вы можете обратиться к сервису. Таким образом, входной контроллер, такой как nginx, получит трафик c от клиента, который находится за пределами кластера kubernetes, и перенаправит этот трафик c в модули за службой. Сам входной контроллер должен быть открыт вне кластера через службу типа LoadBalancer.

Ссылаясь из документов здесь , входной ресурс будет выглядеть как

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80
...