我希望避免对某个Kubernetes服务使用type: "LoadBalancer"
,但仍然可以在互联网上发布它。我正在使用谷歌云平台(GCP)运行一个Kubernetes集群,该集群目前运行在一个节点上。
我尝试向我们提供externalIPs
服务配置,并轮流提供以下IP:
- 承载Kubernetes集群的实例(外部IP;它也与
kubernetes describe node
报告的Kubernete节点的IP地址一致) - Kubernetes集群端点(如谷歌云控制台在集群详细信息中所报告的)
- 在同一节点上运行的CCD_ 4类型的另一个Kubernetes服务的公共/外部IP
以上这些都没有帮助我使用带有externalIPs
配置的Kubernetes服务访问我的应用程序。
那么,如果不使用LoadBalancer
类型的Kubernetes服务,我如何在互联网上发布服务呢。
如果您不想使用LoadBalancer
服务,公开您的服务的其他选项有:
类型NodePort
在type
设置为NodePort
的情况下创建您的服务,Kubernetes将在您的所有节点VM上分配一个端口,您的服务将在该端口上公开(docs)。例如,如果您有两个节点,带有公共IP12.34.56.78
和23.45.67.89
,并且Kubernetes分配了您的服务端口31234,那么该服务将在12.34.56.78:31234
&23.45.67.89:31234
指定externalIPs
如果你有能力将公共IP路由到你的节点,你可以在你的服务中指定externalIPs
来告诉Kubernetes"如果你看到有东西进入到那个IP w/my服务端口,请将它路由到我。"(docs)
集群端点对此不起作用,因为这只是您的Kubernetes主机的IP。另一个LoadBalancer
服务的公共IP将不起作用,因为LoadBalancer仅配置为路由该原始服务的端口。我希望节点IP可以工作,但如果您的服务端口是特权端口,则可能会发生冲突。
使用/proxy/
端点
Kubernetes API包含一个/proxy/
端点,允许您访问集群端点IP上的服务。例如,如果您的集群端点是1.2.3.4
,则可以通过使用集群凭据访问https://1.2.3.4/api/v1/proxy/namespaces/my-ns/services/my-service
来访问命名空间my-ns
中的my-service
。这实际上应该只用于测试/调试,因为它会在通往服务的路上通过Kubernetes主机获取所有流量(额外的跃点、SPOF等)
还有另一个选项:在pod上设置hostNetwork
标志。
例如,您可以使用helm3以这种方式安装nginx:
helm install --set controller.hostNetwork=true nginx-ingress nginx-stable/nginx-ingress
然后在端口80&443在运行pod的节点的IP地址上。您可以使用节点选择器或关联或其他工具来影响此选择。
在Kubernetes中对外公开服务有几种惯用方法(请参见注释#1):
- Service.Type=LoadBalancer,正如OP所指出的
- Service.Type=NodePort,这将暴露节点的IP
- Service.Type=ExternalName,通过返回CNAME记录将服务映射到ExternalName字段的内容(需要CoreDNS 1.7或更高版本才能使用ExternalName类型。)
- Ingress。这是一个新概念,它向Kubernetes集群中的服务公开了永恒的HTTP和/或HTTPS路由,您甚至可以将一条路由映射到多个服务。但是,这仅映射HTTP和/或HTTPS路由。(见注2)