Nodeport
跳到导航
跳到搜索
原因和分析
(1)找到pod所在节点,从pod所在k8s节点上通过{nodeIp}:{nodePort}访问,如果访问不了,可能是pod或service没有成功部署; (2)从其它node节点通过{nodeIp}:{nodePort}访问,如果不能访问,执行 kubectl describe pod {podName} -n={namespace} 查看pod描述信息,找到pod ip,直接对着pod访问{podIp}:{containerPort},如果无法访问,尝试ping一下{podIp},如果ping不通,说明k8s节点之间docker容器网络不通,需要安装网络组件如flannel之类; (3)从master节点通过{nodeIp}:{nodePort}访问,如果node节点可以访问{nodePort}而master节点无法访问,执行 netstat -nlp | grep {nodePort} 查看{nodePort}端口是否有服务在监听,正常会看到类似: tcp6 0 0 :::30804 :::* LISTEN 3089/kube-proxy 说明nodePort 30804端口正在被kube-proxy服务在3089进程监听,如果没有则可能是没有启动kube-proxy服务,在k8s里面service相关的功能是依赖kube-proxy实现的。 master节点无须启动kubelet和kube-proxy服务,如果想从master节点访问service,可以在master节点上启动kube-proxy服务,如果想让pod调度到master节点,可以启动kubelet服务 或者master node also master 也当作node 这里的master hostname 为 ubuntu18OB evan@ubuntu18:~$ kubectl taint node ubuntu18 node-role.kubernetes.io/master- node/ubuntu18 untainted #master only kubectl taint node ubuntu18 node-role.kubernetes.io/master="":NoSchedule
现象
evan@k8s-master:~$ kubectl apply -f httpd-svc.yml service/httpd-svc created evan@k8s-master:~$ kubectl get service httpd-svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpd-svc NodePort 10.99.34.189 <none> 8080:31101/TCP 14s evan@k8s-master:~$ sudo netstat -nlpt | grep 31101 #用上master ip访问不了 不过我的master不是node evan@k8s-master:~$ curl 192.168.88.58:31101 curl: (7) Failed to connect to 192.168.88.58 port 31101: Connection refused evan@k8s-master:~$ curl 192.168.88.59:31101 <html><body><h1>It works!</h1></body></html>evan@k8s-master:~$ evan@k8s-master:~$ curl 192.168.88.60:31101 <html><body><h1>It works!</h1></body></html>evan@k8s-master:~$ evan@k8s-master:~$ sudo ps -ef | grep kube-prox evan 29440 14359 0 11:31 pts/0 00:00:00 grep --color=auto kube-prox evan@k8s-master:~$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-service NodePort 10.111.31.36 <none> 80:30046/TCP 3d4h evan@k8s-master:~$ kubectl delete deployments/nginx services/example-service service "example-service" deleted