当前位置: 首页 > 知识库问答 >
问题:

Google云负载平衡器使用Kubernetes入口强制HTTP而不是HTTPS

田博远
2023-03-14

我正在尝试部署一个Docker容器,它公开了一个简单的Docker服务器,它是Google容器引擎(库伯内特斯)中httpbin.org服务的克隆。

这是我正在使用的服务定义:

apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 3000
    protocol: TCP
name: http
selector:
  app: httpbin

入口定义为:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: httpbin-tls
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "http-bin-static-ip"
spec:
  tls:
  - secretName: positive-ssl
  backend:
    serviceName: httpbin
    servicePort: 80

在服务/入口仪表板中,我可以看到两个IP,一个直接绑定到服务(临时),另一个静态IP绑定到入口。直接在80号端口给他们两个打电话很有魅力。

完成后,我为静态IP创建了一个A记录,并确保GKE仪表板中的负载平衡器正常:

HTTPSendpoint应该根据我查看的许多教程和手册工作,但事实并非如此!每次对HTTPS的调用都会被重定向(301)到HTTP端口。

curl-v的输出:

* Rebuilt URL to: https://httpbin-1.mydomain.com/
*   Trying XXX.XX.XX.XX...
* TCP_NODELAY set
* Connected to httpbin-1.mydomain.com (XXX.XX.XX.XX) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
* Server certificate: mydomain.com
* Server certificate: COMODO ECC Domain Validation Secure Server CA 2
* Server certificate: COMODO ECC Certification Authority
> GET / HTTP/1.1
> Host: httpbin-1.mydomain.com
> User-Agent: curl/7.51.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Fri, 03 Mar 2017 18:01:23 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: max-age=3600
< Expires: Fri, 03 Mar 2017 19:01:23 GMT
< Location: http://httpbin-1.mydomain.com/
< 
* Curl_http_done: called premature == 0
* Connection #0 to host httpbin-1.mydomain.com left intact

我没有创建任何类型的自动重定向,严格遵循官方手册(来自Kubernetes和GKE),但我无法超越这一点。甚至尝试从头开始重新创建整个堆栈,一个新的集群,新的负载平衡器,但得到了相同的结果。

我错过了什么?Tks!

共有1个答案

卜方伟
2023-03-14

AFAIK GLB无法为您进行正确的转发。您必须在入口后使用服务中的网络服务器来解决这种情况。

您当前的行为似乎是由

注释:kubernetes。io/入口。全局静态ip名称:“http bin static ip”

从入口中删除该部分,您应该会看到您的https会话在入口处终止。

 类似资料:
  • 我遵循了GKE教程,使用beta Inrit类型创建HTTP负载均衡器,并且在使用nginx映像时工作正常。我的问题是为什么Inrit是必要的。 我可以创建一个容器引擎集群,然后创建一个使用库伯内特斯创建的实例组作为服务后端的HTTP负载均衡器,并且一切似乎都运行良好。当仅在部分流程中使用库伯内特斯似乎运行良好时,为什么我要经历使用Inete的所有麻烦?

  • 是否可以在没有负载均衡器的情况下在库伯内特斯中使用入口控制器功能(在数字海洋中)。 是否有其他机制允许域名映射到Kubernetes服务;例如,如果我在Kubernetes集群上托管两个WordPress站点: == 域名如何在不显式输入端口号的情况下映射到容器端口8080。 感谢任何帮助。

  • 通过GKE进入kubernetes,目前正在裸机上通过kubeadm进行尝试。 在以后的环境中,不需要任何特定的负载平衡器;通过使用nginx入口和入口,可以为www提供服务。 相反,在gke上,使用相同的nginx入口,或者使用gke提供的l7,最终总是得到一个计费负载平衡器。 这似乎不是最终需要的,原因是什么?

  • 我想在Google容器引擎上运行docker映像的集群前面放置一个HTTP负载平衡器,这样我就可以使用HTTPS,而无需应用程序支持它。 我使用以下命令创建了一个容器集群: 然后,我创建了一个复制控制器,在集群上运行一个映像,该映像基本上是nginx,其中复制了静态文件。 如果我为此创建一个网络负载平衡器,一切都会正常工作。我可以转到我的负载平衡器IP地址并查看网站。但是,如果创建HTTP负载平衡

  • 试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv

  • 有人知道谷歌的HTTPS负载平衡器是否正常工作吗?我当时正在建立一个NGINX入口服务,但我注意到谷歌负载平衡器是由Kubernetes自动设置的。我得到了两个外部IP,而不是一个。因此,我决定使用谷歌服务,而不是设置NGINX负载平衡器。我删除了我的容器集群,创建了一个全新的集群。我在端口80上启动了HTTP pod和HTTP服务。然后,我创建了入口服务和L7控制器吊舱。现在,我在查看负载平衡器