我当前的k8s设置遇到问题。在生产中,我将每个服务的三个副本旋转起来,并将它们放在一个容器中。当Pod相互交谈时,我们希望Pod以循环方式与Pod中的每个容器交谈。不幸的是,由于TLS保持活动状态,因此Pod之间的连接永远不会终止-我们不想专门更改该部分-但我们希望Pod中的每个容器都能正常通信。这就是我们现在所拥有的:
如果API试图与Pod OSS对话,它将仅与第一个容器对话。我希望API能够以循环方式与所有这三个对话。
我该怎么做?我知道我需要一个Ingress控制器,例如nginx。但是,有一些真正的教程可以分解我如何实现这一目标吗?我不确定,k8s有点新。任何帮助将不胜感激!
顺便说一下,我在minikube上本地工作。
编辑:
在生产中,我们启动每个服务的三个副本。当服务A
需要与服务B
通话时,就会选择服务B1
中的广告连播B
,并管理收到的任何请求。但是,该容器B1
成为服务B
中处理任何通信的唯一容器;换句话说,荚B2
和B3
从不说话。我正在尝试使用nginx解决此问题,因为似乎我们需要负载均衡器来帮助解决此问题,但是我不确定如何做到这一点。谁能提供一些有关需要做什么的详细解释?具体而言,与现在仅使用一个Pod的情况不同,如何与服务一起设置nginx,以便将所有Pod都用于服务(以某种循环方式)?这是一个问题,因为在生产中,当我们有另外两个吊舱无所事事时,一个吊舱超载了请求并死亡。我在minikube上本地开发。
答案 0 :(得分:2)
我假设您的pod下方有一个微服务架构,对吗?您是否考虑过在Kubernetes中使用Istio?它是由Google,IBM和Lyft开源开发的,目的是为开发人员提供一种与供应商无关的方式(这似乎是您想要的),以连接,保护,管理和监视云平台上不同微服务的网络。 (AWS,Azure,Google等)。
从高层次上讲,Istio有助于降低这些复杂性 部署,并减轻开发团队的负担。它是一个 完全透明的完全开源的服务网格 现有的分布式应用程序。它也是一个平台,包括 允许其集成到任何日志记录平台,遥测或 政策体系。 Istio的多样化功能集可让您成功完成工作,并且 高效地运行分布式微服务架构,并提供 一种安全,连接和监视微服务的统一方法。
这是link to Istio's documentation,详细说明了如何设置多集群环境,这正是您要寻找的。 p>
我想强调文档中的一条注释-可能与您的问题有关
由于Kubernetes Pod没有稳定的IP,请重新启动任何Istio 控制平面集群中的服务Pod将导致其端点为 改变了。因此,从远程群集到该群集的任何连接 端点将被破坏。 Istio issue #4822中对此进行了记录。
有 有许多避免或解决此情况的方法。这个 部分提供了这些选项的高级概述。
- 更新DNS条目
- 使用负载均衡器服务类型
- 通过网关公开Istio服务
我引用了负载均衡器解决方案,因为这似乎是您想要的:
在Kubernetes中,您可以将服务类型声明为
LoadBalancer
。解决Pod重新启动问题的一种简单方法是使用 Istio服务的负载均衡器。然后可以使用负载 平衡器IP作为Istio服务的端点IP,以配置 远程集群。
希望对您有帮助,如果您有任何疑问,请射击!
答案 1 :(得分:0)
提到了一个非常简单的示例,说明如何使用Kubernetes服务平衡后端Pod。here
您的副本应该由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中平均分配。
在您的情况下,您可能想看看创建吊舱和服务的方式。确保您正确设置服务的一种方法是通过运行以下命令,结果应为您提供多个ENDPOINTS,即:指向您的各个副本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入口感兴趣,那么this将是一个不错的开始。但是,在kubernetes服务中使用一个简单的LoadBalancer即可满足您当前的需求