You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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   # 超时

问题原因分析

  1. Service的targetPort配置错误:Service中指定的targetPort: my-nginx没有对应的端口定义,Pod的容器端口仅设置了containerPort: 80,并未命名为my-nginx,导致Service无法正确将流量转发到Pod的端口。

  2. 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

操作步骤

  1. 删除原有资源:
kubectl delete -f nginx-demo.yaml
  1. 应用修正后的配置:
kubectl apply -f nginx-demo.yaml
  1. 等待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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:40:36