k8s内部证书快过期时 不中断服务更新letsencrypt证书
当内部证书即将过期时,我们可以使用 cert-manager 自动续期证书,并确保服务不中断。下面是使用 cert-manager 在生产环境续期证书的示例:
安装 cert-manager: 可以通过在 Kubernetes 集群中部署 cert-manager 来完成安装。
配置 ClusterIssuer: 创建一个 ClusterIssuer 资源,该资源描述了如何使用 cert-manager 获取证书。以下是使用 Let’s Encrypt 的生产环境配置示例:
yaml Copy code apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: # The ACME server URL server: https://acme-v02.api.letsencrypt.org/directory # Email address used for ACME registration email: admin@example.com # Name of a secret used to store the ACME account private key privateKeySecretRef: name: letsencrypt-prod # Enable the HTTP-01 challenge provider solvers: - http01: ingress: class: nginx 修改证书引用: 修改 ingress 资源中使用的证书,从而引用新的 ClusterIssuer 资源。 yaml Copy code apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: “letsencrypt-prod” spec: tls: - hosts: - example.com secretName: example-com-tls rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: example-service port: name: http cert-manager 会在证书过期前自动更新证书,从而确保服务的连续性。
secretName 定义了 ingress 资源所使用的证书存储在 kubernetes 中的 Secret 资源的名称。它是一个字符串,指向 kubernetes 中存储证书信息的 Secret 资源。例如,在上面的示例中,secretName 是 “example-com-tls”。证书存储在这个 Secret 资源中,包括证书的公钥和私钥,用于通过 TLS 协议进行安全的通信。
example-com-tls 需要怎么定义, 才能引用它呢? example-com-tls 是一个 Kubernetes Secret 资源,用于存储证书和私钥。它是通过 cert-manager 颁发的证书创建的,并且是在 Ingress 资源的 annotations 中指定的。证书和私钥的存储方式可以是文件或者 base64 编码的字符串,在 Kubernetes 中可以通过 kubectl 命令或者 API 来创建和管理 Secret 资源。
以下是一个使用 cert-manager 生成的证书(example-com-tls)的示例:
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: example-com-tls spec: secretName: example-com-tls issuerRef: name: letsencrypt-prod kind: ClusterIssuer commonName: example.com dnsNames:
- example.com
acme:
config:
- http01:
ingressClass: nginx
domains:
- example.com 然后,在 ingress 资源中,通过设置 cert-manager.io/cluster-issuer 和 secretName 来引用该证书:
- http01:
ingressClass: nginx
domains:
yaml Copy code apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: cert-manager.io/cluster-issuer: “letsencrypt-prod” spec: tls:
- secretName: example-com-tls
hosts:
- example.com rules:
- host: example.com
http:
paths:
- path: / pathType: Prefix backend: service: name: example-service port: name: http 这里的 letsencrypt-prod 可以是预定义的 ClusterIssuer,也可以是自定义的 ClusterIssuer。