超穩攻略!Rancher 2.3手動輪換證書,保護叢集安全!
阿新 • • 發佈:2020-12-01
本文轉自[Rancher Labs](https://mp.weixin.qq.com/s/BFRmMVU4sUo3e-wnKHSP_A "Rancher Labs")
## 前 言
Rancher 2.3正式釋出已經一年,第一批使用Rancher 2.3的使用者可能會遇到Rancher Server證書過期,但是沒有自動輪換的情況。這會導致Rancher Server無法啟動,並且日誌出現報錯:
![](https://oscimg.oschina.net/oscnet/up-6857b7f99459b78a8c933f7870e02206380.JPEG)
請注意:
Rancher Server無法啟動不會影響下游叢集,下游叢集依然可以通過kubeconfig去操作。
> 請注意:
>
>Rancher Server無法啟動不會影響下游叢集,下游叢集依然可以通過kubeconfig去操作。
>
>以上情況只會在docker run啟動或使用小於k3s v1.19用作local叢集的Rancher上才會發生。以上情況只會在`docker run`啟動或使用小於k3s v1.19用作local叢集的Rancher上才會發生。
## 重現問題
為了讓大家更好的理解這個問題,下面將以手動修改系統時間的形式來重現這個問題。
當前時間:`2020年10月30日 星期五 10時37分59秒 CST`
1、啟動Rancher v2.3.1,並且新增下游叢集,操作步驟可以參考官網:
- https://docs.rancher.cn/docs/rancher2/installation/other-installation-methods/single-node-docker/_index/
- https://docs.rancher.cn/docs/rancher2/cluster-provisioning/_index
2、啟動Rancher 之後,從瀏覽器上檢視到的過期時間:`2021年10月30日 星期六 中國標準時間 10:29:35`
![](https://oscimg.oschina.net/oscnet/up-83809021626c82a2bcbd4986d564a94d89f.JPEG)
3、檢視Rancher Server容器內的K3s證書過期時間為 `Oct 30 02:28:49 2021 GMT`
```
root@rancher1:~# docker exec -it rancher_server_id bash
root@25c228f6a4c8:/var/lib/rancher# for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
/var/lib/rancher/k3s/server/tls/client-admin.crt
notAfter=Oct 30 02:28:49 2021 GMT
/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt
notAfter=Oct 30 02:28:49 2021 GMT
/var/lib/rancher/k3s/server/tls/client-ca.crt
notAfter=Oct 28 02:28:49 2030 GMT
/var/lib/rancher/k3s/server/tls/client-controller.crt
notAfter=Oct 30 02:28:49 2021 GMT
/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt
notAfter=Oct 30 02:28:49 2021 GMT
/var/lib/rancher/k3s/server/tls/client-kube-proxy.crt
notAfter=Oct 30 02:28:49 2021 GMT
/var/lib/rancher/k3s/server/tls/client-scheduler.crt
notAfter=Oct 30 02:28:49 2021 GMT
/var/lib/rancher/k3s/server/tls/request-header-ca.crt
notAfter=Oct 28 02:28:49 2030 GMT
/var/lib/rancher/k3s/server/tls/server-ca.crt
notAfter=Oct 28 02:28:49 2030 GMT
/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt
notAfter=Oct 30 02:28:49 2021 GMT
```
4、將伺服器時間調整為證書過期後5天的日期,比如:`20211105`
```
root@rancher1:~# timedatectl set-ntp no
root@rancher1:~# date -s 20211105
Fri Nov 5 00:00:00 CST 2021
root@rancher1:~# date
Fri Nov 5 00:00:00 CST 2021
```
此時,Rancher UI 已經無法訪問:
![](https://oscimg.oschina.net/oscnet/up-5ccd36b423b8cc7736c8c9d146e399f4f98.JPEG)
並且Rancher 容器由於內建的K3s證書過期而不斷重啟。
## 手動輪換證書
以上現象是因為Rancher Server內建的K3s證書過期,導致K3s無法啟動,從而導致Rancher Server容器無法啟動。
為了可以繼續操作Rancher Server容器,需要將系統時間調整到K3s證書過期之前。
```
root@rancher1:~# date -s 20211025
Mon Oct 25 00:00:00 CST 2021
```
>如果啟動Rancher時未加`--restart=unless-stopped`引數,需要手動啟動Rancher Server。
接下來我們就可以進入到容器內手動刪除K3s證書,然後重啟Rancher,重啟成功後將重新生成K3s證書。
```
root@rancher1:~# docker exec -it rancher_server_id bash
root@25c228f6a4c8:/var/lib/rancher# rm -rf /var/lib/rancher/k3s/server/tls/*.crt
root@25c228f6a4c8:/var/lib/rancher# exit
exit
root@rancher1:~# docker restart rancher_server_id
```
Rancher Server如果出現以下日誌,那麼需要再重啟一次Rancher Server:
```
2021/10/24 16:01:00 [INFO] Waiting for server to become available: Get https://localhost:6443/version?timeout=30s: x509: certificate signed by unknown authority
```
## 驗 證
1、將伺服器時間再次調整為證書過期後5天的日期,比如:`20211105`
```
root@rancher1:~# date -s 20211105
Fri Nov 5 00:00:00 CST 2021
```
證書更新之後,我們需要確認K3s證書是否更新成功,還需要檢查下游叢集是否會有影響。
2、確認K3s證書已經更新
```
root@rancher1:~# docker exec -it rancher_server_id bash
root@25c228f6a4c8:/var/lib/rancher# for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
/var/lib/rancher/k3s/server/tls/client-admin.crt
notAfter=Oct 24 16:00:54 2022 GMT
/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt
notAfter=Oct 24 16:00:54 2022 GMT
/var/lib/rancher/k3s/server/tls/client-ca.crt
notAfter=Oct 22 16:00:54 2031 GMT
/var/lib/rancher/k3s/server/tls/client-controller.crt
notAfter=Oct 24 16:00:54 2022 GMT
/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt
notAfter=Oct 24 16:00:54 2022 GMT
/var/lib/rancher/k3s/server/tls/client-kube-proxy.crt
notAfter=Oct 24 16:00:54 2022 GMT
/var/lib/rancher/k3s/server/tls/client-scheduler.crt
notAfter=Oct 24 16:00:54 2022 GMT
/var/lib/rancher/k3s/server/tls/request-header-ca.crt
notAfter=Oct 22 16:00:54 2031 GMT
/var/lib/rancher/k3s/server/tls/server-ca.crt
notAfter=Oct 22 16:00:54 2031 GMT
/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt
notAfter=Oct 24 16:00:54 2022 GMT
```
K3s證書過期時間已經從`Oct 30 02:28:49 2021 GMT`更新到了`Oct 24 16:00:54 2022 GMT`
3、確認瀏覽器證書已經更新
瀏覽器上的證書過期已經從`2021年10月30日 星期六 中國標準時間 10:29:35`更新到了`2022年10月25日 星期二 中國標準時間 00:01:34`
![](https://oscimg.oschina.net/oscnet/up-f035f99e5a29291f9e2d2323f72bbe6b0ab.JPEG)
4、確認下游叢集不受影響
- 叢集狀態為`Active`
![](https://oscimg.oschina.net/oscnet/up-8559fbf6e8b842ebc4d39c0cd027c263efd.JPEG)
- 檢查叢集 Pod 的執行狀況
![](https://oscimg.oschina.net/oscnet/up-eaa5e25bb27ea760564c4e212671639120b.JPEG)
## 後 記
從Rancher 2.3開始,Rancher Server容器中內建了K3s作為local叢集來支撐Rancher Server執行。
而K3s內部自動簽發的證書有效期是1年,正常情況下如果證書已過期或剩餘的時間少於90天,則在重新啟動K3s時將輪換證書。參考官方文件:
https://docs.rancher.cn/docs/k3s/advanced/_index
實際上由於K3s的bug導致在證書已過期或剩餘的時間少於90天時重啟Rancher,沒有將K3s證書輪換,所以才會出現上述問題。
不過無需擔心,在後續的K3s v1.19版本中已經解決了這一問題,請參考:
https://github.com/rancher/k3s/commit/a2471a1f8a2aa26902f8e3b29624dc9c