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 等其他引用证书的对象。
1 tls-secret 与cert-manager
什么场景需要用tls-secret的TLS秘钥 。
什么场景需要使用 cert-manager 管理的证书 比如LetsEncrypt的。 使用tls-secret的TLS秘钥的场景是需要使用自签名证书的情况,例如需要访问的内部系统不需要访问者对证书的信任。
使用 cert-manager 管理的证书(如LetsEncrypt)的场景是需要访问者对证书具有信任,因为它是从颁发机构(如LetsEncrypt)颁发的,可以在生产环境中使用。
使用集群内生成证书的场景是当不需要访问者对证书具有信任时,并且需要确保证书的安全性,该证书只能在集群内部使用,而不是公开访问
2 在集群内生成证书,并将证书用作 TLS 密钥对。
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
- http01:
ingressClass: nginx
domains:
2.1 创建一个名为tls-secret的TLS秘钥:
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
data:
tls.crt: