【 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 和组件证书,然后替换集群中过期的证书并重启服务。这可以恢复集群的正常功能。

相关推荐
moppol40 分钟前
Serverless 架构入门与实战:AWS Lambda、Azure Functions、Cloudflare Workers 对比
云原生·serverless·aws
IvanCodes1 小时前
一、Docker:一场颠覆应用部署与运维的容器革命
docker·容器
栗子~~1 小时前
Milvus docker-compose 部署
docker·容器·milvus
没有名字的小羊3 小时前
2.安装Docker
运维·docker·容器
xiezhr3 小时前
50 个常用 Docker 命令
运维·docker·容器
退役小学生呀9 天前
三、kubectl使用详解
云原生·容器·kubernetes·k8s
被困者10 天前
Linux部署Sonic前后端(详细版)(腾讯云)
spring cloud·云原生·eureka
程序员小潘10 天前
Kubernetes多容器Pod实战
云原生·容器·kubernetes
进击的码码码码N10 天前
Docker 镜像加速
运维·docker·容器