我们有一个使用下面的前端服务的GKE进入。入口终止TLS为好。我们希望有HTTP到HTTPS永久重定向为来自HTTP的任何流量。
通过下面的配置,我们所有的工作,以及HTTP和HTTPS(无重定向)服务的流量。
用于部署该容器可以被配置来重写HTTP到HTTPS与--https重定向标记。它也尊重和信任的X转发,原头,并会考虑在标头值设置为https它是安全的。
所以最合理的配置,我可以看到的readinessProbe将低于配置,但与注释行注释。但是,只要我们运用这个版本中,我们从来没有进入一个健康的状态,而是用入口配置的终止域中的502返回和永无翻身之日。
那么,什么是错误的下面的方法呢?我一直在使用端口转发两舱和服务测试,他们都返回301,如果我不提供X-转发 - 协议头,并返回200,如果我提供的X转发,原标题为https值。
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: NodePort
ports:
- port: 8080
selector:
app: frontend
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- image: eu.gcr.io/someproject/frontend:master
imagePullPolicy: Always
# args:
# - '--https-redirect'
name: frontend
resources:
limits:
memory: 1Gi
cpu: '0.5'
ports:
- containerPort: 8080
name: frontend
readinessProbe:
httpGet:
path: /_readinessProbe
port: 8080
# httpHeaders:
# - name: X-Forwarded-Proto
# value: https
该GCP健康检查是它回来的HTTP响应代码非常挑剔。它必须是200,而不是重定向。如果在配置您发布时,NLB会从你的服务器301/302的响应。然后它会将您的后端为不健康的,因为这不是一个200响应。如果健康检查HTTP发送不带X - 转发,原头,这是可能的。
您可以通过检查部署的豆荚kubectl日志检查。
如果你移动到一个HTTPS健康检查,以试图解决这个问题我以前的答案可能是有用的。
从GKE documentation:您将需要把一个注解你的服务定义,告诉GKE使用HTTPS进行健康检查。否则,它会试图发送HTTP和混淆。
kind: Service
metadata:
name: my-service-3
annotations:
cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
type: NodePort
selector:
app: metrics
department: sales
ports:
- name: my-https-port
port: 443
targetPort: 8443
- name: my-http-port
port: 80
targetPort: 50001
我没有使用最新的语法,但这个曾经为我工作。
然而,这是如此笨重使用我结束了去那边Istio并获得该做的所有HTTPS终止。这是不小的任务然而,但你想使用证书管理器的/我们的加密这可能是值得探讨的。