我们有一个使用以下前端服务的GKE入口。入口也会终止tls。我们希望http到HTTP上的所有流量都具有从http到https的永久重定向。
通过以下配置,我们可以正常工作,并同时在http和https上提供流量(无重定向)。
用于部署的容器可以配置为使用--https-redirect标志将http重写为https。它还尊重并信任 X-Forwarded-Proto 标头,如果标头值设置为 https ,它将认为它是安全的。
因此,对于readinessProbe,我可以看到的最合理的配置是以下配置,但是注释行未注释。但是,一旦应用此版本,我们就永远不会进入健康状态,而配置了Ingress的终止域将返回502,并且永不恢复。
那么以下方法有什么问题? 我已经测试过使用Pod和服务的端口转发功能,并且如果我不提供X-Forwarded-Proto标头,它们都将返回301,如果我提供带有https值的X-Forwarded-Proto标头,则它们都将返回200。 / p>
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
答案 0 :(得分:2)
GCP运行状况检查对于返回的HTTP响应代码非常挑剔。它必须是200,而不是重定向。如果采用您发布的配置,则NLB将从您的服务器获得301/302响应。然后它将标记您的后端不健康,因为这不是200条响应。如果运行状况检查正在发送不带X-Forwarded-Proto标头的HTTP,则很有可能。
您可以通过检查部署Pod的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终止。但是,这可不是一件容易的事,但是您正在考虑使用cert-manager / Let的Encrypt可能值得探索。