救命SOS!內(nèi)網(wǎng)K8s證書過期,我差點上了公司“恥辱墻”……
引言
在數(shù)字化轉型浪潮下,Kubernetes已成為企業(yè)構建私有云、混合云的核心底座。然而,在金融、政務、軍工等強監(jiān)管行業(yè)的私有化交付場景中,一個“隱形殺手”正悄然潛伏——內(nèi)網(wǎng)證書過期。
好的,經(jīng)過我們上面的說辭,我們本篇就來處理下 K8s 證書過期的相關案例,廢話少說,直接開始。
開始
一、場景痛點與核心挑戰(zhàn)
典型場景:某金融集團私有化部署的K8s生產(chǎn)集群突現(xiàn)證書過期,導致API Server拒絕連接、kubelet節(jié)點失聯(lián)。由于以下限制,常規(guī)修復手段失效:
? 網(wǎng)絡隔離:集群部署于客戶內(nèi)網(wǎng),禁止任何外網(wǎng)連接
? 安全合規(guī):必須使用內(nèi)部CA簽發(fā)證書,禁用自簽名和Let's Encrypt
? 業(yè)務SLA:核心交易系統(tǒng)要求99.99%可用性,停機時間需<5分鐘
二、緊急救援:四步離線證書簽發(fā)法
步驟1:構建離線應急工具包
# 工具包目錄結構
cert-rescue-kit/
├── bin/
│ ├── cfssl_1.6.4_linux_amd64 # 證書簽發(fā)工具
│ ├── 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"
}
}
}
}
步驟2:生成根CA證書(首次部署需操作)
# 生成CA私鑰與證書
./cfssl gencert -initca conf/ca-csr.json | ./cfssljson -bare ca
# 輸出文件:
# ca.pem # CA證書
# ca-key.pem # CA私鑰(絕密?。?/code>
步驟3:簽發(fā)K8s組件證書
API Server證書示例:
# 生成私鑰
openssl genrsa -out apiserver.key 2048
# 生成CSR(需替換實際IP和DNS)
./cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-cnotallow=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
關鍵參數(shù)說明:
? -hostname
:必須包含所有API Server的IP和DNS名稱
? -profile
:匹配ca-config.json中的策略
步驟4:集群證書熱替換
# 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
操作風險提示:
? 需按順序重啟組件:API Server → Controller Manager → Scheduler
? 生產(chǎn)環(huán)境建議逐個節(jié)點滾動替換
三、長效機制:自動化證書生命周期管理
方案架構設計
圖片
核心組件選型
組件 | 功能 | 推薦工具 |
證書簽發(fā) | 創(chuàng)建和管理X.509證書 | HashiCorp Vault |
輪換控制 | 監(jiān)控證書有效期并觸發(fā)更新 | Cert-Manager + Prometheus |
密鑰存儲 | 安全存儲CA私鑰 | Vault KMIP引擎 |
審計跟蹤 | 記錄所有證書操作日志 | ELK Stack |
Cert-Manager自動化配置
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天續(xù)期
issuerRef:
name: vault-issuer
kind: ClusterIssuer
dnsNames:
- kubernetes.default.svc.cluster.local
- k8s-api.example.com
關鍵參數(shù):
? renewBefore
:設置早于證書過期時間觸發(fā)續(xù)期
? duration
:證書有效期,需符合企業(yè)安全策略
證書監(jiān)控告警規(guī)則
# Prometheus告警規(guī)則
-alert:K8sCertificateExpiry
expr:kubelet_server_certificate_expiration_seconds{job="kubelet"}/86400<30
for:10m
labels:
severity:critical
annotations:
summary:"證書 {{ $labels.host }} 將在30天內(nèi)過期"
description: "證書路徑: {{ $labels.path }}"
四、合規(guī)審計與災備設計
審計檢查清單
1. 私鑰安全
- 所有私鑰文件權限設置為0400
- 密鑰存儲啟用Vault動態(tài)密鑰加密
2. 證書信息合規(guī)
# 驗證證書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
3. 輪換記錄可追溯
-- 證書操作日志表結構示例
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
);
跨集群災備方案
1. 冷備份證書
# 定期導出證書和密鑰
kubectl get secret apiserver-tls -o jsnotallow='{.data.tls\.crt}' | base64 -d > backup/apiserver-$(date +%Y%m%d).crt
2. 多CA互信架構
# 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-----
五、實戰(zhàn)案例:某銀行私有云證書事件復盤
背景:
? 集群規(guī)模:200節(jié)點,運行300+微服務
? 故障現(xiàn)象:控制平面證書過期導致調(diào)度器失聯(lián)
處置過程:
1. 緊急處置:
- 通過預置的離線工具包在15分鐘內(nèi)完成證書替換
- 使用Ansible劇本批量滾動重啟組件
2. 根因分析:
? 原手動管理證書未設置監(jiān)控告警
? 證書有效期僅設置為1年,未及時續(xù)期
3. 改進措施:
? 部署Cert-Manager實現(xiàn)全自動輪換
? 建立雙CA互信機制,支持無縫切換
成果:
? 證書相關故障MTTR(平均修復時間)從4小時降至5分鐘
? 全年未發(fā)生證書過期導致的業(yè)務中斷
六、總結與資源
核心要點:
? 緊急救援:標準化離線工具包 + 熱替換腳本
? 長期治理:自動化輪換 + 雙活CA架構
? 合規(guī)審計:密鑰生命周期全記錄 + 定期穿透測試
資源推薦:
? HashiCorp Vault K8s指南[1]
? Cert-Manager官方文檔[2]
? K8s證書管理白皮書[3]
立即行動:
# 獲取離線應急工具包
git clone https://github.com/k8s-cert/rescue-kit.git
cd rescue-kit && ./init.sh
通過這套方案,你的K8s集群將具備軍工級證書管理能力,從容應對最嚴苛的私有化交付場景。