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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:37:02