救命SOS!内网K8s证书过期,我差点上了公司“耻辱墙”……

云计算 云原生
在数字化转型浪潮下,Kubernetes已成为企业构建私有云、混合云的核心底座。然而,在金融、政务、军工等强监管行业的私有化交付场景中,一个“隐形杀手”正悄然潜伏——内网证书过期。

引言

在数字化转型浪潮下,Kubernetes已成为企业构建私有云、混合云的核心底座。然而,在金融、政务、军工等强监管行业的私有化交付场景中,一个“隐形杀手”正悄然潜伏——内网证书过期。

好的,经过我们上面的说辞,我们本篇就来处理下 K8s 证书过期的相关案例,废话少说,直接开始。

开始

一、场景痛点与核心挑战

图片

典型场景:某金融集团私有化部署的K8s生产集群突现证书过期,导致API Server拒绝连接、kubelet节点失联。由于以下限制,常规修复手段失效:

• 网络隔离:集群部署于客户内网,禁止任何外网连接

• 安全合规:必须使用内部CA签发证书,禁用自签名和Let's Encrypt

• 业务SLA:核心交易系统要求99.99%可用性,停机时间需<5分钟

二、紧急救援:四步离线证书签发法

步骤1:构建离线应急工具包
# 工具包目录结构
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   # 证书部署脚本
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

关键文件说明

• ca-config.json:定义证书类型与有效期

{
  "signing":{
    "default":{
      "expiry":"8760h"
    },
    "profiles":{
      "kubernetes":{
        "usages":["signing","key encipherment","server auth","client auth"],
        "expiry":"8760h"
      }
    }
}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
步骤2:生成根CA证书(首次部署需操作)
# 生成CA私钥与证书
./cfssl gencert -initca conf/ca-csr.json | ./cfssljson -bare ca

# 输出文件:
# ca.pem     # CA证书
# ca-key.pem # CA私钥(绝密!)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
步骤3:签发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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

关键参数说明

• -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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

操作风险提示

• 需按顺序重启组件:API Server → Controller Manager → Scheduler

• 生产环境建议逐个节点滚动替换

三、长效机制:自动化证书生命周期管理

方案架构设计

图片图片

核心组件选型

组件

功能

推荐工具

证书签发

创建和管理X.509证书

HashiCorp Vault

轮换控制

监控证书有效期并触发更新

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天续期
  issuerRef:
    name: vault-issuer
    kind: ClusterIssuer
  dnsNames:
    - kubernetes.default.svc.cluster.local
    - k8s-api.example.com
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

关键参数

• renewBefore:设置早于证书过期时间触发续期

• duration:证书有效期,需符合企业安全策略

证书监控告警规则
# 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 }}"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

四、合规审计与灾备设计

审计检查清单

1. 私钥安全

  • 所有私钥文件权限设置为0400
  • 密钥存储启用Vault动态密钥加密

2. 证书信息合规

# 验证证书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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
跨集群灾备方案

1. 冷备份证书

# 定期导出证书和密钥
kubectl get secret apiserver-tls -o jsnotallow='{.data.tls\.crt}' | base64 -d > backup/apiserver-$(date +%Y%m%d).crt
  • 1.
  • 2.

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-----
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

五、实战案例:某银行私有云证书事件复盘

背景

• 集群规模:200节点,运行300+微服务

• 故障现象:控制平面证书过期导致调度器失联

处置过程

1. 紧急处置

  • 通过预置的离线工具包在15分钟内完成证书替换
  • 使用Ansible剧本批量滚动重启组件

2. 根因分析

• 原手动管理证书未设置监控告警

• 证书有效期仅设置为1年,未及时续期

3. 改进措施

• 部署Cert-Manager实现全自动轮换

• 建立双CA互信机制,支持无缝切换

成果

• 证书相关故障MTTR(平均修复时间)从4小时降至5分钟

• 全年未发生证书过期导致的业务中断

六、总结与资源

核心要点

• 紧急救援:标准化离线工具包 + 热替换脚本

• 长期治理:自动化轮换 + 双活CA架构

• 合规审计:密钥生命周期全记录 + 定期穿透测试

资源推荐

• HashiCorp Vault K8s指南[1]

• Cert-Manager官方文档[2]

• K8s证书管理白皮书[3]

立即行动

# 获取离线应急工具包
git clone https://github.com/k8s-cert/rescue-kit.git
cd rescue-kit && ./init.sh
  • 1.
  • 2.
  • 3.

通过这套方案,你的K8s集群将具备军工级证书管理能力,从容应对最严苛的私有化交付场景。

责任编辑:武晓燕 来源: 云原生运维圈
相关推荐

2022-12-28 10:52:34

Etcd备份

2022-04-22 13:32:01

K8s容器引擎架构

2023-11-06 07:16:22

WasmK8s模块

2020-07-22 09:25:11

DockerK8S云计算

2023-09-06 08:12:04

k8s云原生

2025-03-19 08:00:08

2024-12-06 08:00:00

K8s

2020-05-12 10:20:39

K8s kubernetes中间件

2022-09-05 08:26:29

Kubernetes标签

2023-08-03 08:36:30

Service服务架构

2023-08-04 08:19:02

2023-05-25 21:38:30

2025-03-19 08:01:10

Kubernetes集群源码

2019-11-14 09:55:39

K8S架构微服务

2020-02-04 16:37:17

k8s 相关应用

2023-03-05 21:50:46

K8s集群容量

2023-09-03 23:58:23

k8s集群容量

2021-04-12 20:42:50

K8S端口内存

2022-12-06 07:30:12

K8s云原生生态系统

2021-12-03 06:29:56

K8sDubboSpring
点赞
收藏

51CTO技术栈公众号