【 Kubernetes 风云录 】- Cert证书更新

Cert证书更新

文章目录

  • Cert证书更新
    • [生成新的 CA 证书和私钥](#生成新的 CA 证书和私钥)
      • [生成 CA 配置文件(可选)](#生成 CA 配置文件(可选))
      • [使用 `cfssl` 生成 CA 证书](#使用 cfssl 生成 CA 证书)
    • [生成 Kubernetes 组件证书和私钥](#生成 Kubernetes 组件证书和私钥)
      • [准备 JSON 配置文件](#准备 JSON 配置文件)
      • [生成私钥和 CSR(证书签名请求)](#生成私钥和 CSR(证书签名请求))
    • [使用 CA 签署组件证书**](#使用 CA 签署组件证书**)
      • [`ca-config.json` 示例](#ca-config.json 示例)
      • 文件说明
      • [使用 `ca-config.json` 签发证书](#使用 ca-config.json 签发证书)
    • 替换现有证书
    • [重启 Kubernetes 组件](#重启 Kubernetes 组件)
    • 验证证书更新
    • 总结

⚡️: 在安装K8S 节点的时候,使用的是手动签发 1年后Kubernetes 集群日志中出现 certificate has expired or is not yet valid 错误信息时,表明证书过期。

如果你没有现有的 CA 证书(如 ca.pemca-key.pem),你需要先创建一个新的 CA(Certificate Authority)来签署 Kubernetes 组件的证书。以下是如何在没有 CA 证书的情况下生成新的 CA 证书并更新集群中其他组件证书的步骤。

生成新的 CA 证书和私钥

首先,生成新的 CA 证书和私钥。这将为你创建用于签署其他 Kubernetes 组件证书的根 CA。

生成 CA 配置文件(可选)

你可以创建一个 CA 的配置 JSON 文件来定义 CA 证书的内容,比如 ca-csr.json

json 复制代码
{
  "CN": "Kubernetes-CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
        "C": "CN",
        "ST": "SuZhou",
        "L": "SuZhou",
        "O": "k8s",
        "OU": "System"
    }
  ]
}

使用 cfssl 生成 CA 证书

使用 cfssl 工具生成新的 CA 证书和私钥:

bash 复制代码
[root@ycloud proxy-client]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

此命令将生成两个文件:

  • ca.pem: CA 根证书。
  • ca-key.pem: CA 私钥。

这些文件将用于签署 Kubernetes 组件的证书。

生成 Kubernetes 组件证书和私钥

现在你可以使用新生成的 CA 来为 Kubernetes 组件(如 API server、controller manager、scheduler 等)创建证书。

准备 JSON 配置文件

为每个组件创建一个 JSON 文件来定义证书请求参数。例如,kube-apiserver-csr.json

json 复制代码
{
  "CN": "kube-apiserver",
  "hosts": [
    "127.0.0.1",
    "kubernetes.default.svc",
    "10.96.0.1"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "San Francisco",
      "O": "Kubernetes",
      "OU": "Kubernetes The Hard Way"
    }
  ]
}

生成私钥和 CSR(证书签名请求)

使用 cfssl 生成私钥和 CSR 文件:

bash 复制代码
[root@ycloud proxy-client]#  cfssl genkey kube-apiserver-csr.json | cfssljson -bare kube-apiserver

此命令将生成:

  • kube-apiserver-key.pem: 私钥。
  • kube-apiserver.csr: 证书签名请求文件。

使用 CA 签署组件证书**

使用新生成的 CA 证书和私钥来签署 Kubernetes 组件证书,例如签署 kube-apiserver 证书:

bash 复制代码
[root@ycloud proxy-client]# cfssl sign -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile kubernetes kube-apiserver.csr | cfssljson -bare kube-apiserver

生成的 kube-apiserver.pem 是新的 API server 证书。

ca-config.json 是 CA(Certificate Authority)配置文件,它定义了 CA 签发证书时的一些全局配置和策略,比如有效期、不同证书类型的 profile 等。通常在使用 cfssl 工具时,这个文件用来指定 CA 签发证书的行为。

如果你还没有 ca-config.json 文件,你可以创建一个。例如,这里是一个典型的 ca-config.json 文件的示例:

ca-config.json 示例

bash 复制代码
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "expiry": "87600h",
        "usages": ["signing", "key encipherment", "server auth", "client auth"]
      }
    }
  }
}

文件说明

  • signing: 定义 CA 可以用来签发证书。

  • default : 设置默认的证书有效期,这里 87600h 表示十年。

  • :
    定义不同的证书类型。这里我们定义了 kubernetes 这个 profile。

    • expiry : 设置该 profile 下生成的证书有效期,87600h 同样表示十年。

    • :
      定义证书的使用场景,常见的有:

      • signing: 表示证书可以用来签署其他证书。
      • key encipherment: 表示证书用于密钥加密。
      • server auth: 表示证书用于服务器认证(如 Kubernetes API Server)。
      • client auth: 表示证书用于客户端认证(如 kubelet、kubectl)。

使用 ca-config.json 签发证书

有了 ca-config.json 文件后,你可以在签发证书时指定它。例如:

bash 复制代码
[root@ycloud proxy-client]# cfssl sign -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile kubernetes kube-apiserver.csr | cfssljson -bare kube-apiserver
  • -ca: 指定 CA 证书。
  • -ca-key: 指定 CA 私钥。
  • -config: 指定 ca-config.json 文件,用于签发证书时的配置。
  • -profile: 使用 kubernetes profile 来签发证书,这个 profile 是我们在 ca-config.json 中定义的。

这样,你的 CA 就会根据配置文件中指定的有效期和用途来签发符合 Kubernetes 需求的证书。

替换现有证书

将新生成的证书和私钥替换过期的证书。例如:

bash 复制代码
[root@ycloud proxy-client]# mv /etc/kubernetes/pki/kube-apiserver.pem /etc/kubernetes/pki/kube-apiserver.pem.bak
[root@ycloud proxy-client]# cp kube-apiserver.pem /etc/kubernetes/pki/kube-apiserver.pem

[root@ycloud proxy-client]# mv /etc/kubernetes/pki/kube-apiserver-key.pem /etc/kubernetes/pki/kube-apiserver-key.pem.bak
[root@ycloud proxy-client]# cp kube-apiserver-key.pem /etc/kubernetes/pki/kube-apiserver-key.pem

重启 Kubernetes 组件

替换证书后,重启相关的 Kubernetes 组件:

bash 复制代码
[root@ycloud proxy-client]# sudo systemctl restart kube-apiserver
[root@ycloud proxy-client]# sudo systemctl restart kube-controller-manager
[root@ycloud proxy-client]# sudo systemctl restart kube-scheduler
[root@ycloud proxy-client]# sudo systemctl restart kubelet

验证证书更新

验证 Kubernetes 集群是否正常工作:

bash 复制代码
[root@ycloud proxy-client]# kubectl get nodes

验证证书过期时间:

bash 复制代码
[root@ycloud proxy-client]# openssl x509 -in /etc/kubernetes/proxy-client/kube-apiserver.pem -noout -dates
notBefore=Sep 14 05:12:00 2024 GMT
notAfter=Sep 12 05:12:00 2034 GMT

总结

在没有 CA 证书的情况下,你需要先创建一个新的 CA 证书,并使用它签署 Kubernetes 组件的证书。通过 cfssl 工具,你可以生成新的 CA 和组件证书,然后替换集群中过期的证书并重启服务。这可以恢复集群的正常功能。

相关推荐
川石课堂软件测试26 分钟前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!7 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis9 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
wclass-zhengge10 小时前
Docker篇(Docker Compose)
运维·docker·容器
茶馆大橘10 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
北漂IT民工_程序员_ZG10 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
coding侠客10 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
梦魇梦狸º13 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
南猿北者16 小时前
docker镜像仓库常用命令
运维·docker·容器
2301_8061313617 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes