跳过正文
Kubernetes 【cert-manager】
  1. 云原生/

Kubernetes 【cert-manager】

目录
cert-manager - 这篇文章属于一个选集。
§ 1: 本文

cert-manager 为您的 Kubernetes 或 OpenShift 集群中的工作负载创建 TLS 证书,并在证书到期前自动续期。

cert-manager
#

申请创建一个 Certificate 资源后,cert-manager 会自动执行以下操作

核心概括:

  1. 生成私钥:在集群内部创建一个加密密钥。
  2. 向 CA 申请:通过 Issuer(之前配置的 Cloudflare DNS-01)向 Let’s Encrypt 证明你拥有 uat.artoio.com 域名。
  3. 保存为 Secret:验证通过后,将签署好的证书和私钥存入 gitlab-tls-secret。
  4. 自动续期:在证书过期前(通常是 90 天内的最后 30 天),自动重新触发验证逻辑。

证书申请
#

  1. Certificate (合同):你填写的申请表,声明你想要哪个域名的证书。
  2. CertificateRequest (审批件):系统自动生成的内部请求,负责向 CA 发起申请。
  3. Order (订单):如果是 ACME(如 Let’s Encrypt),CA 会生成一个订单。
  4. Challenge (挑战/验证):为了证明域名是你的,CA 给出的 “考卷”(比如要求你在 DNS 加条记录)。

排查思路
#

第一步:检查 Certificate (入口)

kubectl get certificate
kubectl describe certificate <​name>

第二步:检查 CertificateRequest (请求层)

kubectl get certificaterequest
kubectl describe certificaterequest <​name>

第三步:检查 Order (订单层)

kubectl get orders.acme.cert-manager.io
kubectl describe order <​name>

第四步:检查 Challenge (最底层/验证层) —— 核心报错点

kubectl get challenges.acme.cert-manager.io
kubectl describe challenge <​name>

部署安装
#

  1. 安装
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.2/cert-manager.yaml
  1. 验证
root@kubernetes01:~/cert-manager# kubectl get pods -n cert-manager 
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-7b8b89f89d-tt7ng              1/1     Running   0          3h21m
cert-manager-cainjector-7f9fdd5dd5-44drh   1/1     Running   0          3h21m
cert-manager-webhook-769f6b94cb-cdkbk      1/1     Running   0          3h21m

发行商
#

一、Cloudflare
#

Cloudflare 支持 TokenAPI Key 授权方式;创建方式参考: cert-manager cloudflare;本次演示使用 API Key 方式。

  1. 创建 secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-key-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-key: {your-api-key}

运行: kubectl apply -f secret.yaml

  1. 创建 cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-cloudflare
spec:
  acme:
    email: {your-email}
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-cloudflare-account-key
    solvers:
    - dns01:
        cloudflare:
          email: {your-email}
          apiKeySecretRef:
            name: cloudflare-api-key-secret
            key: api-key

运行: kubectl apply -f cluster-issuer.yaml

  1. 检查状态
# 
root@kubernetes01:~/cert-manager# kubectl get secrets -n cert-manager 
NAME                                 TYPE     DATA   AGE
cert-manager-webhook-ca              Opaque   3      3h29m
cloudflare-api-key-secret            Opaque   1      3h8m
letsencrypt-cloudflare-account-key   Opaque   1      3h1m

#
root@kubernetes01:~# kubectl get clusterissuers.cert-manager.io 
NAME                     READY   AGE
letsencrypt-cloudflare   True    158m

示例
#

  1. 创建 certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: gitlab-cert
  namespace: istio-system
spec:
  secretName: gitlab-tls-secret
  issuerRef:
    name: letsencrypt-cloudflare
    kind: ClusterIssuer
  dnsNames:
  - gitlab.artoio.com

运行: kubectl apply -f certificate.yaml

  1. 验证
#
root@kubernetes01:~/gitlab# kubectl get certificate -n istio-system 
NAME          READY   SECRET              AGE
gitlab-cert   True    gitlab-tls-secret   159m

#
root@kubernetes01:~/gitlab# kubectl get certificaterequests.cert-manager.io -n istio-system 
NAME            APPROVED   DENIED   READY   ISSUER                   REQUESTER                                         AGE
gitlab-cert-1   True                True    letsencrypt-cloudflare   system:serviceaccount:cert-manager:cert-manager   160m

#
root@kubernetes01:~/gitlab# kubectl get orders.acme.cert-manager.io -n istio-system 
NAME                      STATE   AGE
gitlab-cert-1-298491017   valid   161m

# 查看日志
kubectl logs -f -n cert-manager -l app.kubernetes.io/name=cert-manager

结语
#


参考:

cert-manager - 这篇文章属于一个选集。
§ 1: 本文

相关文章


微信赞赏
微信赞赏
关注公众号
关注公众号
支付宝赞赏
支付宝赞赏