我有基于Nginx的服务,该服务配置为仅接受HTTPS。 但是,GKE入口在HTTP中回答HTTP请求。我知道GKE Ingress不知道要强制执行HTTP-> HTTPS重定向,但是是否有可能至少学会从服务返回HTTPS?
rules:
- http:
paths:
- path: /*
backend:
serviceName: dashboard-ui
servicePort: 8443
更新:我确实在GKE入口和我的K8S服务上配置了TSL。当请求来自HTTPS时,一切正常。但是HTTP请求获得HTTP响应。我在服务中实现了HTTP-> HTTPS重定向,但这没有帮助。实际上,目前,入口和我的服务之间的所有通信都是HTTTPS,因为该服务仅公开HTTPS端口
解决方案-感谢Paul Annetts:Nginx应该检查 HTTPS 块中的原始协议并重定向,就像这样
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
答案 0 :(得分:1)
是的,您可以配置GKE Kubernetes入口既终止外部流量的HTTPS,又可以在Google HTTP(S)负载均衡器和GKE集群中的服务之间内部使用HTTPS。
这已记录在here中,但是相当复杂。
要使HTTPS正常运行,您将需要TLS证书和密钥。
如果您拥有自己的TLS证书并作为秘密密钥在群集中,则可以使用tls
的{{1}}部分提供它:
Ingress
您还可以将TLS证书和密钥直接上传到Google Cloud,并提供一个apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress-2
spec:
tls:
- secretName: my-secret
rules:
- http:
paths:
- path: /*
backend:
serviceName: my-metrics
servicePort: 60000
批注,告诉GKE Ingress使用它。
ingress.gcp.kubernetes.io/pre-shared-cert
要将HTTPS用于从负载均衡器到GKE集群的Google Cloud内部流量,您需要在apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-psc-ingress
annotations:
ingress.gcp.kubernetes.io/pre-shared-cert: "my-domain-tls-cert"
...
服务上使用cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
批注。请注意,必须为HTTPS命名您的端口。
NodePort
负载均衡器本身不支持从HTTP-> HTTPS重定向,您需要找到另一种方法。
当您将NGINX作为群集的入口点时,可以使用apiVersion: v1
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
HTTP标头检测用于连接到负载均衡器的协议,并进行重定向。
X-forwarded-Proto