使用Pulumi配置带Google托管SSL证书的GKE Ingress创建卡住求助
问题排查&修正点
1. 后端Service类型配置错误
GCE Ingress仅需要NodePort类型的后端服务即可完成负载均衡转发,你当前配置的LoadBalancer类型会额外创建独立公网LB,会干扰Ingress控制器的资源调度逻辑,这是Ingress创建卡住最常见的原因之一,直接把服务的spec.type改为NodePort即可。
2. 多余的ConfigMap配置冲突
你手动创建的managed-certificate-configConfigMap完全不需要,GKE内置的托管证书控制器会自动处理证书与Ingress的绑定同步,手动写入的配置会和控制器默认逻辑冲突,直接删除该ConfigMap资源以及Ingress对它的依赖即可。
3. Ingress配置冗余&版本兼容问题
- 你使用的
networking.k8s.io/v1beta1Ingress版本在K8s 1.19+版本已废弃,建议替换为networking.k8s.io/v1适配当前主流GKE集群版本。 - 注解
ingress.gcp.kubernetes.io/pre-shared-cert是给用户自行上传的预共享证书使用的,使用Google托管证书仅需要保留networking.gke.io/managed-certificates注解即可,两个注解同时存在会导致证书匹配冲突。 - 不需要额外配置tls块,托管证书会自动匹配规则里的域名,直接删除tls配置块即可。
4. 依赖链优化
Ingress不需要等待证书完全签发完成再创建,控制器会自动轮询证书状态,完成后自动绑定,去掉不必要的依赖可以加快部署进度。
修正后的最小可用示例
const authDeploymentService = new k8s.core.v1.Service(authDeploymentName, { metadata: { name: "auth-svc", labels: authDeploymentAppLabels, namespace: namespaceName, }, spec: { type: "NodePort", // 改为NodePort类型 ports: [{ port: 80, targetPort: 8080 }], selector: authDeploymentAppLabels, }, }, { provider: clusterProvider, dependsOn: [authDeployment] } ); const authServiceManagedCert = new gcp.compute.ManagedSslCertificate("auth-cert-001", { name: "auth-cert-001", project: myGcpProject.projectId, description: "Managed SSL Certificate For auth service", managed: { domains: ["mydomain.com"] } }); const ingress = new k8s.networking.v1.Ingress(authDeploymentName + "-ingress", { metadata: { namespace: namespaceName, annotations: { // 仅保留托管证书注解 "networking.gke.io/managed-certificates": authServiceManagedCert.name } }, spec: { ingressClassName: "gce", defaultBackend: { service: { name: authDeploymentService.metadata.name, port: { number: 80 } } }, rules: [ { host: "mydomain.com", http: { paths: [ { path: "/", pathType: "Prefix", backend: { service: { name: authDeploymentService.metadata.name, port: { number: 80 } } }, } ], }, }, ] } }, { provider: clusterProvider, dependsOn: [authDeploymentService] // 仅依赖后端服务即可 });
若部署后仍卡住可执行以下命令排查原因
- 查看Ingress事件:
kubectl describe ingress <ingress名称> -n <命名空间> - 查看托管证书状态:
kubectl get managedcertificate -A
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

