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

如何通过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

  1. 初始化一个新的Helm Chart:
helm create cluster-issuer-chart
  1. 删除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保持一致
  1. 部署这个自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:48:42