如何从部署虚拟机外部访问K8s集群应用?Ingress/NodePort访问失败求解
解决方案
1. 修复Ingress配置的语法错误
你的Ingress YAML存在缩进错误,name字段必须嵌套在service层级下,Kubernetes无法解析原配置。修正后的完整配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - http: paths: - path: /testpath pathType: Prefix backend: service: name: market port: number: 8080
2. 验证核心依赖
- 确认
marketService已正确创建:- Service的
selector必须匹配Pod的标签(比如app: market) - Service的
targetPort要和Pod实际监听的端口一致(需对应Ingress中指定的8080)
- Service的
- 确认集群已部署NGINX Ingress Controller:
执行以下命令检查Ingress Controller Pod状态:
如果没有部署,通过Kubernetes官方提供的NGINX Ingress Controller静态部署清单完成安装,执行对应版本的部署命令即可。kubectl get pods -n ingress-nginx
3. 排查连通性
- 检查Ingress资源状态,确认已分配访问地址:
输出的kubectl get ingress test-ingressADDRESS字段应为Ingress Controller的公网IP或绑定的域名 - 测试Service到Pod的连通性:
在集群内任意运行的Pod中执行:
若返回应用响应,说明Service与Pod的链路正常curl market:8080
4. NodePort方式的快速验证
如果想改用NodePort直接访问:
- 将
marketService修改为NodePort类型:apiVersion: v1 kind: Service metadata: name: market spec: type: NodePort selector: app: market # 替换为你的Pod标签 ports: - port: 8080 targetPort: 8080 nodePort: 30000 # 可选,端口范围需在30000-32767之间 - 确保集群节点的公网IP开放了对应的NodePort端口(防火墙/安全组需放行)
- 访问路径:
<节点公网IP>:<NodePort>/testpath
5. 最终访问方式
- Ingress方式:修复配置并确认Ingress Controller正常后,访问
<Ingress公网IP>/testpath(若绑定域名,需将域名解析到Ingress的ADDRESS) - NodePort方式:直接访问
<节点公网IP>:<NodePort>/testpath
内容的提问来源于stack exchange,提问作者Sallex
相关产品推荐
相关产品推荐

