K8S证书过期如何升级集群

作为一名经验丰富的开发者,你可能会遇到Kubernetes(简称K8S)集群的证书过期问题。当Kubernetes集群的证书过期后,会导致无法正常访问集群的Master节点以及API Server,这将对整个系统造成严重影响。为了解决这个问题,我们需要更新证书并升级集群。下面我将分步骤详细介绍如何实现这一过程。

步骤如下:

| 步骤 | 描述 |
| ---- | ---- |
| 1. | 生成新的证书 |
| 2. | 更新Master节点的证书 |
| 3. | 更新API Server的证书 |
| 4. | 更新Worker节点的证书 |
| 5. | 重启集群 |

接下来,我将逐步说明每个步骤需要做什么,并提供相应的代码示例。

### 1. 生成新的证书
首先,我们需要生成新的证书。可以使用OpenSSL来生成证书。下面是一个示例脚本,用于生成新的证书。

```bash
$ openssl req -new -newkey rsa:2048 -nodes -keyout new-key.pem -out new-csr.pem -subj "/CN=kubernetes/O=system:masters" -config openssl.cnf
```

解释:
- `openssl req`:这是使用OpenSSL生成CSR(Certificate Signing Request)的命令。
- `-new`:创建一个新的CSR。
- `-newkey rsa:2048`:为证书生成一个RSA加密的私钥。
- `-nodes`:不加密生成的私钥。
- `-keyout new-key.pem`:生成的私钥保存到new-key.pem文件。
- `-out new-csr.pem`:生成的CSR保存到new-csr.pem文件。
- `-subj "/CN=kubernetes/O=system:masters"`:指定CSR中的Subject,这里以kubernetes/O=system:masters为例。
- `-config openssl.cnf`:指定使用openssl.cnf配置文件。

### 2. 更新Master节点的证书
接下来,我们需要更新Master节点上的证书。在Kubernetes集群中,Master节点通常由多个组件组成,例如etcd、kube-apiserver、kube-controller-manager和kube-scheduler。我们需要对每个组件的证书进行更新。

- 更新etcd证书:
```bash
$ ETCD_PEER_CERT_FILE=/etc/kubernetes/pki/etcd/peer.crt
$ ETCD_PEER_KEY_FILE=/etc/kubernetes/pki/etcd/peer.key
$ ETCD_SERVER_CERT_FILE=/etc/kubernetes/pki/etcd/server.crt
$ ETCD_SERVER_KEY_FILE=/etc/kubernetes/pki/etcd/server.key

$ cp new-csr.pem /etc/kubernetes/pki/etcd/peer.csr
$ cp new-key.pem /etc/kubernetes/pki/etcd/peer.key

$ ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --name etcd-master-member peer tls refresh --cert-file $ETCD_PEER_CERT_FILE --key-file $ETCD_PEER_KEY_FILE --srv-cert-file $ETCD_SERVER_CERT_FILE --srv-key-file $ETCD_SERVER_KEY_FILE
```

解释:
- `ETCD_PEER_CERT_FILE`:etcd节点的PEER证书路径。
- `ETCD_PEER_KEY_FILE`:etcd节点的PEER私钥路径。
- `ETCD_SERVER_CERT_FILE`:etcd节点的Server证书路径。
- `ETCD_SERVER_KEY_FILE`:etcd节点的Server私钥路径。
- `etcdctl`:etcd的命令行工具。
- `--endpoints https://127.0.0.1:2379`:etcd的地址。
- `--cacert /etc/kubernetes/pki/etcd/ca.crt`:etcd的CA证书路径。
- `--name etcd-master-member`:etcd成员名称。
- `peer tls refresh`:刷新etcd节点的证书。

- 更新kube-apiserver证书:
```bash
$ cp new-key.pem /etc/kubernetes/pki/apiserver.key
$ cp new-csr.pem /etc/kubernetes/pki/apiserver.csr

$ kubeadm alpha certs renew apiserver
```

解释:
- `kubeadm alpha certs renew apiserver`:使用kubeadm工具更新kube-apiserver证书。

- 更新kube-controller-manager证书:
```bash
$ cp new-key.pem /etc/kubernetes/pki/controller-manager.key
$ cp new-csr.pem /etc/kubernetes/pki/controller-manager.csr

$ kubeadm alpha certs renew controller-manager
```

解释:
- `kubeadm alpha certs renew controller-manager`:使用kubeadm工具更新kube-controller-manager证书。

- 更新kube-scheduler证书:
```bash
$ cp new-key.pem /etc/kubernetes/pki/scheduler.key
$ cp new-csr.pem /etc/kubernetes/pki/scheduler.csr

$ kubeadm alpha certs renew scheduler
```

解释:
- `kubeadm alpha certs renew scheduler`:使用kubeadm工具更新kube-scheduler证书。

### 3. 更新API Server的证书
接下来,我们需要更新API Server的证书。API Server是Kubernetes集群中的核心组件,它提供了对集群的访问和管理接口。

```bash
$ cp new-csr.pem /etc/kubernetes/pki/apiserver-etcd-client.csr
$ cp new-key.pem /etc/kubernetes/pki/apiserver-etcd-client.key

$ ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/apiserver-etcd-client.csr --key /etc/kubernetes/pki/apiserver-etcd-client.key put /registry/configmaps/kube-system/kube-apiserver-client::/registry/certificates.k8s.io/kube-apiserver-client/certificates/api-client.crt
$ ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/apiserver-etcd-client.csr --key /etc/kubernetes/pki/apiserver-etcd-client.key put /registry/configmaps/kube-system/kube-apiserver-client::/registry/certificates.k8s.io/kube-apiserver-client/certificates/api-client.key

$ kubectl delete pod -n kube-system kube-apiserver-master
```

解释:
- `apiserver-etcd-client`:API Server与etcd之间的客户端证书。
- `put`:将新的cert和key写入etcd的配置项中。
- `kubectl delete pod`:重启kube-apiserver Pod,让新的证书生效。

### 4. 更新Worker节点的证书
最后,我们需要更新Worker节点的证书。Worker节点上的证书是用于与Master节点和API Server进行通信的。

```bash
$ cp new-csr.pem /etc/kubernetes/pki/front-proxy-client.csr
$ cp new-key.pem /etc/kubernetes/pki/front-proxy-client.key

$ kubeadm alpha kubeconfig user --client-name system:kube-proxy --org system:kube-proxy > /var/lib/kube-proxy/kubeconfig
$ kubectl delete pod -n kube-system kube-proxy-master
$ kubectl delete pod -n kube-system metrics-server-master
```

解释:
- `front-proxy-client`:Worker节点与Master节点和API Server之间的代理客户端证书。
- `kubeadm alpha kubeconfig user`:使用kubeadm工具为kube-proxy用户生成kubeconfig文件。
- `kubectl delete pod`:重启kube-proxy和metrics-server Pod,让新的证书生效。

### 5. 重启集群
在完成以上步骤后,我们需要重启整个集群,以使新的证书生效。

```bash
$ systemctl restart kubelet
```

解释:
- `systemctl restart kubelet`:重启kubelet服务。

以上就是更新Kubernetes集群证书的流程和相应的代码示例。通过按照步骤进行操作,你可以很容易地解决K8S证书过期的问题,并成功升级集群。希望能对你有所帮助!