GKE中使用预留IP暴露Deployment无法访问问题排查
一、无法通过预留IP访问应用的可能原因
1. 预留IP区域与GKE集群区域不匹配
你创建的预留IP区域为us-west1,若GKE集群部署在其他区域(如us-west2),LoadBalancer Service将无法绑定该IP。需确认集群区域与预留IP区域完全一致。
2. Service配置的loadBalancerIP与实际预留IP不符
执行以下命令核对预留IP的实际值:
gcloud compute addresses describe graph-service-2-ip --region us-west1
检查输出中的address字段是否为35.212.191.164,若不一致,需修正Service YAML中的loadBalancerIP值。
3. 防火墙规则未允许外部流量
GKE通常会自动为LoadBalancer Service创建允许80端口的防火墙规则,但规则可能被手动修改或未生成。检查是否存在匹配集群节点标签的防火墙规则:
gcloud compute firewall-rules list --filter="name~gke-.*-lb"
确保规则允许0.0.0.0/0访问80端口。
4. Service端点未正确关联Pod
执行命令检查Service与Pod的关联状态:
kubectl get endpoints graph-service-2-service
若ENDPOINTS字段为空,需排查Pod标签与Service selector是否完全匹配(注意拼写、大小写)。
5. 应用未正确监听8080端口
进入Pod内部验证应用状态:
# 检查应用是否可访问 kubectl exec -it <pod-name> -- curl localhost:8080 # 检查端口监听情况 kubectl exec -it <pod-name> -- netstat -tulpn | grep 8080
若应用未监听8080端口,需修正应用配置或镜像。
二、部署架构优化建议
1. 配置健康检查
在Deployment的容器中添加存活探针和就绪探针,确保只有健康的Pod才会接收流量:
containers: - name: graph-service-container image: gcr.io/myimage:latest ports: - containerPort: 8080 livenessProbe: httpGet: path: /healthz # 替换为你的应用健康检查路径 port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 periodSeconds: 5
2. 使用Ingress替代直接LoadBalancer Service
当需要暴露多个服务时,Ingress可统一管理域名、SSL证书和路由规则,减少LoadBalancer资源开销。示例配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: graph-service-ingress annotations: kubernetes.io/ingress.class: "gce" spec: tls: - hosts: - your-domain.com secretName: your-tls-secret rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: graph-service-2-service port: number: 80
3. 启用Pod中断预算(PDB)
防止集群维护(如节点升级)时服务完全不可用:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: graph-service-pdb spec: minAvailable: 1 # 至少保留1个可用Pod selector: matchLabels: app: graph-service-2 tier: web
4. 使用版本化镜像
避免使用latest标签,改用具体版本号(如gcr.io/myimage:v1.0.0),便于回滚和追踪镜像版本。
5. 配置资源配额与限制
在Namespace级别设置资源配额,防止单个服务占用过多集群资源:
apiVersion: v1 kind: ResourceQuota metadata: name: namespace-quota spec: hard: pods: "10" requests.cpu: "4" requests.memory: "8Gi" limits.cpu: "8" limits.memory: "16Gi"
6. 启用日志与监控
配置Cloud Logging和Cloud Monitoring收集应用日志与指标,实时监控服务状态,快速排查问题。
内容的提问来源于stack exchange,提问作者Hassu

