Kubernetes,法兰绒和揭露服务

我有一个kubernetes设置运行很好,但我似乎无法公开外部服务。 我在想我的networking设置不正确:

kubernetes服务地址:–service-cluster-ip-range = 172.16.0.1 / 16

法兰绒networkingconfiguration:etcdctl get /test.lan/network/config {“Network”:“172.17.0.0/16”}

docker子网设置:–bip = 10.0.0.1 / 24

主机节点IP:192.168.4.57

我已经运行了nginx服务,并试图像这样暴露它:

[root@kubemaster ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-px6uy 1/1 Running 0 4m [root@kubemaster ~]# kubectl get services NAME LABELS SELECTOR IP(S) PORT(S) AGE kubernetes component=apiserver,provider=kubernetes <none> 172.16.0.1 443/TCP 31m nginx run=nginx run=nginx 172.16.84.166 9000/TCP 3m 

然后我暴露了这样的服务:

 kubectl expose rc nginx --port=9000 --target-port=9000 --type=NodePort NAME LABELS SELECTOR IP(S) PORT(S) AGE nginx run=nginx run=nginx 9000/TCP 292y 

我期望现在能够到达hostnodes IP(192.168.4.57)上的nginx容器 – 我误解了networking? 如果我有,可以解释将明白:(

注意:这是在没有提供云提供商负载均衡器的物理硬件上,所以NodePort是我唯一的select,我想呢?

所以这里的问题是当你使用nodePort的时候,有一个小小的问题。

我也在命令中犯了一个错误。

首先,你需要确保你公开正确的端口,在这个例子中是80的nginx:

 kubectl expose rc nginx --port=80 --type=NodePort 

其次,你需要使用kubectl describe svc nginx ,它会告诉你它在每个节点上分配的NodePort:

 [root@kubemaster ~]# kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx Selector: run=nginx Type: NodePort IP: 172.16.92.8 Port: <unnamed> 80/TCP NodePort: <unnamed> 32033/TCP Endpoints: 10.0.0.126:80,10.0.0.127:80,10.0.0.128:80 Session Affinity: None No events. 

你当然可以在部署时指定一个,但是在使用随机分配的端口时,我却错过了这个信息。

是的,你需要使用NodePort。 当你点击服务时,destPort应该等于NodePort。 服务的destIP应该被节点认为是本地的。 例如,您可以使用其中一个节点的hostIP。

负载平衡器有助于处理节点发生故障的情况,但其他节点仍然可以处理该服务。

如果您在裸机上运行集群,或者在提供负载平衡器的提供程序上运行集群,则还可以将该端口定义为您的pod上的hostPort

你定义你的容器和端口

 containers: - name: ningx image: nginx ports: - containerPort: 80 hostPort: 80 name: http 

这将绑定容器到主机networking并使用定义的端口。

这里的2个限制显然是:1)每个主机上最多只能有一个这种豆荚。 2)IP是它绑定的节点的主机IP

这实质上是云供应商负载平衡器如何工作的方式。

通过使用新的DaemonSetfunction,可以定义吊舱所在的节点并修复IP。 但是,这必然会影响高可用性方面,但是在某些时候,没有太多的select,因为DNS负载平衡不会避免转发到死亡节点