原因和分析
(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
see also
kubernetes踩坑:nodePort拒绝访问的问题