Kubernetes Ingress: перенаправление SSL (HTTP -> HTTPS) не работает (Nginx Docker) - PullRequest
0 голосов
/ 21 апреля 2019

Я использую Kubernetes в Google Cloud Kubernetes Engine и настроил следующее: - Образ докера Nginx (nginx: последний), на котором размещено веб-приложение - Развертывание Kubernetes (файл yaml) - Сервис Kubernetes (файл yaml) - Секрет Kubernetes с существующим ключом и сертификатами (Wildcard PositiveSSL) - Kubernetes Ingress

В настоящее время у меня работают HTTP и HTTPS. Однако я хочу перенаправить все и все HTTP-вызовы на HTTPS автоматически, но, похоже, он не работает.

Я перепробовал множество вариантов файлов conf и script ниже, и похоже, что он не может перенаправить HTTP на HTTPS.

Есть идеи, что я тут не так делаю?

Пожалуйста, смотрите мои файлы conf, yaml и docker ниже.

Nginx Conf:

server {
  listen 80;
  charset utf-8;
  root /usr/share/nginx/html;

  location / {
    proxy_set_header        Host $host:$server_port;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_redirect  http:// https://;
    proxy_pass              http://portal.domain.com;
    proxy_http_version 1.1;
    proxy_request_buffering off;
  }
}

server {
  listen 443 ssl;

  charset utf-8;
  root /usr/share/nginx/html;

  ssl_certificate       /etc/nginx/ssl/domain_com_full.crt;
  ssl_certificate_key   /etc/nginx/ssl/domain_com.key;

  location / {
    proxy_set_header        Host $host:$server_port;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_redirect  http:// https://;
    proxy_pass              http://portal.domain.com;
    proxy_http_version 1.1;
    proxy_request_buffering off;
  }
}

Файл Docker:

FROM nginx:latest
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY domain_com_full.crt /etc/nginx/ssl/domain_com_full.crt
COPY domain_com.key /etc/nginx/ssl/domain_com.key
COPY dist /usr/share/nginx/html
EXPOSE 443 80

Развертывание YAML (я использую скрипт для заполнения ревизионной части изображения):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: domain-frontend-prd
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
        maxSurge: 1
        maxUnavailable: 0
  selector:
    matchLabels:
      run: domain-frontend-prd
  template:
    metadata:
      labels:
        run: domain-frontend-prd
    spec:
      containers:
      - name: domain-frontend-image
        image: eu.gcr.io/domain-service/domain-frontend-image:{{REVISION_ID}}
        ports:
        - containerPort: 80
        - containerPort: 443
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
          successThreshold: 1

Сервис YAML:

apiVersion: v1
kind: Service
metadata:
  name: domain-frontend-service-prd
spec:
  type: NodePort
  selector:
    run: domain-frontend-prd
  ports:
  - protocol: TCP
    port: 443
    targetPort: 443
    name: https-port
  - protocol: TCP
    port: 80
    targetPort: 80
    name: http-port

Входной YAML (Секрет работает, так как вызов HTTPS также работает + статический IP также существует и работает):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: domain-frontend-ingress-prd
  annotations:
    kubernetes.io/ingress.global-static-ip-name: kubernetes-ingress
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - portal.domain.com
    secretName: domain-tls
  backend:
    serviceName: domain-frontend-service-prd
    servicePort: 80
  rules:
  - host: portal.domain.com
    http:
      paths:
        - path: /
          backend:
            serviceName: domain-frontend-service-prd
            servicePort: 80

1 Ответ

1 голос
/ 05 мая 2019

В результате расширенного поиска я обнаружил, что, по-видимому, стандартный контроллер Ingress в движке Google Cloud Kubernetes не поддерживает перенаправление на HTTPS.

Чтобы иметь возможность пересылать трафик на HTTPS (из HTTP),вам нужно установить контроллер NGINX Ingress в соответствии с данным руководством / документацией:

https://cloud.google.com/community/tutorials/nginx-ingress-gke

Это решило мою проблему.

...