概述
rancher是一个k8s集群管理工具,但是rancher自己有一个k8s发行版,叫做k3s,和k8s一样,但是去掉了很多不必要的功能,更加轻量。
这里记录一下rancher高可用的安装的方法,以及如果导入k3s集群。
- linux:centos7
- rancher版本:2.5.8
- k3s:1.20.8+k3s1
k3s的安装与卸载
k3s的安装
部署外部数据库
首先需要一个外部数据库,参考官方文档集群数据存储选项。
我这里使用的mysql数据库来作为外部数据库。
部署k3s-server节点
server的部署很简单,k3s提供了脚本来进行安装,非常方便:
1 | curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ |
上面命令默认安装最新版本的k3s,如果要指定版本,可以使用下面的方式:
1 | curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ |
如果想要部署多个server节点,只要在多个机器上运行上述命令就可以了,它们只要连接到同一个数据库,就能相互发现。
PS:如果安装出现错误,解决问题后,建议先卸载干净再重试,卸载方法本文下面有。
运行完毕后,使用下面命令来查看部署情况:
1 | k3s kubectl get nodes |
1 | k3s kubectl get pods --all-namespaces |
可以看到我这里部署了两个server节点,并且完全部署成功了。
部署k3s-agent节点
首先在server节点上找到token:
1 | cat /var/lib/rancher/k3s/server/node-token |
在要部署agent的节点上运行如下命令即可
1 | curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ |
agent节点不是必需的,实际上我这里就部署了上面两个server节点,如果嫌麻烦可以只部署server。
k3s的卸载
在使用脚本安装k3s的时候,已经提供了卸载脚本放在了主机上。
k3s-server的卸载:
1 | /usr/local/bin/k3s-uninstall.sh |
k3s-agent的卸载:
1
/usr/local/bin/k3s-agent-uninstall.sh
1 | /usr/local/bin/k3s-agent-uninstall.sh |
rancher的安装
rancher2.5需要安装在Kubernetes集群之上,上面我们安装好了k3s集群,可以在上面进行rancher的安装。
安装helm
参考官方文档Installing Helm
安装方式很简单,首先选择以一个helm版本并下载releases,我这里选择了3.6.0版本,
1 | wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz |
里面是一个直接可以用的二进制文件,解压后放到环境变量目录下就可以了,
1 | tar -zxvf helm-v3.6.0-linux-amd64.tar.gz |
查看helm是否可以使用了,
1 | helm version |
然后添加一下rancher的地址:
1
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
1 | helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable |
为Rancher创建Namespace
1
kubectl create namespace cattle-system
1 | kubectl create namespace cattle-system |
选择SSL方式
有三种SSL方式可以选择:
- Rancher生成的自签名证书。
- Let’s Encrypt。
- 使用您自己的证书。
这里我只试了第一种和第三种方式,还是第三种方式比较靠谱,也就是使用自己的域名生成证书。
使用自己域名生成证书的方法就不写在这里了,总之得到三个证书文件:
1
xxx.plus.csr xxx.plus.key xxx.plus.pem
1 | xxx.plus.csr xxx.plus.key xxx.plus.pem |
通过Helm安装Rancher
首先配置一下环境变量,否则会出现Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version?timeout=32s": dial tcp [::1]:8080: connect: connection refused
的错误:
1 | export KUBECONFIG=/etc/rancher/k3s/k3s.yaml |
我这里使用的是自己生成的证书,安装命令如下:
1 | helm install rancher rancher-stable/rancher \ |
如果想要指定安装版本,则可以加上version,
1 | helm install rancher rancher-stable/rancher \ |
查看是否安装成功:
1 | kubectl -n cattle-system rollout status deploy/rancher |
到这里就成功安装了rancher,但是我们还没有加入ssl证书,此时访问web会出现不安全的提示,所以先加入证书:
1 | kubectl -n cattle-system create secret tls tls-rancher-ingress \ |
证书添加成功之后,web页面就不再提示不安全。(使用https://xxx.plus来访问rancher)
添加k3s集群到rancher
首先部署一个k3s集群,方法和上面一样。
进入rancher的web页面,选择添加集群:
选择导入:
输入集群名字,选择创建即可:
复制第二条命令:
到要导入的k3s集群的master节点上输入命令:
1 | kubectl apply -f https://xxx.plus/v3/import/tfgfnzllcntln8pvwkk642mtw745jq8mkmdbv9m5d9lkgjs5wq5g6l_c-r6xhq.yaml |
等待一会儿,rancher界面上可以看到集群状态变为waiting。
正常情况,再过一会就导入成功了。如果卡了半天还是waiting,那很有可能是导入失败了。
可以查看一下导入的k3s集群的日志:
1 | kubectl -n cattle-system logs -l app=cattle-cluster-agent -f |
也可以直接进入日志文件夹里面去看日志:
1 | cd /var/log/pods/ |
到这里导入集群就成功了。
遇到的问题
1
在使用rancher2.5.x导入k3s1.21.x时,会导入失败,在k3s日志中出现如下错误:
msg="failed to call leader func: settings.management.cattle.io \"install-uuid\" not found"
github上有相关问题:
但是我尝试了里面的方法也没解决成功,估计是1.21.x版本的问题,所以后面换成了1.20.8+k3s1。
2
在使用rancher2.4.4导入k3s1.21.x时,导入失败,出现错误:
Failed to connect to proxy. Response status: 200 - 200 OK. Response body: node.management.cattle.io \"c-czdbl/m-3b038d0f69e3\" not found" error="websocket: bad handshake"
相关问题:
反正我也没解决成功,也是后面换成了k3s1.20的原因之一。
2021-07-02问题
在部署rancher时,提示空间不足:no space left on device: unknown
。
用df -h
看了一下,确实是/var下面的空间不足了。
研究了一下,发现主要有三个目录需要使用空间:
1 | /var/lib/rancher |
这里使用了一个简单的解决方法:在空间足够的/home下面新建了几个文件夹,然后先将/var/lib/rancher
、/var/lib/containerd
和/run/containerd
三个目录删除,使用新建的几个文件夹软连接生成这三个目录:
1 | ln -s /home/k3s/var-lib-rancher /var/lib/rancher |
然后重启containerd服务:
1 | systemctl restart containerd |
重新部署时,就不会再提示空间不足了。
2021-07-05问题
在内网部署rancher,并添加同一个内网的另一个k3s集群,添加失败,出现time out
的错误。
大致情况如下:
- rancher部署在10.xxx.xxx.100上,另一个k3s集群在10.xxx.xxx.101和10.xxx.xxx.102上,现在要把k3s集群导入到rancher。
- rancher是要给外网访问的,所以域名rancher.xxx.plus对应的是外网地址47.xxx.xxx.xxx,同时外网访问要经过nginx转发。
- 内网机器不能通过外网地址访问到内网机器的,所以为了添加集群,我在10.xxx.xxx.101的
/etc/hosts
文件中配置了10.xxx.xxx.100 rancher.xxx.plus
。
但是在执行添加集群命令一会之后,会出现time out
的错误。
研究之后发现,可能是容器内部并不会使用/etc/hosts
文件来进行域名解析,导致解析到外网地址47.xxx.xxx.xxx,以至于连接超时。
原来k3s集群内部是通过coreDNS来进行域名解析的,所以不仅需要在/etc/hosts
文件中进行修改,也要在coreDNS中修改域名解析。
执行如下命令打开coreDNS文件并添加一条记录:
1 | kubectl edit configmap coredns -n kube-system |
使用下面命令可以查看配置:
1 | kubectl -n kube-system get configmap coredns -o yaml |
然后在执行集群导入命令,就成功添加到了rancher。
2021-11-17问题
今天在自己两台云主机上部署k3s时,有一台部署not ready,报错如下:
1 | k3s Waiting for control-plane node txy0 startup: nodes \"txy0\" not found" |
这里txy0
就是本机的hostname,后面卸载重装,尝试使用如下命令,就成功启动了。
1 | curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ |
这里的--node-ip
是内网地址,--node-external-ip
是公网地址。