我有一个运行良好的kubernetes设置,但我似乎无法在外部公开服务。我认为我的网络设置不正确:
kubernetes服务地址: - service-cluster-ip-range = 172.16.0.1 / 16
法兰绒网络配置:etcdctl get /test.lan/network/config {“网络”:“172.17.0.0/16”}
docker subnet setting:--bip = 10.0.0.1 / 24
Hostnode 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容器 - 我误解了网络吗?如果我有,可以解释一下:(
注意:这是在物理硬件上没有云提供商提供的负载均衡器,所以我认为NodePort是我唯一的选择吗?
答案 0 :(得分:2)
所以这里的问题是当你使用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.
您当然可以在部署时分配一个,但在使用随机分配的端口时我错过了这个信息。
答案 1 :(得分:1)
负载均衡器有帮助,因为它可以处理节点出现故障的情况,但其他节点仍然可以处理服务..
答案 2 :(得分:1)
如果您在裸机上运行群集或不在提供负载均衡器的提供商处运行群集,您还可以将端口定义为您的pod上的hostPort
定义容器和端口
containers:
- name: ningx
image: nginx
ports:
- containerPort: 80
hostPort: 80
name: http
这会将容器绑定到主机网络并使用定义的端口。
这里的2个限制显然是: 1)每个主机上最多只能有一个这样的pod。 2)IP是它绑定的节点的主机IP
这主要是云提供商负载均衡器的工作方式。
使用新的DaemonSet
功能,可以定义pod将登陆的节点并修复IP。但是,这必然会影响高可用性方面,但在某些时候没有太多选择,因为DNS负载平衡不会避免转发到死节点