整体流程如下:
步骤|操作
-|-
1|生成CA(根证书颁发机构)证书和私钥
2|生成用于K8s集群的证书和私钥
3|生成Kubelet TLS Bootstrapping证书和私钥
4|签署Kubelet Bootstrap证书
5|向集群中的每个节点分发证书和私钥
6|验证证书的正确性
下面是根据以上流程逐步进行说明。
**步骤1:生成CA证书和私钥**
首先,我们需要生成根证书颁发机构(CA)的证书和私钥。CA证书是用于签署和验证K8s集群中其他证书的根证书。
代码示例:
```shell
# 创建一个专用目录来存储CA证书和私钥
$ mkdir -p /root/ca
$ cd /root/ca
# 生成并保存CA的私钥
$ openssl genrsa -out ca.key 2048
# 生成自签名的CA证书
$ openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
```
**步骤2:生成K8s集群证书和私钥**
接下来,我们需要生成用于K8s集群的证书和私钥。这些证书将用于K8s集群中的各个组件(如API Server、Controller Manager、Scheduler等)之间的通信。
代码示例:
```shell
# 创建一个专用目录来存储K8s集群证书和私钥
$ mkdir -p /root/kubernetes-certs
$ cd /root/kubernetes-certs
# 生成API Server证书和私钥
$ openssl genrsa -out apiserver.key 2048
$ openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes" -config openssl.cnf
$ openssl x509 -req -in apiserver.csr -CA /root/ca/ca.crt -CAkey /root/ca/ca.key -CAcreateserial -out apiserver.crt -days 365 -extensions v3_req -extfile openssl.cnf
# 生成Controller Manager证书和私钥
$ openssl genrsa -out controller-manager.key 2048
$ openssl req -new -key controller-manager.key -out controller-manager.csr -subj "/CN=system:controller-manager" -config openssl.cnf
$ openssl x509 -req -in controller-manager.csr -CA /root/ca/ca.crt -CAkey /root/ca/ca.key -CAcreateserial -out controller-manager.crt -days 365 -extensions v3_req -extfile openssl.cnf
```
**步骤3:生成Kubelet TLS Bootstrapping证书和私钥**
接下来,我们需要生成用于Kubelet TLS Bootstrapping的证书和私钥。
代码示例:
```shell
# 创建一个专用目录来存储Kubelet证书和私钥
$ mkdir -p /root/kubelet/
$ cd /root/kubelet/
# 生成Kubelet TLS Bootstrapping证书和私钥
$ openssl genrsa -out kubelet.key 2048
$ openssl req -new -key kubelet.key -out kubelet.csr -subj "/CN=system:node:node1" -config openssl.cnf
```
**步骤4:签署Kubelet Bootstrap证书**
接下来,我们需要签署Kubelet Bootstrap证书,以便Kubelet能够与API Server通信。
代码示例:
```shell
# 创建Bootstrap请求的配置文件
$ cat > kubelet-bootstrap-csr.json <
"CN": "kubelet-bootstrap",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN"
}
]
}
EOF
# 使用CA证书和私钥签署Bootstrap证书
$ cfssl gencert -ca=/root/ca/ca.crt -ca-key=/root/ca/ca.key -config=ca-config.json -profile=kubernetes kubelet-bootstrap-csr.json | cfssljson -bare kubelet-bootstrap
```
**步骤5:分发证书和私钥**
现在,我们需要将生成的证书和私钥分发到K8s集群中的每个节点上。这些证书和私钥将用于节点和其他组件之间的安全通信。
代码示例:
```shell
# 将证书和私钥分发到所有节点上
$ scp /root/ca/ca.crt [email protected]:/etc/kubernetes/
$ scp /root/kubernetes-certs/apiserver.crt [email protected]:/etc/kubernetes/
$ scp /root/kubernetes-certs/apiserver.key [email protected]:/etc/kubernetes/
$ scp /root/kubernetes-certs/controller-manager.crt [email protected]:/etc/kubernetes/
$ scp /root/kubernetes-certs/controller-manager.key [email protected]:/etc/kubernetes/
$ scp /root/kubelet/kubelet-bootstrap.crt [email protected]:/etc/kubernetes/
$ scp /root/kubelet/kubelet-bootstrap.key [email protected]:/etc/kubernetes/
```
**步骤6:验证证书的正确性**
最后,我们需要验证证书的正确性。可以使用以下方法之一来验证证书:
- 使用`kubectl`工具检查API Server证书是否正确加载:`kubectl cluster-info`,并验证API Server的URL是否正确。
- 使用`openssl`工具验证证书是否有效:`openssl x509 -in ca.crt -text -noout`,`openssl x509 -in apiserver.crt -text -noout`等。
恭喜!你已经学会了如何实现K8s集群证书PKI。使用PKI可以确保K8s集群的安全性和可信度,同时提供加密和身份验证的功能。希望本文对你有所帮助!