

Rancher无法管理集群怎么办?RKE来接手!
source link: https://my.oschina.net/rancher/blog/5034991
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大部分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容器技术都有丰富的运维和实践经验。
Recommend
-
86
在Rancher 1.x时期,告警功能是很多Rancher用户一直希望能够集成进产品内的,因此在Rancher 2.0研发阶段,这一直是Rancher研发团队功能列表中的重要一项。 Rancher 2.0发布,新版本产品中引入了很多酷炫新功能,其中就包括集群和...
-
11
本文预计阅读时间 25 分钟 虽然有集群高可用所在,但是仍旧可能会有整个集群覆灭的情况,所以这里试验一下集群的备份问题。 现在,在已有集群当中,跑了两个应用如下:
-
4
[Rancher 系列文] - 使用者登入管理 與 RKE Template 管理 Posted on 2021-10-31 Views: 6 Rancher 系列文第四篇,探討其他使用方式 前篇文章透過 rke / helm 成功的搭建了一個 Rancher 服務,並且於第...
-
6
进去新项目,接手这样的代码怎么办 最近来到新的项目组,接手了一个离职员工的代码,阅读...
-
7
Rancher 和知乎超大规模多集群管理联合实践知乎是中文互联网高质量的问答社区,每天有上千万用户在知乎分享知识、经验和见解,找到自己的答案。为配合不同阶段的业务发展需求,知乎容器平台也在不断演进、提升,目前几乎所有的业务都运行在容器上。
-
6
rancher~升级v2.6.3之后业务集群无法连rancher的解决方法 参考:
-
7
RKE安装kubernetes集群 March 20, 2019 in k8s,
-
5
强大多云混合多K8S集群管理平台Rancher入门实战
-
7
大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 📚️Reference: IoT 边缘计算...
-
6
kubectl安装 在主机或者远程访问的笔记本上安装kubectl命令行工具 rancher-cluster.yml(RKE配置文件) 通过RKE创建kubernetes集群,需要预先设置rancher-cluster.yml配置文件,通过这个配置文件安装kuber...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK