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写一个基础的接收端点(后续要加签名验证):
把代码打包成Docker镜像,推送到Google Artifact Registry或GCR。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) - 创建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: ClusterIPkubectl 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: 80kubectl 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代码:
推荐用GKE Workload Identity给Pod分配Pub/Sub权限,避免使用密钥文件。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
5. 测试验证
最后测试整个流程:
- 发送测试消息到主题:
gcloud pubsub topics publish my-topic --message="Hello from Pub/Sub!" - 查看Pod日志:
若看到kubectl logs deployment/pubsub-receiverReceived valid message: ...的日志,代表流程跑通。
注意事项
- Workload Identity:尽量用GKE Workload Identity给Pod分配权限,更安全。
- 证书续期:Cert-Manager会自动续期Let's Encrypt证书,无需手动操作。
- Ingress白名单:可在Ingress中配置只允许Pub/Sub的IP段访问,进一步提升安全性。
内容的提问来源于stack exchange,提问作者Zufar Muhamadeev
相关产品推荐
相关产品推荐

