本文全面介绍了 Kubernetes 集群中证书管理的核心知识,包括查看各个组件证书过期时间的方法,以及在证书过期时如何安全更新证书的完整操作流程。通过详细的命令示例和步骤说明,帮助管理员有效监控和维护 Kubernetes 集群的证书状态,确保集群的安全性和稳定性。内容涵盖了从证书过期检测到实际更新的全过程,为生产环境的证书管理提供了实用指南。

一、查看 Kubernetes 各个组件证书过期时间

证书是 Kubernetes 集群安全通信的基础,定期检查证书过期时间对于预防集群故障至关重要。本节介绍如何查看集群中各个核心组件的证书过期时间,帮助管理员及时发现即将过期的证书,避免因证书过期导致的服务中断。

1. 查看 Kubernetes API Server 证书过期时间

API Server 是 Kubernetes 集群的核心组件,其证书过期会导致整个集群无法访问。通过定位证书所在目录(通常在 /etc/kubernetes/ssl/),使用 openssl 命令查看证书的过期时间。这是监控集群健康状态的第一步,建议定期执行以确保 API Server 证书的有效性。

cd /etc/kubernetes/ssl/
openssl x509 -in server.pem -noout -enddate

在这里插入图片描述

2. 查看 ETCD 证书过期时间

ETCD 是 Kubernetes 的分布式键值存储,存储了集群的所有配置数据。使用 openssl 命令查看 ETCD 服务器证书的过期时间,确保集群的底层存储系统通信正常。ETCD 证书过期会导致集群无法启动或运行异常。

openssl x509 -in server.pem -noout -enddate

3. 查看 kube-controller-manager 证书过期时间

kube-controller-manager 负责运行控制器进程,如节点控制器、副本控制器等。检查其证书过期时间可以预防控制器功能异常,避免集群的资源管理出现问题。

openssl x509 -in kube-controller-manager.pem -noout -enddate

在这里插入图片描述

4. 查看 kube-scheduler 证书过期时间

kube-scheduler 负责将 Pod 调度到合适的节点上。确保其证书有效是保障集群调度功能正常的关键,证书过期可能导致新的 Pod 无法被调度。

openssl x509 -in kube-scheduler.pem -noout -enddate

在这里插入图片描述

5. 查看 kube-proxy 证书过期时间

kube-proxy 负责 Service 的网络代理和负载均衡。检查其证书过期时间可以避免 Service 网络功能中断,确保集群内部和外部通信正常。

openssl x509 -in kube-proxy.pem -noout -enddate

在这里插入图片描述

二、证书过期更新模拟与操作流程

当发现证书即将过期或已经过期时,需要及时更新证书以恢复集群功能。本节通过模拟证书过期的场景,详细介绍备份现有证书、更新各个组件证书以及更新 ETCD 证书的完整操作流程,确保更新过程安全可靠。

1. 备份现有证书

在进行任何证书更新操作之前,首先备份现有的证书和相关配置文件。这是安全操作的基本原则,可以在更新过程中出现问题时快速恢复集群到原始状态。

# 在 master-1 节点上执行
cp -r /etc/kubernetes/ssl /etc/kubernetes/ssl_backup
cp -r /root/etcd /root/etcd_backup
cp -r /root/kubernetes /root/kubernetes_backup

2. 更新 CA 证书和 API Server 证书

CA 证书是集群所有证书的信任根,API Server 证书是集群通信的核心。重新生成 CA 证书和 API Server 证书时,需要确保配置文件中的 hosts 列表包含集群中所有相关的节点 IP 和主机名。生成新证书后,将其分发到所有节点并重启 API Server 服务以生效。

# 进入证书生成目录
# 生成 ca-config.json
cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

# 生成 ca-csr.json
cat << EOF | tee ca-csr.json
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

# 生成 server-csr.json
cat << EOF | tee server-csr.json
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      "10.0.0.2",
      "192.168.91.18",
      "192.168.91.19",
      "192.168.91.20",
      "192.168.91.21",
      "192.168.91.22",
      "192.168.91.254",
      "master-1",
      "master-2",
      "master-3",
      "node-1",
      "node-2",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

# 生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

