dbaplus社群 07月04日 14:35
救命!内网K8s证书过期,我差点上了公司“耻辱墙”……
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

在金融等强监管行业的私有化K8s部署中,证书过期是一个常见问题。本文介绍了紧急救援的四步离线证书签发法和长效机制的自动化证书生命周期管理方案,帮助解决API Server拒绝连接、kubelet节点失联等问题。

🔧 紧急救援:四步离线证书签发法包括构建离线应急工具包、生成根CA证书、签发K8s组件证书和集群证书热替换,有效解决证书过期导致的集群故障。

🔒 长效机制:自动化证书生命周期管理方案采用HashiCorp Vault进行证书签发,Cert-Manager配合Prometheus进行监控告警,实现证书的自动轮换和续期。

📜 合规审计:通过密钥存储在Vault中、审计证书操作日志等方式,确保私钥安全和证书信息的合规性,满足强监管行业的要求。

🔁 灾备设计:采用多CA互信架构和冷备份证书方案,实现跨集群灾备,提高系统的可用性和容错能力。

📊 实战案例:某银行私有云通过部署Cert-Manager和双CA互信机制,将证书故障的MTTR从4小时降至5分钟,全年未发生业务中断。

刘俊夏 2025-07-04 07:15 广东

一个“隐形杀手”正悄然潜伏……

引言

在数字化转型浪潮下,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/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

                关键参数:

                  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、私钥安全

                  • 所有私钥文件权限设置为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配置多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-----


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

                          背景

                            集群规模: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.git
                            cd rescue-kit && ./init.sh

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


                            结语

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

                            >>>>

                            引用链接


                            作者丨刘俊夏

                            来源丨公众号:云原生运维圈(ID:cloudnativeopscircle)

                            dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn


                            阅读原文

                            跳转微信打开

                            Fish AI Reader

                            Fish AI Reader

                            AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

                            FishAI

                            FishAI

                            鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

                            联系邮箱 441953276@qq.com

                            相关标签

                            Kubernetes 证书管理 自动化 安全合规
                            相关文章