k8s内部证书快过期时 不中断服务更新自己颁发的证书

如果需要使用自签名证书,可以在证书过期前使用 openssl 工具重新生成新的证书。可以创建一个脚本在指定的时间点检查证书的有效期,如果快过期了则自动重新生成证书。

以下是一个生产环境示例:

bash Copy code #!/bin/bash

设置证书过期天数

EXP_LIMIT=30

获取证书的到期时间

EXP_DATE=$(openssl x509 -enddate -noout -in /etc/ssl/certs/example.com.crt | cut -d’=’ -f2)

计算证书到期天数

EXP_DAYS=$(echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates | grep “notAfter” | awk -F’=’ ‘{print $2}’ | awk -F’ +’ ‘{print $1,$2,$4}’ | xargs -I{} date -d “{}” +%s) CUR_DAYS=$(date +%s) LEFT_DAYS=$(expr $(($EXP_DAYS - $CUR_DAYS)) / 86400)

如果证书快过期,则重新生成证书 1年有效期

if [ “$LEFT_DAYS” -lt “$EXP_LIMIT” ]; then openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.crt systemctl restart nginx fi 这个脚本可以通过 cron 来定期执行,以确保证书不过期。

设置 100 年有效期证书需要对证书签名命令进行相应的修改

Create a private key for the root CA

openssl genpkey -out rootCA.key

Create the root CA certificate

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 36500 -out rootCA.pem

Create a private key for the certificate

openssl genpkey -out example.com.key

Create a signing request

openssl req -new -key example.com.key -out example.com.csr

Sign the certificate with the root CA

openssl x509 -req -in example.com.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out example.com.crt -days 36500 -sha256

在 Kubernetes 中,可以通过将证书作为 k8s Secret 对象创建,并将该 Secret 引用到需要使用证书的其他对象(如 Ingress)中。以下是一个例子:

Create a secret containing the certificate and key

kubectl create secret tls example-com-tls –cert=example.com.crt –key=example.com.key

Create an ingress that references the secret

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-com-ingress spec: tls:

  • hosts:
    • example.com secretName: example-com-tls rules:
  • host: example.com http: paths:
    • path: / pathType: Prefix backend: service: name: example-com-service port: name: http 如果证书快要过期,可以重新生成一个新证书,并替换 Kubernetes 中的 secret 和 ingress 等其他引用证书的对象。

什么场景需要用tls-secret的TLS秘钥 。

什么场景需要使用 cert-manager 管理的证书 比如LetsEncrypt的。 使用tls-secret的TLS秘钥的场景是需要使用自签名证书的情况,例如需要访问的内部系统不需要访问者对证书的信任。

使用 cert-manager 管理的证书(如LetsEncrypt)的场景是需要访问者对证书具有信任,因为它是从颁发机构(如LetsEncrypt)颁发的,可以在生产环境中使用。

使用集群内生成证书的场景是当不需要访问者对证书具有信任时,并且需要确保证书的安全性,该证书只能在集群内部使用,而不是公开访问

apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: example-certificate spec: secretName: example-certificate issuerRef: name: letsencrypt-prod kind: ClusterIssuer commonName: example.com dnsNames:

  • example.com acme: config:
    • http01: ingressClass: nginx domains:
      • example.com

apiVersion: v1 kind: Secret metadata: name: tls-secret data: tls.crt: tls.key: type: kubernetes.io/tls

随机文章