如何通过Helm Chart为cert-manager配置ClusterIssuer解决证书签发失败问题?
问题描述
我想给部署在Kubernetes上的WordPress应用添加SSL支持,已通过以下Helm命令部署cert-manager:
helm upgrade \ cert-manager \ --namespace cert-manager \ --version v1.9.1 \ --set installCRDs=true \ --set ingressShim.defaultIssuerName=letsencrypt-prod \ --set ingressShim.defaultIssuerKind=ClusterIssuer \ --set ingressShim.defaultIssuerGroup=cert-manager.io \ --create-namespace \ jetstack/cert-manager --install
随后用Helm部署WordPress,对应的values.yml配置如下:
# 修改默认服务类型 service: type: ClusterIP # Ingress 资源配置 ingress: enabled: true hostname: app.benighil-mohamed.com path: / annotations: #kubernetes.io/ingress.class: azure/application-gateway kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: letsencrypt-prod extraTls: - hosts: - "{{ .Values.ingress.hostname }}" # 示例: app.benighil-mohamed.com secretName: "{{ .Release.Name }}-{{ .Values.ingress.hostname }}" # 示例: wp-app.benighil-mohamed.com
但检查Certificate和CertificateRequests资源时,得到如下错误结果:
vscode ➜ /workspaces/flux/ingress $ kubectl get certificate -n app -owide NAME READY SECRET ISSUER STATUS AGE wp-benighil.benighil-mohamed.com False wp-benighil.benighil-mohamed.com letsencrypt-prod Issuing certificate as Secret does not exist 25m
vscode ➜ /workspaces/flux/ingress $ kubectl get certificaterequests -n app -owide NAME APPROVED DENIED READY ISSUER REQUESTOR STATUS AGE wp-benighil.benighil-mohamed.com-45d6s True False letsencrypt-prod system:serviceaccount:cert-manager:cert-manager Referenced "ClusterIssuer" not found: clusterissuer.cert-manager.io "letsencrypt-prod" not found 27m
请问如何通过Helm Chart而非单独部署清单的方式,在cert-manager中配置ClusterIssuer以解决该问题?
解决方案
cert-manager官方Helm Chart本身不包含ClusterIssuer的部署逻辑,你可以通过以下两种Helm方式部署ClusterIssuer:
方式1:创建极简自定义Helm Chart
- 初始化一个新的Helm Chart:
helm create cluster-issuer-chart
- 删除
cluster-issuer-chart/templates目录下的所有默认文件,新建templates/cluster-issuer.yaml,内容如下(替换你的邮箱地址):
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: nginx # 需与WordPress Ingress使用的ingress class保持一致
- 部署这个自定义Chart:
helm upgrade --install cluster-issuer ./cluster-issuer-chart --namespace cert-manager
方式2:借助通用Raw Chart通过Helm参数部署
使用Bitnami提供的raw Chart,无需编写自定义模板,直接通过Helm参数定义ClusterIssuer:
helm upgrade --install letsencrypt-prod \ --namespace cert-manager \ --set-string spec.acme.server=https://acme-v02.api.letsencrypt.org/directory \ --set-string spec.acme.email=your-email@example.com \ --set spec.acme.privateKeySecretRef.name=letsencrypt-prod \ --set spec.acme.solvers[0].http01.ingress.class=nginx \ oci://registry-1.docker.io/bitnamicharts/raw
验证部署结果
部署完成后,检查ClusterIssuer状态:
kubectl get clusterissuer letsencrypt-prod
当状态变为Ready后,cert-manager会自动重新处理之前的Certificate请求,等待几分钟后再次检查Certificate状态:
kubectl get certificate -n app
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

