Azure容器应用网关(K8S Gateway API)独立TLS终止资源的Helm部署咨询
解决方案
方案1:通配符证书 + 单Gateway统一监听器
这是适配Helm自动化部署的最优方案,核心是用覆盖所有子域名的通配符证书绑定到单个Gateway的HTTPS监听器,每个应用仅通过Helm部署HttpRoute实现路由,无需修改Gateway资源。
操作步骤:
部署通配符证书Secret:
在Gateway所在namespace(如system)部署包含通配符证书的Secret,也可结合cert-manager自动签发维护:apiVersion: v1 kind: Secret metadata: name: wildcard-dev-tls namespace: system type: kubernetes.io/tls data: tls.crt: <base64编码的证书内容> tls.key: <base64编码的密钥内容>部署统一Gateway:
仅部署一个Gateway,配置单个HTTPS监听器绑定通配符证书,允许所有namespace的路由关联:apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: annotations: alb.networking.azure.io/alb-name: alb-test-spoke-2 alb.networking.azure.io/alb-namespace: system name: alb-gw-tls namespace: system spec: gatewayClassName: azure-alb-external listeners: - allowedRoutes: namespaces: from: All hostname: "*.dev" name: https-wildcard-listener port: 443 protocol: HTTPS tls: certificateRefs: - kind: Secret name: wildcard-dev-tls mode: Terminate应用Helm Chart配置:
每个应用的Helm Chart只需部署HttpRoute资源,指定自身hostname即可:# 应用Helm模板中的HttpRoute apiVersion: gateway.networking.k8s.io/v1 kind: HttpRoute metadata: name: {{ .Release.Name }}-http-route namespace: {{ .Release.Namespace }} spec: hostnames: - "{{ .Values.app.hostname }}" # 例如first-api.dev parentRefs: - name: alb-gw-tls namespace: system rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: {{ .Release.Name }}-service port: {{ .Values.service.port }}新应用部署时无需修改Gateway,Helm自动完成路由配置,完全满足自动化需求。
方案2:多证书绑定单监听器 + 自动证书注入
若无法使用通配符证书,可利用AGC支持单监听器绑定多证书的特性,结合Helm钩子自动将应用证书添加到Gateway的证书列表。
操作步骤:
初始Gateway部署:
部署基础Gateway,HTTPS监听器初始绑定一个默认证书:apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: annotations: alb.networking.azure.io/alb-name: alb-test-spoke-2 alb.networking.azure.io/alb-namespace: system name: alb-gw-tls namespace: system spec: gatewayClassName: azure-alb-external listeners: - allowedRoutes: namespaces: from: All name: https-shared-listener port: 443 protocol: HTTPS tls: certificateRefs: - kind: Secret name: default-tls-cert mode: Terminate应用Helm Chart配置:
每个应用的Helm Chart包含两部分资源:- 自身的TLS证书Secret(需部署在Gateway所在namespace)
- Helm钩子Job,自动将当前应用证书添加到Gateway的证书列表:
# 应用证书Secret apiVersion: v1 kind: Secret metadata: name: {{ .Release.Name }}-tls-cert namespace: system type: kubernetes.io/tls data: tls.crt: {{ .Values.tls.crt }} tls.key: {{ .Values.tls.key }} # Helm钩子:更新Gateway证书列表 apiVersion: batch/v1 kind: Job metadata: name: {{ .Release.Name }}-update-gateway-cert annotations: "helm.sh/hook": post-install,post-upgrade "helm.sh/hook-delete-policy": hook-succeeded spec: template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: - /bin/sh - -c - | # 检查证书是否已存在,避免重复添加 EXIST=$(kubectl get gateway alb-gw-tls -n system -o jsonpath='{.spec.listeners[0].tls.certificateRefs[*].name}' | grep -w {{ .Release.Name }}-tls-cert) if [ -z "$EXIST" ]; then kubectl patch gateway alb-gw-tls -n system --type json -p '[{"op": "add", "path": "/spec/listeners/0/tls/certificateRefs/-", "value": {"kind": "Secret", "name": "{{ .Release.Name }}-tls-cert"}}}' fi restartPolicy: OnFailure
HttpRoute配置:
与方案1一致,每个应用的HttpRoute指定自身hostname并关联共享Gateway即可。
方案对比
| 方案 | 优点 | 适用场景 |
|---|---|---|
| 通配符证书方案 | 配置极简,无额外维护成本,完全适配Helm自动化 | 域名统一为同一根域的子域名,可使用通配符证书 |
| 多证书自动注入方案 | 支持独立域名证书,无需手动修改Gateway | 域名无法使用通配符,每个应用需独立证书的场景 |
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

