Kubernetes外部访问容器中的应用程序

Suv*_*ica 0 centos iptables google-cloud-platform kubernetes

我在Digital Ocean上的群集上使用了kubernates.

我在Pod中的容器内部有应用程序.我需要与此应用程序建立外部连接.我需要访问具体实例(因为我有超过10个Pod与此应用程序).

所以,我的问题是:我如何进行外部访问这个应用程序.

例如,我有公共IP 192.168.9.9

并有2个pod实例.首先监听端口8990,它的Pod IP是10.0.0.1,第二个监听端口8991,它的Pod IP是10.0.0.1.

因此,我需要将流量从192.168.9.9:8990重定向到10.0.0.1:8990和192.168.9.9:8991到10.0.0.1:8991.

是的,我可以通过手动使用iptables来实现.但我想自动完成.当新的Pod启动时,我想在iptables中创建记录.

我可以使用api来监视服务:

127.0.0.1:8080/api/v1beta1/watch/services
Run Code Online (Sandbox Code Playgroud)

并且可以在这里获取pod的ip:

127.0.0.1:8080/api/v1beta1/pods
Run Code Online (Sandbox Code Playgroud)

我找到了解决方案,在这里做了类似于我的需求.但看起来糟糕的建筑决策.在新的Pod启动后,是否有更好的方法将外部流量重定向到pod?

lar*_*sks 6

如果您的公共IP是在您的一个小兵的接口上配置的,那么您需要做的就是publicIPs在服务描述中设置值.例如,如果您定义这样的服务:

kind: Service
apiVersion: v1beta1
id: test-web
port: 8888
selector:
  name: test-web
containerPort: 80
publicIPs:
  - 192.168.1.43
Run Code Online (Sandbox Code Playgroud)

然后Kubernetes会创建像这样的iptables规则:

-A KUBE-PORTALS-CONTAINER -d 192.168.1.43/32 -p tcp -m comment --comment test-web -m tcp --dport 8888 -j REDIRECT --to-ports 38541
-A KUBE-PORTALS-HOST -d 192.168.1.43/32 -p tcp -m comment --comment test-web -m tcp --dport 8888 -j DNAT --to-destination 192.168.1.20:38541
Run Code Online (Sandbox Code Playgroud)

这些规则将流量重定向到您的publicIP端口,并将端口重定向到本地kube-proxy实例维护的相应端口.我只写了kiwi(我很抱歉你不喜欢它!)来提供动态分配公共IP地址的机制.只要您不介意在接口上预先配置地址,就应该全部设置.