Kubernetes NodePort服务无法跨节点访问及负载均衡问题求助
Kubernetes NodePort服务无法跨节点访问问题解决
我是Kubernetes初学者,已搭建1主2从集群,所有Pod运行正常,Nginx演示应用部署成功,但遇到以下问题:当副本数不等于集群节点数时,通过NodePort暴露端口后,仅能在Pod所在节点访问该端口,其他节点访问超时。
我的配置与测试信息
nginx-demo.yaml
# nginx-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 1 selector: matchLabels: app: my-nginx template: metadata: labels: app: my-nginx spec: hostNetwork: true containers: - name: my-nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-nginx labels: app: my-nginx spec: type: NodePort ports: - port: 80 protocol: TCP name: http targetPort: my-nginx nodePort: 30222 selector: app: my-nginx
hosts配置
# 192.168.64.129 127.0.0.1 k8smaster 192.168.64.130 k8snode1 192.168.64.131 k8snode2
测试命令及结果
[root@k8snode1 ~]# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d20h <none> my-nginx NodePort 10.104.78.46 <none> 80:30222/TCP 10m app=my-nginx # 当Pod运行在k8snode1时 [root@k8snode1 ~]# curl k8smaster:30222 # 超时 [root@k8snode1 ~]# curl k8snode1:30222 # 成功返回Nginx页面 [root@k8snode1 ~]# curl k8snode2:30222 # 超时
问题原因分析
Service的targetPort配置错误:Service中指定的
targetPort: my-nginx没有对应的端口定义,Pod的容器端口仅设置了containerPort: 80,并未命名为my-nginx,导致Service无法正确将流量转发到Pod的端口。Pod启用hostNetwork导致转发失效:开启
hostNetwork: true后,Pod直接使用节点的网络栈,Kubernetes的kube-proxy无法通过集群Overlay网络将其他节点的NodePort流量转发到该Pod,只能在Pod所在节点直接访问端口。
修复方案
修正后的配置文件
# nginx-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 1 selector: matchLabels: app: my-nginx template: metadata: labels: app: my-nginx spec: # 移除hostNetwork: true,使用K8s默认的Pod网络 containers: - name: my-nginx image: nginx ports: - containerPort: 80 name: http # 可选:给端口命名,方便Service引用 --- apiVersion: v1 kind: Service metadata: name: my-nginx labels: app: my-nginx spec: type: NodePort ports: - port: 80 protocol: TCP name: http targetPort: 80 # 修正为容器实际监听的端口号 nodePort: 30222 selector: app: my-nginx
操作步骤
- 删除原有资源:
kubectl delete -f nginx-demo.yaml
- 应用修正后的配置:
kubectl apply -f nginx-demo.yaml
- 等待Pod启动完成后,在任意节点执行测试:
curl k8smaster:30222 # 应成功返回Nginx页面 curl k8snode1:30222 # 应成功返回Nginx页面 curl k8snode2:30222 # 应成功返回Nginx页面
补充说明
- 若确实需要使用
hostNetwork: true(如特殊场景要求Pod直接使用节点网络),需确保集群kube-proxy模式支持该场景,同时手动在所有节点开放对应端口,并依赖外部负载均衡器实现跨节点流量转发,但这不符合K8s Service的设计逻辑,不推荐初学者使用。 - NodePort服务的正常负载均衡依赖K8s集群网络(如Flannel、Calico)和kube-proxy的转发规则,需确保集群网络连通性正常。
内容的提问来源于stack exchange,提问作者jiuli
相关产品推荐
相关产品推荐

