我有一个运行良好的kubernetes设置,但我似乎无法从外部公开服务 . 我在想我的网络设置不正确:
kubernetes服务地址: - service-cluster-ip-range = 172.16.0.1 / 16
法兰绒网络配置:etcdctl get /test.lan/network/config {“Network”:“172.17.0.0/16”}
docker subnet setting:--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
我现在希望能够访问主机节点IP(192.168.4.57)上的nginx容器 - 我误解了网络吗?如果我有,可以解释将是赞赏:(
注意:这是在物理硬件上没有 Cloud 提供商提供的负载均衡器,所以我认为NodePort是我唯一的选择吗?
3 回答
所以这里的问题是当你使用nodePort时,这个谜题有一个缺失 .
我的命令也犯了错误 .
首先,您需要确保公开正确的端口,在本例中为80,用于nginx:
其次,您需要使用
kubectl describe svc nginx
并在每个节点上分配'll show you the NodePort it':您当然可以在部署时分配一个,但在使用随机分配的端口时我错过了此信息 .
是的,您需要使用NodePort . 当您点击服务时,destPort应该等于NodePort . 服务的destIP应该被节点视为本地的 . 例如 . 你可以使用其中一个节点的hostIP ..
负载均衡器有帮助,因为它可以处理节点出现故障的情况,但其他节点仍然可以处理服务 .
如果您在裸机上运行群集或不在提供负载均衡器的提供程序上运行群集,您还可以将端口定义为pod上的hostPort
您定义容器和端口
这会将容器绑定到主机网络并使用定义的端口 .
这里的2个限制显然是:1)每个主机上最多只能有一个这样的pod . 2)IP是它绑定的节点的主机IP
这实际上是 Cloud 提供商负载均衡器在某种程度上的工作方式 .
使用新的
DaemonSet
功能,可以定义pod将登陆的节点并修复IP . 但是,这必然会损害高可用性方面,但在某些时候没有太多选择,因为DNS负载 balancer 不会避免转发到死节点