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
签发证书)
- [`ca-config.json` 示例](#
- 替换现有证书
- [重启 Kubernetes 组件](#重启 Kubernetes 组件)
- 验证证书更新
- 总结
⚡️: 在安装K8S 节点的时候,使用的是手动签发 1年后Kubernetes 集群日志中出现 certificate has expired or is not yet valid 错误信息时,表明证书过期。
如果你没有现有的 CA 证书(如 ca.pem
和 ca-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 和组件证书,然后替换集群中过期的证书并重启服务。这可以恢复集群的正常功能。