k8s cert-manager zerossl cloudflare

2025-12-26 7 0

上篇 k8s cert-manager cloudflare 配置证书为Let's Encrypt,下面升级版本并使用ZeroSSL证书,同时兼顾初次安装

安装 cert-manager

添加 cert-manager 仓库

helm repo add jetstack https://charts.jetstack.io
helm repo update

生成 values.yaml

helm show values jetstack/cert-manager > values.yaml

https://cert-manager.io/docs/tutorials/zerossl/zerossl/

初次安装 values.yaml 修改建议

installCRDs: true

prometheus:
  enabled: false

webhook:
  timeoutSeconds: 10

切换 zerossl

ingressShim:
  defaultIssuerName: "zerossl-production"
  defaultIssuerKind: "ClusterIssuer"

如果想查看生成的清单,可以使用

helm template cert-manager jetstack/cert-manager -n cert-manager -f values.yaml > cert-manager.yaml

安装 cert-manager

# 安装
# helm install cert-manager jetstack/cert-manager -n cert-manager --create-namespace -f values.yaml

# 升级
helm upgrade  --install --namespace cert-manager  --version v1.19.2 cert-manager jetstack/cert-manager -f values.yaml

等待

kubectl wait --for=condition=Ready pods --all -n cert-manager

# pod/cert-manager-74cb9c54dd-rs446 condition met
# pod/cert-manager-cainjector-5b99cf9569-c6bpt condition met
# pod/cert-manager-webhook-b9999597-xtfl6 condition met

获取 zerossl 账户ID和密钥

image.png

获取 CloudFlare API-Token
https://dash.cloudflare.com/profile/api-tokens
创建令牌->API 令牌模板: 编辑DNS
image.png

image.png

下面使用ClusterIssuer 所以secret 要求名称空间为cert-manager
https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/

# cat 1-zero-ssl-eabsecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: zero-ssl-eabsecret
  namespace: cert-manager
stringData:
  secret: <YOUR_ENCODED_ZEROSSL_EAB_HMAC_KEY>
# cat 2-cloudflare-api-token-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-token: <CloudFlare API Token>
# cat 3-clusterIssuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: zerossl-production
spec:
  acme:
    # ZeroSSL ACME server
    server: https://acme.zerossl.com/v2/DV90
    email: dummy-email@yopmail.com # OR YOUR EMAIL

    # name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: zerossl-prod

    # for each cert-manager new EAB credencials are required
    externalAccountBinding:
      keyID: <YOUR_ZEROSSL_EAB_KEY_ID>
      keySecretRef:
        name: zero-ssl-eabsecret
        key: secret

    # ACME DNS-01 provider configurations to verify domain
    solvers:
    - dns01:
        cloudflare:
          apiTokenSecretRef:
            name: cloudflare-api-token-secret
            key: api-token
# cat 4-certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-sundayhk-com
  namespace: blog
spec:
  secretName: wildcard-sundayhk-com-tls # 保存签发证书会到 Secret
  issuerRef:
    kind: ClusterIssuer
    name: zerossl-production  # 引用 ClusterIssuer
  commonName: "sundayhk.com"
  dnsNames:
    - "*.sundayhk.com"
    - "sundayhk.com"

主域名+泛域名 第二个超时处理见下文

# cat 5-ingress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: blog
  labels:
    app: containous
    name: whoami
spec:
  replicas: 2
  selector:
    matchLabels:
      app: containous
      task: whoami
  template:
    metadata:
      labels:
        app: containous
        task: whoami
    spec:
      containers:
        - name: containouswhoami
          image: containous/whoami
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: blog
spec:
  ports:
    - name: http
      port: 80
  selector:
    app: containous
    task: whoami
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami-ingress
  namespace: blog
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - "sundayhk.com"
      secretName: sundayhk-com-tls
  rules:
    - host: sundayhk.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  number: 80
kubectl apply -f 1-zero-ssl-eabsecret.yaml
kubectl apply -f 2-cloudflare-api-token-secret.yaml
kubectl apply -f 3-clusterIssuer.yaml
kubectl apply -f 4-certificate.yaml
kubectl apply -f 5-ingress.yaml
$ kubectl get clusterissuer
NAME                 READY   AGE
zerossl-production   True    15s

主域名+泛域名 第二个超时处理

root@arm-us1:~# kubectl get certificate,order,challenge -n blog
NAME                                                READY   SECRET                      AGE
certificate.cert-manager.io/sundayhk-com            True    sundayhk-com-tls            7m51s
certificate.cert-manager.io/wildcard-sundayhk-com   False   wildcard-sundayhk-com-tls   3m55s

NAME                                                            STATE     AGE
order.acme.cert-manager.io/sundayhk-com-1-2142508995            valid     7m51s
order.acme.cert-manager.io/wildcard-sundayhk-com-1-1043454861   pending   3m55s

NAME                                                                           STATE     DOMAIN         AGE
challenge.acme.cert-manager.io/wildcard-sundayhk-com-1-1043454861-2742518390   valid     sundayhk.com   3m50s
challenge.acme.cert-manager.io/wildcard-sundayhk-com-1-1043454861-347502299    pending   sundayhk.com   3m50s

# 查看pending
root@arm-us1:~# kubectl describe challenge.acme.cert-manager.io/wildcard-sundayhk-com-1-1043454861-347502299 -n blog
Name:         wildcard-sundayhk-com-1-1043454861-347502299
Namespace:    blog
...
  Token:         aV0cIb-E2V7TQ1E8MowsQYyhXXdH3I0dPsOFlOOdJCU
  Type:          DNS-01
  URL:           https://acme.zerossl.com/v2/DV90/chall/zbsmCjkuu2X1TAOlm80tYQ
  Wildcard:      false
Status:
  Presented:   false
  Processing:  false
  Reason:      unexpected non-ACME API error: context deadline exceeded
  State:       errored
Events:
  Type    Reason     Age    From                     Message
  ----    ------     ----   ----                     -------
  Normal  Started    4m27s  cert-manager-challenges  Challenge scheduled for processing
  Normal  Presented  4m22s  cert-manager-challenges  Presented challenge using DNS-01 challenge mechanism

解决:第一次用泛域名申请,第二次泛域名+主域名再次申请

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-sundayhk-com
  namespace: blog
spec:
  secretName: wildcard-sundayhk-com-tls 
  issuerRef:
    kind: ClusterIssuer
    name: zerossl-production
  commonName: "sundayhk.com"
  dnsNames:
    - "*.sundayhk.com"
    # - "sundayhk.com" # 泛域名申请成功后,取消注释,再次apply

相关文章

k8s cert-manager cloudflare 配置
Kubernetes Metrics Server v0.8.0
kubespray 镜像加速配置
kubespray 离线安装自建配置
kubespray 安装kubernetes集群
kubernetes 部署argocd 自动同步项目代码

发布评论