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

刘俊夏 2025-07-04 10:07:26

引言

 

在数字化转型浪潮下,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   # 证书部署脚本

 

关键文件说明:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
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私钥(绝密!)

 

 

步骤3:签发K8s组件证书

 

API Server证书示例:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 生成私钥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中的策略

 

 

步骤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

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

 

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

 

 

方案架构设计

 

核心组件选型
 
组件 功能 推荐工具
证书签发
创建和管理X.509证书
HashiCorp Vault
轮换控制
监控证书有效期并触发更新
Cert-Manager + Prometheus
密钥存储
安全存储CA私钥
Vault KMIP引擎
审计跟踪
记录所有证书操作日志
ELK Stack

Cert-Manager自动化配置

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:  name: vault-issuerspec:  vault:    path: pki/sign/k8s-cluster    server: https://vault.example.com    caBundle: LS0tLS1CRUdJ...  # Base64编码的CA证书---apiVersion: cert-manager.io/v1kind: Certificatemetadata:  name: apiserver-certspec:  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

 

关键参数:

 

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

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

 

 

证书监控告警规则

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# Prometheus告警规则-alert:K8sCertificateExpiryexpr:kubelet_server_certificate_expiration_seconds{job="kubelet"}/86400<30for:10mlabels:    severity:criticalannotations:    summary:"证书 {{ $labels.host }} 将在30天内过期"    description: "证书路径: {{ $labels.path }}"

 

四、合规审计与灾备设计

 

 

审计检查清单

 

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

 

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 jsonpath='{.data.tls\.crt}' | base64 -d > backup/apiserver-$(date +%Y%m%d).crt

 

2、多CA互信架构

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# K8s API Server配置多CAapiVersion: v1kind: ConfigMapmetadata:  name: kube-apiserver-cadata:  ca-bundle.crt: |    -----BEGIN CERTIFICATE-----    # Primary CA    -----END CERTIFICATE-----    -----BEGIN CERTIFICATE-----    # Backup CA    -----END CERTIFICATE-----

 

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

 

 

背景

 

  • 集群规模: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 地址不存在,请查看评论区k8s-cert/rescue-kit.gitcd rescue-kit && ./init.sh

 

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

 

结语

 

以上就是我们今天的内容,希望可以帮助到大家,在面试中游刃有余,主动出击。

 

>>>>

引用链接

  • [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-whitepaper

 

作者丨刘俊夏
来源丨公众号:云原生运维圈(ID:cloudnativeopscircle)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告