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

如何在不使用LoadBalancer类型的情况下发布Kubernetes服务(在GCP上)

孙清野
2023-03-14

我希望避免对某个Kubernetes服务使用类型:“LoadBalancer”,但仍然能够在Internet上发布它。我正在使用Google云平台(GCP)运行一个Kubernetes群集,该群集当前运行在单个节点上。

我尝试向我们提供外部IP服务配置,并轮流提供以下IP:

  • 托管Kubernetes群集的实例(外部IP;它还与Kubernetes节点的IP地址相关联,由Kubernetes描述节点报告
  • Kubernetes集群endpoint(由Google云控制台在集群详细信息中报告)
  • 在同一节点上运行的另一个类型为负载平衡器的Kubernetes服务的公共/外部IP

以上都没有帮助我使用带有外部IP配置的库伯内特斯服务访问我的应用程序

那么,如何在不使用负载平衡器(LoadBalancer)类型的Kubernetes服务的情况下在Internet上发布服务呢。

共有3个答案

钱均
2023-03-14

有几种惯用方法可以在Kubernetes中对外公开服务(请参见注释1):

  1. 服务。类型=负载平衡器,正如OP所指出的
  2. 服务。Type=NodePort,这将公开节点的IP
  3. 服务。Type=ExternalName,通过返回CNAME记录将服务映射到ExternalName字段的内容(您需要CoreDNS版本1.7或更高版本才能使用ExternalName类型。)
  4. 入口。这是一个向Kubernetes集群内的服务公开永久HTTP和/或HTTPS路由的新概念,您甚至可以将路由映射到多个服务。但是,这仅映射HTTP和/或HTTPS路由。(见注2)
王翰墨
2023-03-14

还有另一个选项:在pod上设置hostNetwork标志。

例如,您可以使用helm3以这种方式安装nginx:

 helm install --set controller.hostNetwork=true nginx-ingress nginx-stable/nginx-ingress

然后,nginx在端口80可用

巴照
2023-03-14

如果您不想使用负载平衡器服务,其他公开服务的选项有:

使用type设置为NodePort创建您的服务,库伯内特斯将在您的所有节点VM上分配一个端口,您的服务将在该端口上公开(文档)。例如,如果您有2个节点,w/public IP12.34.56.7823.45.67.89,并且库伯内特斯分配了您的服务端口31234,那么该服务将在两个12.34.56.78:31234上公开可用

如果您有能力将公共IP路由到您的节点,您可以在服务中指定ExternalIP,告诉Kubernetes“如果您看到有什么东西是通过我的服务端口发送到该IP的,请将它路由到我。”(文档)

集群endpoint对此不起作用,因为这只是Kubernetes主机的IP。另一个负载平衡器服务的公共IP无法工作,因为负载平衡器仅配置为路由该原始服务的端口。我希望节点IP正常工作,但如果您的服务端口是特权端口,则可能会发生冲突。

Kubernetes API包含一个代理endpoint,允许您访问集群endpointIP上的服务。E、 g.如果您的群集endpoint是1.2.3.4,则可以通过访问https://1.2.3.4/api/v1/proxy/namespaces/my-ns/services/my-service使用群集凭据。这实际上只应用于测试/调试,因为它会在到达服务的过程中通过Kubernetes主机传输所有流量(额外跳数、SPOF等)。

 类似资料:
  • 我到处都读过,要设置Https来访问kubernetes集群,您需要有入口,而不仅仅是一个负载平衡器服务,它还将集群暴露在外部。 我的问题是非常理论化的:如果入口(确实是)由负载平衡器服务、控制器(例如nginx映像的部署/pod)和一组规则(为了正确代理集群内的传入请求)组成,为什么我们不能在负载平衡器前设置Https而不是入口? 作为练习的标题,我自己分别构建了这三个组件(一个负载平衡器、一个

  • 我希望创建一个机器人集成他们提供的机器人框架DirectLineAPI。 但是,我希望该服务与云服务无关。因此,我们的想法是使用BotFramework功能启动对话,并使用它生成的对话id持久化对话缓存,但业务逻辑可以位于任何云服务(AWS/Google/IBM Cluod)等上。 是否有可能使用DirectLine API进行相同的设计,而不绑定到使用Azure Bot服务? https://d

  • 什么是port和targetport? 是否为每个代理设置LoadBalancer服务? 这些多个代理是否映射到cloud LB的单个公共IP地址? K8S/Cloud之外的服务如何访问单个代理?通过使用?或者使用?。还有,这里用的是哪个端口?还是? 如何在Kafka Broker的属性中指定此配置?对于k8s集群内部和外部的服务,As端口可能不同。 请帮忙。

  • 问题内容: 我正在使用Hibernate + JPA作为我的ORM解决方案。 我正在使用HSQL进行单元测试,并使用PostgreSQL作为真正的数据库。 我希望能够将Postgres的本机UUID类型与Hibernate一起使用,并在其String表示形式中将UUID与HSQL一起用于单元测试(因为HSQL没有UUID类型)。 我正在为Postgres和HSQL单元测试使用具有不同配置的持久性X

  • 在 play-with-k8s https://labs.play-with-k8s.com/ 搭建了一个k8s集群,部署了一个service get service的情况 get pods的情况 每一个pod中都有一个nginx容器,我手动进入到了每一个nginx容器中 修改index.htmll 为1111,22,333. 问题: service 是loadbalancer类型,且没有外部ip

  • 我正在建立一个应用程序,用户将把他们的测试和作业和任何东西。我想知道我的应用程序是否有可能在测试前一周和一天发出通知? 我看到的到处都是firebase通知和push通知。 我不想要这些在线通知,我将需要应用程序发送他们自己离线。这可能吗?