Cert证书更新
文章目录
- Cert证书更新
- 生成新的 CA 证书和私钥
- 生成 CA 配置文件(可选)
- 使用 `cfssl` 生成 CA 证书
- 生成 Kubernetes 组件证书和私钥
- 准备 JSON 配置文件
- 生成私钥和 CSR(证书签名请求)
- 使用 CA 签署组件证书**
- `ca-config.json` 示例
- 文件说明
- 使用 `ca-config.json` 签发证书
- 替换现有证书
- 重启 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
:
{"CN": "Kubernetes-CA","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "SuZhou","L": "SuZhou","O": "k8s","OU": "System"}]
}
使用 cfssl
生成 CA 证书
使用 cfssl
工具生成新的 CA 证书和私钥:
[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
:
{"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 文件:
[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
证书:
[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
示例
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"expiry": "87600h","usages": ["signing", "key encipherment", "server auth", "client auth"]}}}
}
文件说明
-
signing
: 定义 CA 可以用来签发证书。 -
default
: 设置默认的证书有效期,这里87600h
表示十年。 -
- 定义不同的证书类型。这里我们定义了
kubernetes
这个 profile。
profiles
-
expiry
: 设置该 profile 下生成的证书有效期,87600h
同样表示十年。 -
- 定义证书的使用场景,常见的有:
usages
signing
: 表示证书可以用来签署其他证书。key encipherment
: 表示证书用于密钥加密。server auth
: 表示证书用于服务器认证(如 Kubernetes API Server)。client auth
: 表示证书用于客户端认证(如 kubelet、kubectl)。
- 定义不同的证书类型。这里我们定义了
使用 ca-config.json
签发证书
有了 ca-config.json
文件后,你可以在签发证书时指定它。例如:
[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 需求的证书。
替换现有证书
将新生成的证书和私钥替换过期的证书。例如:
[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 组件:
[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 集群是否正常工作:
[root@ycloud proxy-client]# kubectl get nodes
验证证书过期时间:
[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 和组件证书,然后替换集群中过期的证书并重启服务。这可以恢复集群的正常功能。