在 Kubernetes 中,外网无法访问集群服务通常由以下原因导致。请按步骤排查:
1. 确认 Service 类型是否正确
- 问题:服务类型必须是
NodePort
或LoadBalancer
才能从外网访问。 - 检查:
kubectl get svc <service-name>
- 解决:
- 修改为
NodePort
:kubectl patch svc <service-name> -p '{"spec":{"type":"NodePort"}}'
- 或修改为
LoadBalancer
(云环境适用):spec:type: LoadBalancer
- 修改为
2. 检查 NodePort 端口范围
- 问题:NodePort 默认端口范围为
30000-32767
,需确保外网能访问该端口。 - 检查:
kubectl get svc <service-name> -o yaml | grep nodePort
- 解决:
- 访问格式:
http://<节点公网IP>:<NodePort>
- 若需固定端口(如
31000
):spec:ports:- port: 80nodePort: 31000 # 手动指定
- 访问格式:
3. 验证防火墙/安全组规则
- 问题:节点安全组或防火墙未开放 NodePort 端口。
- 解决:
- 云服务商(如 AWS、阿里云):
- 检查安全组规则,允许外网访问
30000-32767
端口。
- 检查安全组规则,允许外网访问
- 本地集群:
# 开放端口(以 31000 为例) sudo ufw allow 31000
- 云服务商(如 AWS、阿里云):
4. 确认 Pod 状态和 Endpoints
- 问题:Pod 未运行或 Service 未关联到 Pod。
- 检查:
kubectl get pods -l app=<pod-label> # 确认 Pod 状态 kubectl describe svc <service-name> # 查看 Endpoints
- 解决:
- 确保 Pod 的
labels
与 Service 的selector
匹配:# Service 配置 spec:selector:app: my-app # 必须与 Pod 标签一致
- 确保 Pod 的
5. 使用 Ingress 控制器
- 问题:需通过 Ingress 暴露 HTTP/HTTPS 服务。
- 解决:
- 安装 Ingress 控制器(如 Nginx Ingress):
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
- 创建 Ingress 规则:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: my-ingress spec:rules:- host: mydomain.comhttp:paths:- path: /pathType: Prefixbackend:service:name: <service-name>port:number: 80
- 访问:
http://mydomain.com
(需将域名解析到集群节点 IP 或负载均衡器 IP)。
- 安装 Ingress 控制器(如 Nginx Ingress):
6. 云服务商负载均衡器问题
- 问题:
LoadBalancer
类型服务未正确分配外部 IP。 - 检查:
kubectl get svc <service-name> # 查看 EXTERNAL-IP 是否显示为 <pending>
- 解决:
- 检查云平台负载均衡器配置。
- 确保集群位于支持
LoadBalancer
的环境中(如 AWS、GCP、阿里云)。
7. 网络插件配置
- 问题:网络插件(如 Calico、Flannel)配置错误。
- 检查:
kubectl get pods -n kube-system # 确认网络插件运行正常
- 解决:
- 重新初始化网络插件:
kubectl apply -f <network-plugin-manifest.yaml>
- 重新初始化网络插件:
8. 临时调试:端口转发
- 快速验证服务是否正常:
访问kubectl port-forward svc/<service-name> 8080:80
http://localhost:8080
,若成功则问题出在服务暴露环节。
总结排查流程:
- 确认 Service 类型 → 2. 检查 NodePort 和防火墙 → 3. 验证 Pod/Endpoints → 4. Ingress 或云负载均衡器 → 5. 网络插件。
根据您的环境(云服务/本地集群)选择对应策略,优先确保 Service
类型和端口开放正确。