前 言
大部分Rancher用戶傾向於通過使用Rancher Server創建自定義集群。而創建完成之后,也許會因為各種各樣的原因導致 Rancher Server 無法繼續管理該集群,比如誤刪 Rancher Server 或備份數據無法恢復等。遇到此類問題,通常的解決方案是重新啟動一個 Rancher Server 並將下游業務集群導入並納管,但這樣會導致一些“后遺症”,比如無法繼續擴展業務集群的節點。
為了消除這一“后遺症”的影響,我們可以通過RKE納管Rancher Server 創建的“自定義”集群。
正如你所知,Rancher Server 通過 UI 創建的"自定義"集群,后端是通過 RKE 實現的,所以 RKE(https://docs.rancher.cn/rke/)有能力去納管Rancher Server 創建的“自定義”集群。
通過RKE 創建和管理 Kubernetes 集群,依賴 3 個文件:
-
cluster.yml:RKE 集群配置文件
-
kube_config_cluster.yml:該文件包含了獲取該集群所有權限的認證憑據
-
cluster.rkestate:Kubernetes 集群狀態文件,包含了獲取該集群所有權限的認證憑據
所以,只要能從下游業務集群中獲得這 3 個文件,就可以結合 RKE 二進制文件繼續管理下游業務集群。下面將詳細介紹如何通過 RKE 納管 Rancher Server 創建的“自定義”集群,並通過RKE擴展集群的節點。
演示環境
本文只針對 Rancher v2.4.x 和 v2.5.x 版本做了測試,其他版本可能不適用。
為了更好的演示效果,本文將從 Rancher Server 創建“自定義”集群開始,然后通過 RKE 納管"自定義"集群,最后為了確認 RKE 有能力納管集群,將演示通過 RKE 添加一個節點。
Rancher Server(ip-172-31-2-203)可以采用最簡單的docker run方式啟動,並通過 UI 創建一個"自定義"集群,集群中包括兩個節點:ip-172-31-2-203和ip-172-31-1-111, 詳細如下:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-1-111 Ready worker 2m2s v1.18.14
ip-172-31-2-203 Ready controlplane,etcd,worker 3m23s v1.18.14
RKE納管“自定義”集群
1、將ip-172-31-8-56 關機,模擬 Rancher Server 故障,此時無法通過 Rancher Server 繼續管理下游集群。
2、恢復下游業務集群的kube_config_cluster.yml文件,在controlplane節點上運行以下命令:
# docker run --rm --net=host \
-v $(docker inspect kubelet --format '{{ range .Mounts }}{{ if eq .Destination "/etc/kubernetes" }}{{ .Source }}{{ end }}{{ end }}')/ssl:/etc/kubernetes/ssl:ro \
--entrypoint bash $(docker inspect $(docker images -q --filter=label=io.cattle.agent=true) \
--format='{{index .RepoTags 0}}' | tail -1) \
-c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml get configmap \
-n kube-system full-cluster-state \
-o json | jq -r .data.\"full-cluster-state\" | jq \
-r .currentState.certificatesBundle.\"kube-admin\".config | sed \
-e "/^[[:space:]]*server:/ s_:.*_: \"https://127.0.0.1:6443\"_"' \
> kubeconfig_admin.yaml
成功導出kubeconfig_admin.yaml之后,就可以使用 kubectl 繼續操作下游業務集群:
# kubectl --kubeconfig kubeconfig_admin.yaml get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-1-111 Ready worker 32m v1.18.14
ip-172-31-2-203 Ready controlplane,etcd,worker 34m v1.18.14
3、恢復下游業務集群的cluster.rkestate文件,在controlplane節點上運行以下命令:
# docker run --rm --net=host \
-v $(docker inspect kubelet \
--format '{{ range .Mounts }}{{ if eq .Destination "/etc/kubernetes" }}{{ .Source }}{{ end }}{{ end }}')/ssl:/etc/kubernetes/ssl:ro \
--entrypoint bash $(docker inspect $(docker images -q --filter=label=org.label-schema.vcs-url=https://github.com/rancher/hyperkube.git) \
--format='{{index .RepoTags 0}}' | tail -1) \
-c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
-n kube-system get configmap full-cluster-state \
-o json | jq -r .data.\"full-cluster-state\" | jq -r .' \
> cluster.rkestate
4、恢復下游業務集群的cluster.yml文件
目前我沒找到好方法可以自動恢復該文件,但可以基於已經恢復的cluster.rkestate來手動恢復cluster.yml文件,因為cluster.yml需要的配置基本都可以從cluster.rkestate獲得。
從cluster.rkestate中獲得集群節點的配置信息:
# cat cluster.rkestate | jq -r .desiredState.rkeConfig.nodes
[
{
"nodeName": "c-kfbjs:m-d3e75ad7a0ea",
"address": "172.31.2.203",
"port": "22",
"internalAddress": "172.31.2.203",
"role": [
"etcd",
"controlplane",
"worker"
],
"hostnameOverride": "ip-172-31-2-203",
"user": "root",
"sshKeyPath": "~/.ssh/id_rsa"
}
]
根據 cluster.rkestate提供的節點信息,手動編寫 cluster.yml
# cat cluster.yml
nodes:
- address: 172.31.2.203
hostname_override: ip-172-31-2-203
user: ubuntu
role:
- controlplane
- etcd
- worker
- address: 172.31.1.111
hostname_override: ip-172-31-1-111
user: ubuntu
role:
- worker
- address: 172.31.5.186
hostname_override: ip-172-31-5-186
user: ubuntu
role:
- worker
kubernetes_version: v1.18.14-rancher1-1
以上手動編寫的 cluster.yml 有幾個地方需要注意:
只能從cluster.rkestate文件中獲得controlplane(ip-172-31-2-203)節點的信息,因為本例集群中還有一個worker(p-172-31-1-111)節點,所以需要將worker(p-172-31-1-111)節點的信息手動補充完整。
cluster.yaml中的ip-172-31-5-186是新增的worker節點,用於下一步演示 RKE 新增節點。
從cluster.rkestate獲得的節點信息是root用戶,需要根據實際需求,修改成 RKE 執行的用戶,本例為ubuntu用戶。
一定要指定原始集群的kubernetes_version參數,否則會將集群升級到 RKE 默認的最新版 Kubernetes。
除了以上方式,還可以通過下面的腳本恢復cluster.yml。同樣,你需要修改以上幾點提到的地方。使用這種方法的好處是可以更完整的恢復cluster.yml文件,篇幅有限,就不做過多演示:
#!/bin/bash
echo "Building cluster.yml..."
echo "Working on Nodes..."
echo 'nodes:' > cluster.yml
cat cluster.rkestate | grep -v nodeName | jq -r .desiredState.rkeConfig.nodes | yq r - | sed 's/^/ /' | \
sed -e 's/internalAddress/internal_address/g' | \
sed -e 's/hostnameOverride/hostname_override/g' | \
sed -e 's/sshKeyPath/ssh_key_path/g' >> cluster.yml
echo "" >> cluster.yml
echo "Working on services..."
echo 'services:' >> cluster.yml
cat cluster.rkestate | jq -r .desiredState.rkeConfig.services | yq r - | sed 's/^/ /' >> cluster.yml
echo "" >> cluster.yml
echo "Working on network..."
echo 'network:' >> cluster.yml
cat cluster.rkestate | jq -r .desiredState.rkeConfig.network | yq r - | sed 's/^/ /' >> cluster.yml
echo "" >> cluster.yml
echo "Working on authentication..."
echo 'authentication:' >> cluster.yml
cat cluster.rkestate | jq -r .desiredState.rkeConfig.authentication | yq r - | sed 's/^/ /' >> cluster.yml
echo "" >> cluster.yml
echo "Working on systemImages..."
echo 'system_images:' >> cluster.yml
cat cluster.rkestate | jq -r .desiredState.rkeConfig.systemImages | yq r - | sed 's/^/ /' >> cluster.yml
echo "" >> cluster.yml
5、使用 RKE 在原有集群上新增節點。
到目前為止,RKE 需要的配置文件cluster.yml、cluster.rkestate都已經恢復完成,接下來就可以通過rke up來操作集群增加worker(p-172-31-1-111)節點。
# rke up
INFO[0000] Running RKE version: v1.2.4
INFO[0000] Initiating Kubernetes cluster
INFO[0000] [certificates] GenerateServingCertificate is disabled, checking if there are unused kubelet certificates
INFO[0000] [certificates] Generating admin certificates and kubeconfig
INFO[0000] Successfully Deployed state file at [./cluster.rkestate]
INFO[0000] Building Kubernetes cluster
INFO[0000] [dialer] Setup tunnel for host [172.31.2.203]
INFO[0000] [dialer] Setup tunnel for host [172.31.1.111]
INFO[0000] [dialer] Setup tunnel for host [172.31.5.186]
...
...
INFO[0090] [addons] no user addons defined
INFO[0090] Finished building Kubernetes cluster successfully
等待集群更新完成之后,再次獲取節點信息:
# kubectl --kubeconfig kubeconfig_admin.yaml get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-1-111 Ready worker 8m6s v1.18.14
ip-172-31-2-203 Ready controlplane,etcd,worker 9m27s v1.18.14
ip-172-31-5-186 Ready worker 29s v1.18.14
可以看到新增了一個worker(ip-172-31-5-186)節點,並且集群版本依然是v1.18.14。
以后,可以通過 RKE 來繼續管理通過 Rancher Server 創建的自定義集群,無論是新增節點、快照、恢復均可。和直接通過 RKE 創建的集群幾乎無差別。
后 記
雖然本文介紹了如何通過 RKE 納管 Rancher 自定義集群,但操作比較復雜,特別是cluster.yml的配置,如果出現一點差錯,可能就會導致整個集群的更新或出錯,所以使用前請您一定要多做測試。
作者簡介
王海龍,Rancher中國社區技術經理,負責Rancher中國技術社區的維護和運營。擁有6年的雲計算領域經驗,經歷了OpenStack到Kubernetes的技術變革,無論底層操作系統Linux,還是虛擬化KVM或是Docker容器技術都有豐富的運維和實踐經驗。