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

GKE环境下借助Pub/Sub推送订阅实现Pod间消息通信

在GKE多Pod环境配置Pub/Sub推送订阅的HTTPS服务步骤

我之前在GKE里搭建过基于Pub/Sub推送模式的消息收发系统,刚好踩过不少坑,给你拆解下具体的实现步骤:

1. 准备域名与DNS配置

首先得搞定域名相关的事情,这是HTTPS和Pub/Sub推送的基础:

  • 申请域名:选个你能管理的域名服务商注册域名,比如pubsub-demo.yourdomain.com。
  • 获取GKE入口IP:先创建一个临时Ingress或直接部署后续服务的Ingress,通过kubectl get ingress拿到它的外部IP地址。
  • 配置DNS解析:在域名服务商后台添加A记录,把你的域名指向刚才拿到的Ingress外部IP;如果用负载均衡CNAME,就配置对应CNAME记录。
  • 域名所有权验证:如果用Let's Encrypt或Google Managed证书,需要验证域名所有权。推荐用DNS验证,添加服务商要求的TXT记录到域名解析中,等待生效(一般几分钟到几小时)。

2. 配置SSL证书(用Cert-Manager自动管理)

在GKE里用Cert-Manager是最省心的证书管理方式,能自动签发和续期Let's Encrypt的免费证书:

  • 安装Cert-Manager:用Helm安装最方便,执行命令:
    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.13.0 --set installCRDs=true
    
  • 创建ClusterIssuer:创建cluster-issuer.yaml文件,用来和Let's Encrypt通信:
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-prod
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        email: your-email@example.com  # 替换成你的邮箱,接收证书到期提醒
        privateKeySecretRef:
          name: letsencrypt-prod
        solvers:
        - http01:
            ingress:
              class: gce  # GKE默认Ingress类
    
    执行kubectl apply -f cluster-issuer.yaml完成配置。
  • 验证Issuer状态:执行kubectl get clusterissuer letsencrypt-prod,看到Ready状态为True代表配置成功。

3. 部署HTTPS服务到GKE

接下来把消息接收服务部署成HTTPS可访问的服务:

  • 编写服务代码:比如用Python Flask写一个基础的接收端点(后续要加签名验证):
    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    @app.route('/pubsub/push', methods=['POST'])
    def pubsub_push():
        payload = request.get_json()
        # 后续添加Pub/Sub签名验证逻辑
        print(f"Received message: {payload}")
        return jsonify({"status": "ok"}), 200
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8080)
    
    把代码打包成Docker镜像,推送到Google Artifact Registry或GCR。
  • 创建Deployment和Service:编写app-deployment.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pubsub-receiver
    spec:
      replicas: 3  # 多Pod部署
      selector:
        matchLabels:
          app: pubsub-receiver
      template:
        metadata:
          labels:
            app: pubsub-receiver
        spec:
          containers:
          - name: receiver
            image: us-central1-docker.pkg.dev/your-project-id/your-repo/pubsub-receiver:v1  # 替换成你的镜像地址
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: pubsub-receiver-service
    spec:
      selector:
        app: pubsub-receiver
      ports:
      - port: 80
        targetPort: 8080
      type: ClusterIP
    
    执行kubectl apply -f app-deployment.yaml完成部署。
  • 配置Ingress并关联证书:编写ingress.yaml:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: pubsub-receiver-ingress
      annotations:
        cert-manager.io/cluster-issuer: letsencrypt-prod  # 关联之前的ClusterIssuer
    spec:
      tls:
      - hosts:
        - pubsub-demo.yourdomain.com  # 替换成你的域名
        secretName: pubsub-receiver-tls  # 证书会自动存入该Secret
      rules:
      - host: pubsub-demo.yourdomain.com
        http:
          paths:
          - path: /pubsub/push
            pathType: Prefix
            backend:
              service:
                name: pubsub-receiver-service
                port:
                  number: 80
    
    执行kubectl apply -f ingress.yaml,等待几分钟,Cert-Manager会自动签发证书,Ingress也会完成HTTPS配置。

4. 配置Pub/Sub推送订阅

现在可以创建Pub/Sub的主题和推送订阅了:

  • 创建主题:用gcloud命令或控制台创建:
    gcloud pubsub topics create my-topic
    
  • 创建推送订阅:指定HTTPS端点作为推送目标:
    gcloud pubsub subscriptions create my-push-sub --topic my-topic --push-endpoint=https://pubsub-demo.yourdomain.com/pubsub/push
    
  • 添加Pub/Sub签名验证:为防止伪造请求,必须验证签名。用google-cloud-pubsub库完善Flask代码:
    from google.cloud import pubsub_v1
    from flask import abort
    
    def verify_pubsub_signature(request):
        try:
            pubsub_v1.publisher.verify_push_subscription(
                request.data,
                request.headers,
                "projects/your-project-id/subscriptions/my-push-sub"
            )
            return True
        except Exception as e:
            print(f"Signature verification failed: {e}")
            return False
    
    @app.route('/pubsub/push', methods=['POST'])
    def pubsub_push():
        if not verify_pubsub_signature(request):
            abort(403)
        payload = request.get_json()
        print(f"Received valid message: {payload}")
        return jsonify({"status": "ok"}), 200
    
    推荐用GKE Workload Identity给Pod分配Pub/Sub权限,避免使用密钥文件。

5. 测试验证

最后测试整个流程:

  • 发送测试消息到主题:
    gcloud pubsub topics publish my-topic --message="Hello from Pub/Sub!"
    
  • 查看Pod日志:
    kubectl logs deployment/pubsub-receiver
    
    若看到Received valid message: ...的日志,代表流程跑通。

注意事项

  • Workload Identity:尽量用GKE Workload Identity给Pod分配权限,更安全。
  • 证书续期:Cert-Manager会自动续期Let's Encrypt证书,无需手动操作。
  • Ingress白名单:可在Ingress中配置只允许Pub/Sub的IP段访问,进一步提升安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:16:17