即使我的服务仅使用HTTPS,HTTP中的GKE入口答案

时间:2019-02-26 12:35:44

标签: kubernetes google-kubernetes-engine

我有基于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;
}

1 个答案:

答案 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