如何排查MicroK8S集群中NodePort拒绝外部连接的问题?
嗨,看起来你在重建MicroK8S集群后遇到了NodePort服务无法对外提供访问的问题,我帮你梳理几个实用的排查步骤,先从最可能的核心问题入手:
1. 先检查Service和Pod的标签匹配!(这是最常见的坑)
你看你的NodePort Service里配置的selector是run: k8s-workload,但你的Pod的metadata里没有这个标签啊!Kubernetes的Service是靠标签来找到要转发流量的Pod的,标签不匹配的话,Service根本不知道要把流量发给谁,自然不会在节点上启动对应的端口监听。
解决方法很简单:给Pod加上对应的标签就行,修改你的Pod YAML文件,在metadata里新增labels字段:
apiVersion: v1 kind: Pod metadata: name: k8s-workload labels: # 新增这部分标签,和Service的selector对应 run: k8s-workload annotations: # 原注释内容保持不变 spec: # 原spec内容保持不变
修改后重新应用Pod和Service,然后用microk8s kubectl describe service np-service查看输出里的Endpoints字段,如果显示了你的Pod IP(10.1.134.193),说明标签匹配成功了,这时候再去测试NodePort的连接应该就有戏了。
2. 验证NodePort端口是否真的在节点上监听
登录到任意集群节点,执行以下命令检查30090端口的监听状态:
sudo ss -tulpn | grep 30090
如果输出里看不到kube-proxy进程在监听这个端口,那要么是Service没关联到Pod,要么是kube-proxy组件出了问题。如果是后者,可以试试重启kube-proxy:
microk8s kubectl rollout restart daemonset/kube-proxy -n kube-system
3. 查看kube-proxy的日志找线索
虽然不能直接查看Service的日志,但NodePort的转发逻辑是由kube-proxy实现的,你可以查看它的日志来排查问题:
首先找到kube-proxy的Pod:
microk8s kubectl get pods -n kube-system | grep kube-proxy
然后查看对应Pod的日志:
microk8s kubectl logs <kube-proxy-pod的名称> -n kube-system
看看日志里有没有关于端口监听失败、端点转发错误的信息,这些能帮你定位具体问题。
4. 移除不必要的externalIPs配置
你在Service里加了externalIPs: [192.168.50.251],这个配置会让Service只在指定的外部IP上监听,反而可能干扰NodePort原本“在所有节点端口监听”的功能。建议先把这行删掉,重新应用Service后再测试连接。
5. 确认MicroK8S的NodePort端口范围
MicroK8S默认的NodePort端口范围是30000-32767,你的30090在这个范围内,这点是没问题的,但如果实在不确定,可以检查一下集群配置:
microk8s kubectl get configmap kube-proxy -n kube-system -o yaml
看看里面的nodePort相关配置是否正常。
备注:内容来源于stack exchange,提问作者halfer

