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
相关产品推荐
相关产品推荐

