Kubernetes(K8s)是一种容器编排系统,用于自动化部署、扩展和操作应用程序容器。在使用K8s集群时,为了保证集群的安全性和可信度,需要使用PKI(公钥基础设施)来生成、管理和分发证书。本文将详细介绍如何实现k8s集群证书PKI。

整体流程如下:

步骤|操作
-|-
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集群的安全性和可信度,同时提供加密和身份验证的功能。希望本文对你有所帮助!