# 分发证书到其他节点
for i in master-2 master-3 node-1 node-2; do scp /root/kubernetes/*.pem $i:/etc/kubernetes/ssl/; done

# 重启 kube-apiserver 服务
systemctl daemon-reload
service kube-apiserver restart

3.更新 kube-controller-manager 证书

kube-controller-manager 需要有效的证书与 API Server 通信。重新生成证书时,确保 CSR 配置文件中的 hosts 列表包含所有运行 kube-controller-manager 的节点 IP。生成证书后,分发到其他 master 节点并重启服务。

# 进入证书目录
cd /root/kubernetes
# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
# 复制证书到其他 master 节点
cp /root/kubernetes/kube-controller-manager*.pem /etc/kubernetes/ssl/
for i in master-2 master-3; do scp /etc/kubernetes/ssl/kube-controller-manager*.pem $i:/etc/kubernetes/ssl/; done

systemctl daemon-reload
service kube-controller-manager restart

4.更新 kube-scheduler 证书

kube-scheduler 的证书更新流程与 kube-controller-manager 类似。重新生成证书后,分发到其他 master 节点并重启服务,确保调度器能够正常与 API Server 通信。

cd /root/kubernetes
cfssl gencert -ca=ca.pem -ca-key=ca.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
cp /root/kubernetes/kube-scheduler*.pem /etc/kubernetes/ssl/
for i in master-2 master-3; do scp /etc/kubernetes/ssl/kube-scheduler*.pem $i:/etc/kubernetes/ssl/; done

systemctl daemon-reload
service kube-scheduler restart

5.更新 kube-proxy 证书

kube-proxy 在每个节点上运行,负责 Service 的流量转发。更新其证书时,需要为所有节点生成新的证书,并分发到每个节点。更新后重启 kube-proxy 服务,确保网络代理功能正常。

cd /root/kubernetes
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
cp /root/kubernetes/kube-proxy*.pem /etc/kubernetes/ssl/
for i in node-1 node-2; do scp /etc/kubernetes/ssl/kube-proxy*.pem $i:/etc/kubernetes/ssl/; done

6.更新 ETCD 证书(如果 ETCD 证书也过期)

ETCD 证书过期会导致集群无法访问存储的数据。更新 ETCD 证书需要重新生成 CA 和服务器证书,确保 hosts 列表包含所有 ETCD 节点。将新证书分发到所有 ETCD 节点并重启服务,恢复集群的存储功能。

# 进入 ETCD 证书目录
cd /root/etcd
# 生成 ca-config.json
cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

# 生成 ca-csr.json
cat << EOF | tee ca-csr.json
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

# 生成 server-csr.json
cat << EOF | tee server-csr.json
{
    "CN": "etcd",
    "hosts": [
    "master-1",
    "master-2",
    "master-3",
    "192.168.91.18",
    "192.168.91.19",
    "192.168.91.20"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

# 生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

# 分发证书到所有需要的节点
for i in master-2 master-3 node-1 node-2; do scp /root/etcd/*.pem $i:/etc/etcd/ssl/; done

systemctl daemon-reload
service etcd restart

三、总结

Kubernetes 集群证书管理是保障集群长期稳定运行的关键任务。通过定期检查证书过期时间,管理员可以提前发现潜在风险,避免因证书过期导致的集群服务中断。本文提供的查看和更新证书的完整流程,帮助管理员系统性地管理集群证书。

1.核心要点总结

  • 定期检查:建议每季度检查一次集群核心组件的证书过期时间,建立定期检查机制。
  • 及时更新:在证书过期前至少一个月开始准备更新工作,避免紧急情况下操作失误。
  • 安全备份:更新证书前必须备份现有证书和配置,确保有回退方案。
  • 按序操作:按照正确的顺序更新证书,先更新 CA 和 API Server,再更新其他组件。
  • 验证测试:每次更新后都要验证组件功能,确保集群正常运行。

2.最佳实践建议

  • 自动化监控:使用监控工具自动检测证书过期时间并发送告警。
  • 文档记录:详细记录每次证书更新的操作步骤和时间,便于审计和排查问题。
  • 团队协作:证书更新操作涉及多个组件,需要团队成员协作完成。
  • 测试环境验证:在生产环境更新前,先在测试环境验证更新流程。
  • 考虑证书轮换:对于大规模集群,考虑实施自动证书轮换机制。

通过遵循本文的指导原则和操作步骤,管理员可以有效地管理 Kubernetes 集群证书,确保集群的安全性和高可用性,为业务应用提供稳定可靠的基础设施支撑。

更多推荐