刘俊夏 2025-07-04 07:15 广东
一个“隐形杀手”正悄然潜伏……
引言
在数字化转型浪潮下,Kubernetes已成为企业构建私有云、混合云的核心底座。然而,在金融、政务、军工等强监管行业的私有化交付场景中,一个“隐形杀手”正悄然潜伏——内网证书过期。好的,经过我们上面的说辞,我们本篇就来处理下 K8s 证书过期的相关案例,废话少说,直接开始。
一、场景痛点与核心挑战
🚨 **紧急救援方案:** 针对证书过期导致的集群故障,提供了构建离线应急工具包的步骤,包括证书签发工具、检查脚本和备份部署脚本,以及生成根CA证书和签发K8s组件证书的详细操作,并强调了热替换的步骤和注意事项。
🔄 **长效机制:** 推荐使用自动化证书生命周期管理方案,包括HashiCorp Vault进行密钥存储,Cert-Manager进行证书签发和轮换,以及Prometheus进行证书有效期监控和告警,确保证书管理的自动化和高效性。
🛡️ **合规审计与灾备设计:** 强调了合规审计的重要性,包括私钥安全、证书信息合规性以及轮换记录可追溯性。同时,提出了跨集群灾备方案,包括冷备份证书和多CA互信架构,以提高系统的可靠性和容错能力。
刘俊夏 2025-07-04 07:15 广东
一个“隐形杀手”正悄然潜伏……
关键文件说明:# 工具包目录结构
cert-rescue-kit/
├── bin/
│ ├── cfssl_1.6.4_linux_amd64 # 证书签发工具
│ ├── cfssljson_1.6.4_linux_amd64
│ └── k8s-cert-checker # 证书检查脚本
├── conf/
│ ├── ca-config.json # CA配置文件
│ ├── ca-csr.json # 根CSR模板
│ └── apiserver-csr.json # API Server CSR模板
└── scripts/
├── backup-certs.sh # 证书备份脚本
└── deploy-certs.sh # 证书部署脚本
ca-config.json:定义证书类型与有效期
{
"signing":{
"default":{
"expiry":"8760h"
},
"profiles":{
"kubernetes":{
"usages":["signing","key encipherment","server auth","client auth"],
"expiry":"8760h"
}
}
}
}
# 生成CA私钥与证书
./cfssl gencert -initca conf/ca-csr.json | ./cfssljson -bare ca
# 输出文件:
# ca.pem # CA证书
# ca-key.pem # CA私钥(绝密!)
关键参数说明:# 生成私钥
openssl genrsa -out apiserver.key 2048
# 生成CSR(需替换实际IP和DNS)
./cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=conf/ca-config.json \
-hostname=10.0.0.1,kubernetes.default.svc,kubernetes.default,localhost,127.0.0.1 \
-profile=kubernetes \
conf/apiserver-csr.json | ./cfssljson -bare apiserver
-hostname:必须包含所有API Server的IP和DNS名称
-profile:匹配ca-config.json中的策略
操作风险提示:# 1. 备份原证书
./backup-certs.sh /etc/kubernetes/pki
# 2. 部署新证书
cp apiserver.pem /etc/kubernetes/pki/
cp apiserver-key.pem /etc/kubernetes/pki/
# 3. 滚动重启控制平面组件
systemctl restart kube-apiserver kube-controller-manager kube-scheduler
# 4. 更新kubeconfig证书
sed -i 's/client-certificate:.*/client-certificate: \/etc\/kubernetes\/pki\/apiserver.pem/' /etc/kubernetes/admin.conf
核心组件选型
组件功能推荐工具
创建和管理X.509证书
HashiCorp Vault
监控证书有效期并触发更新
Cert-Manager + Prometheus
安全存储CA私钥
Vault KMIP引擎
记录所有证书操作日志
ELK Stack
关键参数:apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: vault-issuer
spec:
vault:
path: pki/sign/k8s-cluster
server: https://vault.example.com
caBundle: LS0tLS1CRUdJ... # Base64编码的CA证书
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: apiserver-cert
spec:
secretName: apiserver-tls
duration: 2160h # 90天
renewBefore: 360h # 提前15天续期
issuerRef:
name: vault-issuer
kind: ClusterIssuer
dnsNames:
- kubernetes.default.svc.cluster.local
- k8s-api.example.com
# Prometheus告警规则
-alert:K8sCertificateExpiry
expr:kubelet_server_certificate_expiration_seconds{job="kubelet"}/86400<30
for:10m
labels:
severity:critical
annotations:
summary:"证书 {{ $labels.host }} 将在30天内过期"
description: "证书路径: {{ $labels.path }}"
3、轮换记录可追溯# 验证证书DN信息
openssl x509 -in /etc/kubernetes/pki/apiserver.pem -noout -subject -issuer
# 期望输出:
# subject=O = k8s-cluster, CN = kube-apiserver
# issuer=O = Internal CA, CN = k8s-root-ca
-- 证书操作日志表结构示例
CREATE TABLE cert_audit (
id INT PRIMARY KEY,
cert_name VARCHAR(255),
action_type ENUM('CREATE','UPDATE','REVOKE'),
expire_date DATETIME,
operator VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2、多CA互信架构# 定期导出证书和密钥
kubectl get secret apiserver-tls -o jsonpath='{.data.tls\.crt}' | base64 -d > backup/apiserver-$(date +%Y%m%d).crt
# K8s API Server配置多CA
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-apiserver-ca
data:
ca-bundle.crt: |
-----BEGIN CERTIFICATE-----
# Primary CA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
# Backup CA
-----END CERTIFICATE-----
通过这套方案,你的K8s集群将具备军工级证书管理能力,从容应对最严苛的私有化交付场景。# 获取离线应急工具包
git clone 地址不存在,请查看评论区k8s-cert/rescue-kit.git
cd rescue-kit && ./init.sh
>>>>
引用链接[1] HashiCorp Vault K8s指南: https://developer.hashicorp.com/vault/docs/platform/k8s[2] Cert-Manager官方文档: https://cert-manager.io/docs/[3] K8s证书管理白皮书: https://github.com/k8s-cert/cert-whitepaperAI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