【发布时间】:2019-04-21 13:06:41
【问题描述】:
我在 Google Cloud Kubernetes Engine 中使用 Kubernetes 并设置了以下内容: - Nginx docker 镜像 (nginx:latest),它托管一个 Web 应用程序 - Kubernetes 部署(yaml 文件) - Kubernetes 服务(yaml 文件) - 具有现有密钥和证书的 Kubernetes Secret(通配符 PositiveSSL) - Kubernetes 入口
目前我可以同时使用 HTTP 和 HTTPS。但是,我想将所有 HTTP 调用自动重定向到 HTTPS,但似乎无法正常工作。
我尝试了以下 conf 和脚本文件的许多变体,但似乎无法将 HTTP 重定向到 HTTPS。
知道我在这里可能做错了什么吗?
请参阅下面的我的 conf、yaml 和 docker 文件。
Nginx 配置:
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(我用脚本填写图片的revision部分):
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
Ingress YAML(The Secret 有效,因为 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
【问题讨论】:
-
你的配置很乱。很难理解你想要达到什么目的。您想在哪里实际终止 SSL?在负载均衡器上?在 Nginx 入口上?在后端nginx?您还使用 GKE 入口还是 Nginx 入口控制器?这是两个完全不同的东西。看起来您正在尝试使用这两种类型的注释,这也是无用的。
-
我想要实现的是在入口 docker 映像中设置 Web 应用程序,并使其只能通过 HTTPS 访问,因此当用户使用 HTTP 输入 URL 时,他们会立即重定向到 HTTPS .您对实现这一目标的正确方法有什么建议吗?
-
这很明显。您想在哪里终止 SSL?好的,如果您不知道,那么简单的问题 - 您是否安装了 Nginx 入口?你在 ingress-nginx 命名空间中有什么东西吗?
-
我没有安装 ingress-nginx,我的集群中没有命名空间。
-
你能改变你的后端 Nginx 配置为 80 端口看起来像这样: server { listen 80;服务器名称 _;返回 301 https://$host$request_uri; }
标签: ssl https kubernetes google-kubernetes-engine kubernetes-ingress