Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 在没有自定义代理的情况下将状态集中的每个pod公开到internet_Kubernetes_Google Kubernetes Engine_Kubernetes Ingress - Fatal编程技术网

Kubernetes 在没有自定义代理的情况下将状态集中的每个pod公开到internet

Kubernetes 在没有自定义代理的情况下将状态集中的每个pod公开到internet,kubernetes,google-kubernetes-engine,kubernetes-ingress,Kubernetes,Google Kubernetes Engine,Kubernetes Ingress,我有一个状态集,其中包含PODserver-0,server-1,等等。我想使用类似server-0.mydomain.com或类似mydomain.com/server-0的URL将它们直接公开到internet 我希望能够扩展StatefulSet并自动从internet访问新的播客。例如,如果我将其放大到包含一个server-2,我希望mydomain.com/server-2在新pod准备就绪时将请求路由到新pod。我不想为了达到这个效果,还需要扩展其他资源或创建其他服务 我可以通过一个

我有一个状态集,其中包含POD
server-0
server-1
,等等。我想使用类似server-0.mydomain.com或类似mydomain.com/server-0的URL将它们直接公开到internet

我希望能够扩展StatefulSet并自动从internet访问新的播客。例如,如果我将其放大到包含一个
server-2
,我希望mydomain.com/server-2在新pod准备就绪时将请求路由到新pod。我不想为了达到这个效果,还需要扩展其他资源或创建其他服务

我可以通过一个定制的代理服务来实现这一点,该服务只需检查请求路径并在内部转发到正确的pod,但这似乎容易出错,而且浪费资源


有没有办法让入口自动路由到一个StatefulSet中的不同pod,或者其他一些内置技术可以避免定制代码?

我认为你做不到。作为同一状态集的一部分,pod-x之前的所有pod都是服务的目标。由于您无法定义哪个pod将获得请求,因此无法强制将“pod-1.yourapp.com”或“yourapp.com/pod-1”发送到pod-1。它将被发送到服务,服务可能会将其发送到pod-4

即使可以,您也需要动态更新您的入口规则,这很容易导致停机几分钟


使用自定义代理,我认为这也不可能。请注意,它需要基本上替换POD后面的服务。如果您的入口控制器知道它需要将数据包传送到服务,那么现在您必须强制它传送到您的代理。但是如何实现呢?

Kubernetes服务是一组iptables(或IPV)规则,它将使用ServiceIP作为目标地址的数据包重定向到具有相同标签的POD之一

该服务安装用于选择后端Pod的iptables规则。默认情况下,后端的选择是随机的

这是指服务无法区分同一集中的不同POD

如果您想通过更改iprules(相当简单)或添加任何类型的代理来强制从集合中选择特定的Pod,这是有问题的: 假设您将
pod-1
pod-2
1.1.1
1.1.1.2
分别配置为
pod-1.myserver.com
1.1.1
),并将iptables规则配置为目标为
pod-2的DNAT请求。(你可能会问为什么要使用IP,原因很简单,因为这是区分这些豆荚的唯一方法)
每当pod重新启动时,这种方法就会失败,比如pod-1失败,Kubernetes不会用相同的IP和名称重新创建相同的pod,而是用不同的IP创建pod-3并相应地更新iptables。因此,在您再次更新代理或iptables之前,所有指向1.1.1.1的数据包都将被丢弃

事实上,这就是为什么我们使用服务访问Pod而不是直接访问它们的原因之一,因为Pod IP可以改变,而服务IP不会改变

然而,由于kubernetes的这一非常具体的部分是我在过去4个月的工作,我开发了一个用于编辑iptables和选择特定pod的程序,我的结论是这项工作成本高且耗时,当pod发生变化时,服务器将被迫离线几秒钟,您可以查看代码,它确实有效,但不推荐使用

这个问题是一个kubernetes问题,解决方案是更改Kube代理的源代码,这是我目前的工作


我建议您阅读我的回答,解释kubernetes服务在这个问题上的具体工作方式:

感谢您的深入回答。有了状态集,我相信Pod将以完全相同的名称重新创建,因此我至少应该能够可靠地代理它们(尽管当Pod关闭时,连接当然会失败)。即使Pod处于状态集,重新调度的Pod的Ip地址也会更改,根据名称,您将如何前进,你是说使用DNS?是的,没错,使用DNS。我以前没有这样做过,所以这只是一个想法,但它似乎应该可以工作?我正在想象一个简单的代理服务,它读取请求的url并决定代理到哪个pod。这应该是简单的pod dns名称,对吗?入口->代理服务->代理盒->服务器-3.my-namespace.svc.cluster.local右键?