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

允许在kubernetes中与nginx进行集群内通信

茅高卓
2023-03-14

我目前的k8s设置面临一个问题。在生产中,我启动了我们每个服务的三个副本并将它们放在一个pod中。当pod相互通信时,我们希望pod以循环方式与pod中的每个容器通信。不幸的是,由于TLS保持活动,pod之间的连接永远不会终止——我们不想专门更改该部分——但我们确实希望pod中的每个容器都能正常通信。这就是我们现在所拥有的:

如果API试图与pod OSS通信,它将仅与第一个容器通信。我希望API能够以循环方式与所有三个容器通信。

我该怎么做?我知道我需要一个像nginx这样的入口控制器。但是有没有一些真正的教程来分解我如何实现这一点?我不确定,对k8s有些陌生。任何帮助都会被分配!

顺便说一下,我正在本地处理mini kube。

编辑:

在生产中,我们为每个服务提供三个副本。当serviceA需要与serviceB通话时,将从serviceB选择一个pod,并管理其收到的任何请求。然而,该pod成为服务B中唯一处理任何通信的pod;换句话说,POD从未与B2和B3通话。我正试图用nginx解决这个问题,因为我们似乎需要一个负载平衡器来帮助解决这个问题,但我不知道该怎么做。有人能详细解释一下需要做什么吗?具体来说,我如何使用我的服务设置nginx,以便所有pod都在一个服务中使用(以某种循环方式),而不是像现在这样只使用一个pod?这是一个问题,因为在生产中,当我们有另外两个吊舱在那里无所事事时,其中一个吊舱的请求会过载,然后死亡。我在minikube当地开发。

共有2个答案

马朝斑
2023-03-14

这里提到了一个非常简单的例子,说明如何使用库伯内特斯服务平衡后端pod

您的副本应该由链接中提到的kubernetes自行管理,即创建您的pod,有点像下面示例中提到的那样,然后按照步骤创建指向这些pod的服务

kubectl run hello-world --replicas=2 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0  --port=8080

通过这样做,kubernetes将确保负载在所有正在运行的pod中均匀分布。

kubectl get endpoints --all-namespaces

NAMESPACE     NAME                      ENDPOINTS                                                  AGE
kube-system   kube-dns                  10.244.0.96:53,10.244.0.97:53,10.244.0.96:53 + 1 more...   1d

如果您真的对设置nginx入口感兴趣,这将是一个很好的开始。但是,kubernetes服务中的简单负载平衡器应该可以满足您当前的需求

汪成仁
2023-03-14

我假设你的豆荚下面有一个微服务架构,对吗?你考虑过将Istio与库伯内特斯一起使用吗?它是开源的,由谷歌、IBM和Lyft开发——目的是为开发人员提供一种供应商中立的方式(这似乎是你正在寻找的)来连接、保护、管理和监控云平台(AWS、Azure、谷歌等)上不同微服务的网络。

在高层次上,Istio有助于降低这些部署的复杂性,并减轻您的开发团队的压力。它是一个完全开源的服务网格,透明地分层到现有的分布式应用程序上。它也是一个平台,包括允许它集成到任何日志记录平台、遥测或策略系统中的API。Istio的多样化功能集可让您成功、高效地运行分布式微服务架构,并提供一种统一的方式来保护、连接和监控微服务

这是Istio留档的链接,详细讲解如何设置多集群环境,就是你要找的。

文档中有一条我想强调的注释--它可能与您的问题有关:

由于库伯内特斯pod没有稳定的IP,重新启动控制面集群中的任何Istio服务pod都会导致其endpoint被更改。因此,从远程集群到该endpoint的任何连接都将被中断。这在Istio问题#4822中进行了记录。

有许多方法可以避免或解决这种情况。本节从较高的层次概述了这些选项。

  • 更新DNS条目

我引用负载均衡器解决方案,因为它似乎是你想要的:

在库伯内特斯中,您可以将服务类型为LoadBalancer的服务声明为服务。Pod重启问题的一个简单解决方案是为Istio服务使用负载均衡器。然后,您可以使用负载均衡器IP作为Istio服务的endpointIP来配置远程集群。

我希望这有帮助,如果你有任何问题,开枪!

 类似资料:
  • 我有一个运行在minikube(已启用加载项)中的nginx ingress,它有几个吊舱和服务,ingress具有以下配置: 当我在集群之外时,以下各项工作正常: 但是,当我在集群内时,我希望容器能够使用我的入口模板中列出的主机名相互通信。例如,我希望以下方法可以工作,但事实并非如此: 相反,它返回实际api的结果。信息网站,我没有隶属关系。首先,有人能确认这是可行的吗? 非常感谢。

  • 我有一个复合服务S.c,它使用两个原子服务S.a和S.b,其中所有三个服务都在Kubernetes集群中运行。更好的模式是什么 1)将Sa、Sb创建为无头服务,并让Sc通过NGINX等外部负载均衡器与它们集成(使用DNS解析器来维护更新的后端pod) 2) 使用clusterIP创建Sa、Sb,并让Sc通过群集DNS(skyDNS加载项)访问/解析它们。这将在内部利用基于IP表的负载平衡来实现PO

  • 我是新点燃的。 步骤1:我在两个VM(ubuntu)中安装了Ignite 2.6.0,在一个VM中启动了节点。下面有COMAND。bin/ignite.sh examples/config/example-ignite.xml 步骤2:我的所有配置都在example-default.xml中 步骤3:在其他VM中执行包含datagrid逻辑的client.jar(该VM既是客户机也是节点)。 步骤

  • 我对AWS上POD之间的跨集群通信有疑问。 我正在使用kubernetes在AWS上部署集群。两个星团位于同一区域和AZ。两个集群都部署在各自的VPC中,子网不重叠。我已经成功创建了VPC对等,以在两个VPC之间建立通信。VPC的仆从(实例)可以通过私有IP相互ping。 问题是,来自一个集群(VPC)的Kubernetes吊舱不能通过其内部IP ping另一个集群中的吊舱。我看到流量离开吊舱和仆

  • 我已经使用mongo k8s sidecar在kubernetes上提供了一个3成员副本集mongo集群。我需要在外部公开mongodb服务,因此创建了一个LoadBalancer。 这就是服务的样子 尝试使用mongodb shell 3.6进行连接,效果很好 但是在java客户端代码中,我看到了下面的异常。< code > Java . net . unknown hostexception:

  • 什么起作用了? 使用Helm(启用RBAC)部署入口控制器 集群IP服务部署 什么不起作用? null K8S入口 注释中最后应用的配置(入口描述输出)显示入口资源清单。但是,我贴在下面作为参考 附加信息 null 任何关于我可能做错了什么的建议或见解将非常感谢。