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

GCP区域GKE集群+NEG+HTTP负载均衡的配置痛点与自动化诉求

感谢Gabriel Hodoroaga及其教程,我们在GCP中实现了以下流量链路配置:

互联网 > HTTP负载均衡器 > 网络端点组(NEG) > 单可用区GKE > NGINX入口控制器(ingress-nginx)

但将GKE从单可用区切换为区域集群后,通过gcloud命令手动重建配置存在两大问题:

  • 仅初始部署有效,ingress-nginx Pod重启迁移至其他可用区后连接中断,需手动重新关联正确的NEG;
  • 现有环境不使用gcloud命令,需通过GitHub Actions结合Terraform完成配置。

初始部署后配置正常运行,重启ingress-nginx Pod后,Pod迁移至其他可用区,后端仍绑定原NEG。

以下是基于Gabriel Hodoroaga教程的完整手动配置步骤(中文适配版):


GCP - HTTP负载均衡器 > NEG > 区域GKE集群 > NGINX入口控制器

变量配置

至少需替换YOURDOMAIN变量为实际域名。

CLUSTER_NAME="lb-negs-nging-reg"
REGION="europe-west2"
YOURDOMAIN="请替换为你的域名"
echo $CLUSTER_NAME ; echo $REGION ; echo $YOURDOMAIN

创建集群

gcloud container clusters create $CLUSTER_NAME --region $REGION --machine-type "e2-medium" --enable-ip-alias --num-nodes=2 

添加ingress-nginx Helm仓库

helm repo update
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

安装ingress-nginx

先创建values.regional.yaml配置文件:

cat << EOF > values.regional.yaml
controller:
  service:
    type: ClusterIP
    annotations:
      cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "ingress-nginx-80-neg"}}}'
EOF

执行Helm安装命令:

helm install -f values.regional.yaml ingress-nginx ingress-nginx/ingress-nginx

部署测试用Web服务

准备测试服务配置文件dummy-app-lightweb.yaml:

cat << EOF > dummy-app-lightweb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: lightweb
spec:
  selector:
    matchLabels:
      app: dummy
  replicas: 3
  template:
    metadata:
      labels:
        app: dummy
    spec:
      containers:
      - name: lightweb
        image: alastairhm/alpine-lighttpd-php
        ports:
        - name: http
          containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", 'wget https://raw.githubusercontent.com/robinpecha/hello-world/main/php-header/index.php -P /var/www/']
---
apiVersion: v1
kind: Service
metadata:
  name: dummy-service
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: dummy
EOF

应用配置到集群:

kubectl apply -f dummy-app-lightweb.yaml 

验证测试服务状态:

kubectl get pods
kubectl port-forward lightweb-???????????-???? 8080:80
# 在浏览器访问 http://localhost:8080
# 按Ctrl+C停止端口转发

创建Ingress对象

准备Ingress配置文件dummy-ingress.yaml,需将域名DNS指向后续生成的负载均衡IP或修改本地hosts:

cat << EOF > dummy-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dummy-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: "$YOURDOMAIN"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: dummy-service
            port:
              number: 80
EOF

应用Ingress配置:

kubectl apply -f dummy-ingress.yaml 

获取Ingress节点的网络标签和可用区

NETWORK_TAGS=$(gcloud compute instances list --filter="name=( $(kubectl get pod -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].spec.nodeName}') )" --format="value(tags.items[0])") ; echo $NETWORK_TAGS 
NODEZONE=$(gcloud compute instances list --filter="name=( $(kubectl get pod -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].spec.nodeName}') )" --format="value(zone)"); echo $NODEZONE 

配置防火墙规则

允许负载均衡源IP访问集群节点的80端口:

gcloud compute firewall-rules create $CLUSTER_NAME-lb-fw --allow tcp:80 --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags $NETWORK_TAGS 

添加健康检查配置

创建针对ingress-nginx的HTTP健康检查:

gcloud compute health-checks create http app-service-80-health-check --request-path /healthz --port 80 --check-interval 60 --unhealthy-threshold 3 --healthy-threshold 1 --timeout 5 

创建后端服务

关联健康检查并创建全局后端服务:

gcloud compute backend-services create $CLUSTER_NAME-lb-backend --health-checks app-service-80-health-check --port-name http --global --enable-cdn --connection-draining-timeout 300 

关联NEG至后端服务

将ingress-nginx对应的NEG绑定到后端服务:

gcloud compute backend-services add-backend $CLUSTER_NAME-lb-backend --network-endpoint-group=ingress-nginx-80-neg --network-endpoint-group-zone=$NODEZONE --balancing-mode=RATE --capacity-scaler=1.0 --max-rate-per-endpoint=1.0 --global 

配置前端组件

创建URL映射、目标代理和转发规则,完成负载均衡前端配置:

gcloud compute url-maps create $CLUSTER_NAME-url-map --default-service $CLUSTER_NAME-lb-backend 
gcloud compute target-http-proxies create $CLUSTER_NAME-http-proxy --url-map $CLUSTER_NAME-url-map 
gcloud compute forwarding-rules create $CLUSTER_NAME-forwarding-rule --global --ports 80 --target-http-proxy $CLUSTER_NAME-http-proxy 

启用日志记录

开启后端服务的访问日志:

gcloud compute backend-services update $CLUSTER_NAME-lb-backend --enable-logging --global 

测试验证

获取负载均衡IP并验证访问:

IP_ADDRESS=$(gcloud compute forwarding-rules describe $CLUSTER_NAME-forwarding-rule --global --format="value(IPAddress)") ; echo $IP_ADDRESS
curl -s -I http://$IP_ADDRESS/ # 返回404(无域名匹配)
curl -s -I http://$YOURDOMAIN/ # 返回200(正常访问)
清理资源

执行以下命令删除所有创建的资源:

gcloud -q compute forwarding-rules delete $CLUSTER_NAME-forwarding-rule --global 
gcloud -q compute target-http-proxies delete $CLUSTER_NAME-http-proxy 
gcloud -q compute url-maps delete $CLUSTER_NAME-url-map 
gcloud -q compute backend-services delete $CLUSTER_NAME-lb-backend --global
gcloud -q compute health-checks delete app-service-80-health-check
gcloud -q compute firewall-rules delete $CLUSTER_NAME-lb-fw 
kubectl delete -f dummy-ingress.yaml 
kubectl delete -f dummy-app-lightweb.yaml 
helm delete ingress-nginx 
gcloud -q container clusters delete $CLUSTER_NAME --zone=$ZONE
gcloud -q compute network-endpoint-groups delete ingress-nginx-80-neg --zone=$REGION-a
gcloud -q compute network-endpoint-groups delete ingress-nginx-80-neg --zone=$REGION-b
gcloud -q compute network-endpoint-groups delete ingress-nginx-80-neg --zone=$REGION-c
gcloud -q compute network-endpoint-groups list

内容的提问来源于stack exchange,提问作者rrob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:03:26