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

Kubernetes中运行的Nginx Pod无法通过公网访问的问题求助

问题描述

我已经创建了Nginx的Deployment和Service配置文件,尝试通过网页浏览器访问运行中的Pod。实例已经开放所有流量,但通过公网DNS访问时无法连接。相关配置及资源状态信息如下:

nginx.yaml配置文件

# 注:原Deployment配置缺失必填的apiVersion和kind字段,已补充
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP

资源状态信息

Pod运行状态

kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6d5dd88d4c-2lh74   1/1     Running   0          26s

Service状态

kubectl get svc my-nginx
NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-nginx   NodePort   10.107.36.102   <none>        8080:31238/TCP   75s

问题分析与解决方法

1. 配置修复:补全Deployment必填字段

原Deployment配置缺少apiVersion: apps/v1和kind: Deployment,这是Kubernetes资源定义的必填项。虽然当前Pod已正常运行,但补全后能保证配置的规范性,避免后续操作出现异常。

2. NodePort服务的访问逻辑纠正

NodePort类型的Service不会分配公网IP(EXTERNAL-IP显示<none>是正常现象),它通过**集群节点的公网IP + 映射的NodePort端口(此处为31238)**对外暴露服务。你无法通过公网访问Service的ClusterIP(10.107.36.102),因为该IP仅在集群内部可见。

3. 正确访问步骤

  • 获取集群节点的公网IP:通过云控制台或执行kubectl get nodes -o wide查看节点的EXTERNAL-IP字段。
  • 直接用节点公网IP:31238在浏览器访问,即可连接到Nginx服务。
  • 若需通过公网DNS访问:将DNS域名解析记录指向节点的公网IP,之后通过你的域名:31238访问。

4. 优化方案(可选)

如果希望无需带端口号直接访问(如80端口),可以选择:

  • 使用LoadBalancer类型的Service(适用于云厂商托管的K8s集群,云平台会自动分配公网负载均衡IP)。
  • 部署Ingress控制器(如Nginx Ingress),通过Ingress资源配置域名路由,实现无端口访问。

内容的提问来源于stack exchange,提问作者Asif Vahora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:07:25