最近因为工作需要,学习调研rancher的使用
k8s作为主流微服务部署的基础,已经逐渐在工作中普及。但是k8s dashboard用于生产管理,还是有所欠缺:我们需要一个k8s之上的管理平台。经过调研,目前rancher已经迭代开发至v2.8版本,有很好的社区基础和公司技术支持,决定深入研究下
初始创建一台ubuntu22.04 虚拟机,安装docker (版本20.10.x)。之前我提到过k8s 1.24之后不再兼容docker,但是rancher(v2.7)仅仅是利用docker启动rancher镜像,容器启动后在容器内部启动k3s支撑local集群。所以如果在宿主机器上使用docker ps命令,仅仅只能看到一个rancher容器在运行;进入容器运行crictl命令,可以看到k3s集群
https://github.com/kubernetes-sigs/cri-tools/releases
从这里可以下载最新的crictl工具,方便查看containerd等容器
编辑/etc/crictl.yaml文件可以修改默认socket路径
添加新集群的节点不需要额外安装docker,但是需要保证磁盘空间足够:这次测试安装,就是磁盘空间不够导致cluster agent pod无法启动,rancher界面内一直提示集群处于"waiting for cluster agent to connect"的reconciling状态
(查了两天原因。因为crictl只能看到已经启动的容器,pending的看不到。后来无意中看到运行rancher自带kubectl的方法: /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml,这才定位到root cause。虽然耽误了时间,但是也对rancher创建集群的逻辑有了更深一层的理解)
我测试的rancher版本是2.7.7,从rancher UI界面删除集群和machine,后端部署的 k8s集群并不会受到影响。(据同事分享的信息,2.5.x版本,从界面删除集群,后端k8s集群也会被清空。我这里没有做测试:因为我个人喜欢用最新版本,以后大概率不会去用2.5)
如果需要清除后端部署k8s集群,需要手工登陆节点执行rancher提供的专门清理脚本:
# rancher-system-agent-uninstall.sh
# which rancher-system-agent-uninstall.sh
/usr/local/bin/rancher-system-agent-uninstall.sh
直接执行就行。使用rancher的create功能创建集群时候,该脚本也会自动安装到/usr/local/bin路径下。所以直接在shell下运行即可
# which rke2-uninstall.sh
/usr/local/bin/rke2-uninstall.sh
同上,执行rke2-uninstall.sh即可删除rke2集群
rm -rf /etc/ceph \
/etc/cni \
/etc/kubernetes \
/etc/rancher \
/opt/cni \
/opt/rke \
/run/secrets/kubernetes.io \
/run/calico \
/run/flannel \
/var/lib/calico \
/var/lib/etcd \
/var/lib/cni \
/var/lib/kubelet \
/var/lib/rancher\
/var/log/containers \
/var/log/kube-audit \
/var/log/pods \
/var/run/calico
其实在第二步的脚本中,已经包括部分删除数据/配置的步骤,但是有些目录没删干净(例如/var/lib/rancher)
经过以上四步,基本可以干净删除k8s(rke2)集群环境
想直接在node上面利用cli管理新创建的集群,需要使用rke自带的kubectl和配置文件
例如:
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get nodes
为了不每次输入这么长的路径,我们可以按照k8s传统配置方法移动kubectl和rke2.yaml路径:
cp /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/
mkdir -p $HOME/.kube
cp /etc/rancher/rke2/rke2.yaml .kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
完成上述操作后,就可以方便的使用 kubectl get nodes 等命令了
root@k8s-master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,etcd,master,worker 12d v1.26.8+rke2r1