如何在没有硬编码到minion IP的情况下向公众公开kubernetes服务?

Mad*_*mme 22 kubernetes

我有一个运行2个小兵的kubernetes集群.目前,我通过两个步骤访问我的服务:

  1. 启动复制控制器和pod
  2. 获取minion IP(使用kubectl get minions)并将其设置为服务的publicIP.

向公众公开服务的建议做法是什么?我的方法似乎是错误的,因为我对单个minion IP-s的IP进行了硬编码.它似乎也绕过了kubernetes服务的负载平衡功能,因为客户端必须直接访问在各个minions上运行的服务.

要设置复制控制器和pod,我使用:

id: frontend-controller
kind: ReplicationController
apiVersion: v1beta1
desiredState:
  replicas: 2
  replicaSelector:
    name: frontend-pod
  podTemplate:
    desiredState:
      manifest:
        version: v1beta1
        id: frontend-pod
        containers:
          - name: sinatra-docker-demo
            image: madisn/sinatra_docker_demo
            ports:
              - name: http-server
                containerPort: 4567
    labels:
      name: frontend-pod
Run Code Online (Sandbox Code Playgroud)

要设置服务(在获得minion ip-s之后):

kind: Service
id: frontend-service
apiVersion: v1beta1
port: 8000
containerPort: http-server
selector:
  name: frontend-pod
labels:
  name: frontend
publicIPs: [10.245.1.3, 10.245.1.4]
Run Code Online (Sandbox Code Playgroud)

Rob*_*ley 8

正如我在上面的评论中提到的,createExternalLoadBalancer是您正在寻找的适当的抽象,但遗憾的是它尚未针对所有云提供程序实现,特别是对于您在本地使用的vagrant.

一种选择是将群集中所有minions的公共IP用于要外部化的所有服务.发往该服务的流量将最终出现在其中一个minions上,它将被kube-proxy进程拦截并重定向到与该服务的标签选择器匹配的pod.这可能会导致网络上的额外跳跃(如果您降落在没有本地运行的pod的节点上),但对于对网络延迟不是非常敏感的应用程序,这可能不会引人注意.


小智 7

正如罗伯特在回答中所说,这是即将到来的事情,但遗憾的是还没有.

我目前正在数据中心网络上运行Kubernetes集群.我有1个主人和3个小兵都在CentOS 7虚拟机(vcenter)上运行.我处理这个问题的方法是创建一个专用的"kube-proxy"服务器.我基本上只是运行Kube-Proxy服务(连同Flannel用于网络),然后将"公共"IP地址分配给连接到此服务器的网络适配器.当我说公开时,我指的是我们本地数据中心网络上的地址.然后,当我创建一个我想在集群外部访问的服务时,我只需将publicIPs值设置为kube-proxy服务器上的一个可用IP地址.当某人或某物尝试从群集外部连接到此服务时,它将命中kube-proxy,然后被重定向到正确的minion.

虽然这似乎是一种解决方法,但这实际上与我们预期在他们提出针对此问题的内置解决方案时所期望的相似.