Cert Manager在k8s中的使用

学习参考链接

https://www.bilibili.com/video/BV1qa411V7xs/?spm_id_from=333.337.search-card.all.click&vd_source=0372d3f32c3f19a6a2676a7529d6698a

https://tech.aufomm.com/how-to-use-cert-manager-on-kubernetes/

https://cert-manager.io/docs/installation/helm/

Cert Manager在k8s中的使用

Cert - Manager 是一款强大且使用相对简便的工具,用于在 Kubernetes 集群中自动化证书管理。

安装(这里使用Helm,可以参考上面链接里介绍的其他方式)

# 添加 Jetstack Helm 仓库

# 更新本地 Helm Chart 仓库缓存

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true

 

简单讲,在k8s里可以用两个步骤来应用其功能:

1. 定义一个证书颁发者

2. 从该颁发者请求证书

 

步骤一:定义一个证书颁发者(Issuer)

证书颁发者(Issuer)定义了证书的来源和颁发方式。Cert - Manager 支持多种类型的颁发者,这里介绍三种
  1. 自签名方式
  2. ACME Let's Encrypt方式
  3. CA证书方式

自签名颁发者示例

下面是一个定义自签名颁发者的 YAML 文件示例:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: selfsigned-issuer
  namespace: default
spec:
  selfSigned: {}
在这个示例中:
  • apiVersion 指定了使用的 Cert - Manager API 版本。
  • kind 表明这是一个 Issuer 资源。
  • metadata 部分定义了颁发者的名称和命名空间。
  • spec 部分指定了颁发者的类型,这里使用的是 selfSigned,即自签名。

 

你可以使用以下命令将该 YAML 文件应用到 Kubernetes 集群中:
kubectl apply -f selfsigned-issuer.yaml

 

Let's Encrypt 颁发者示例

如果你想使用 Let's Encrypt 来颁发证书,需要定义一个 ACME(Automated Certificate Management Environment)类型的颁发者。示例如下:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-issuer
spec:
  acme:
    # Let's Encrypt 的服务器地址
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your-email@example.com # 替换为你的邮箱,用于证书到期提醒
    privateKeySecretRef:
      name: letsencrypt-key
    solvers:
    - http01:
        ingress:
class: nginx  # 替换为你的 Ingress Controller 类型(如 nginx、traefik)
在这个示例中:
  • server 指定了 Let's Encrypt 的服务器地址。
  • email 是你用于注册 Let's Encrypt 账户的邮箱地址。
  • privateKeySecretRef 是存储 Let's Encrypt 账户私钥的 Secret 名称。
  • solvers 部分定义了证书验证的方式,这里使用的是 http01 验证,通过 Ingress 进行验证。
同样,使用 kubectl apply 命令将该 YAML 文件应用到集群中。
kubectl apply -f letsencrypt-issuer.yaml

 

CA 颁发者示例

申请到合法的CA证书,通过证书创建 secret

kubectl create secret tls -n cert-manager ca-key-pair --cert=ca.cert.pem --key=ca.key.pem

再使用这个 secret 来创建issuer, 这里创建一个cluster issuer, 因为想给全局使用

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: ca-issuer
spec:
  ca:
    secretName: ca-key-pair
在这个 YAML 文件中:
  • apiVersion 和 kind 分别指定了使用的 Cert - Manager API 版本和资源类型(ClusterIssuer)。
  • metadata 部分定义了 Issuer 的名称。
  • spec.ca.secretName 指定了存储 CA 证书和私钥的 Secret 名称。

 

步骤二:从该颁发者请求证书

请求证书常用两种方式:
  1. 直接生成证书 
  2. 使用annotations 方式

直接生成证书

定义好颁发者后,就可以向其请求证书了。以下是用刚才生成的 let's encrypt Issuer
letsencrypt-issuer
a. 来生成一个证书的 YAML 文件示例:
#my-certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: my-certificate
  namespace: default
spec:
  secretName: my-certificate-secret
  issuerRef:
    name: letsencrypt-issuer
    kind: Issuer
  commonName: my-domain.com
  dnsNames:
    - my-domain.com
    - www.my-domain.com
在这个示例中:
  • apiVersion 和 kind 分别指定了使用的 API 版本和资源类型(Certificate)。
  • metadata 部分定义了证书的名称和命名空间。
  • spec.secretName 是存储证书和私钥的 Secret 名称。
  • spec.issuerRef 指定了要使用的颁发者的名称和类型。
  • spec.commonName 是证书的通用名称。
  • spec.dnsNames 是证书要支持的域名列表。

 

使用以下命令将该 YAML 文件应用到 Kubernetes 集群中:
kubectl apply -f my-certificate.yaml
 
证书将被存到对应的secret资源 my-certifaicate-secret 中
 
b. 在 ingress 中使用此证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - my-domain.com
    secretName: my-certifaicate-secret
  rules:
  - host: your - domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-service
            port:
              number: 80

 

 

annotations 自动请求方式

 这里通过在Ingress的资源定义文件中加入我们上面创建的 ClusterIssuer ca-issuer来自动请求证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-issuer
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - your-domain.com
    secretName: your-domain-tls
  rules:
  - host: your - domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-service
            port:
              number: 80
在这个 Ingress 资源中:
  • annotations 部分:
    • cert - manager.io/cluster - issuer 指定了要使用的 ClusterIssuer 名称。
    • kubernetes.io/ingress.class 指定了使用的 Ingress 控制器类型,这里假设使用的是 Nginx Ingress 控制器。
  • tls 部分:
    • hosts 列出了要为其请求证书的域名。
    • secretName 是存储颁发的 TLS 证书和私钥的 Secret 名称。
  • rules 部分定义了 Ingress 的路由规则。

使用以下命令将该 Ingress 资源应用到集群中:
kubectl apply -f ingress-with-cert.yaml

 

使用以下命令检查证书的状态:
kubectl describe certificate your-domain-tls
 
如果一切配置正确,Cert - Manager 会自动处理证书的请求和颁发过程。当证书颁发成功后,你可以在指定的 Secret(your-domain-tls)中找到证书和私钥。
 
 
 

 

posted @ 2025-04-23 16:03  呆瓜小贼66  阅读(124)  评论(0)    收藏  举报