rancher是个啥?
Rancher是一个开源的企业级全栈化容器部署及管理平台。简单的说,就是一个可以让你通过web界面管理docker容器的平台。定位上和K8s比较接近,都是通过web界面赋予完全的docker服务编排功能。而且它自带账户权限。相比K8s没有账号管理rancher自带账号权限体系。账号可以独立创建,也可以很方便地接入ldap等账号体系,对于公司使用是一大利器。
还有一个最牛逼的就是它有一个应用商店,并且可以做到配置自用的应用商店,部署服务,很快就能搞定!
所以说在k8s势不可挡的今天,学习一下rancher还是很有必要的。哪怕你领导担心它搞不定线上业务,拿来给测试环境部署也好啊!具体rancher的优点和不足可以去看 https://blog.csdn.net/CSDN_duomaomao/article/details/78029800 。
安装rancher以及创建k8s集群
安装rancher的方法非常简单:
1
2
3
4
5docker run -d --restart=unless-stopped \
--name rancher-managment \
-p 8080:80 -p 8443:443 \
-v /rancher/data:/var/lib/rancher \
rancher/rancher:latest
参数--restart=unless-stopped
的意思是在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
。
然后确认一下防火墙是否对外开放了8443和8080端口,打开浏览器输入IP:8443
就会看到rancher的样子,自带中文版,就问你感动不感动?
然后准备三台服务器,资料如下:
1
2
3名称:k8s-001 IP:"172.20.52.12" 角色:etcd+control+worker
名称:k8s-002 IP:"172.20.52.11" 角色:worker
名称:k8s-003 IP:"172.20.52.10" 角色:worker
以上服务器系统均为centos7,而且与rancher网络的8443和8080端口互通。为了路径相同,个人建议在rancher买一个大一点的高效云盘,然后让这三个worker都挂载这个云盘,这样的话启动容器的时候,数据都持久化保存在云盘里。
回到rancher页面,点击添加集群
,选择CUSTOM
,然后给集群起个名儿,如果有其他的rancher成员可以管理或者访问这个集群就编辑一下成员角色,默认情况下是安装k8s-1.11
版本。然后点击下一步
:
下一步很重要了,先在第一台172.20.52.12上勾选所有的角色以及输入对应IP,然后会web页面下面生成一个命令,将这个命令在172.20.52.12上执行一下,瞬间它就会尝试去注册到rancher:
如果注册不成功,web提示[etcd]Pulling image [rancher/coreos-etcd:v3.12.18] on host XXX
的话,那么还要去该服务器上手动docker pull rancher/coreos-etcd:v3.12.18
一下,不久之后就会看到主机被成功注册到rancher上:
点击主机
,能看到一点CPU和内存的细节:
安装kuberctl
使用rancher部署的k8s集群是没有自带kuberctl命令的,只能通过rancher页面的执行kubectl命令行
来操作,若需要worker里使用kubectl,那就得手动安装,过程如下:
1
2
3
4
5curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl #国内可以正常打开,表怕
chmod +x kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
echo "source <(kubectl completion bash)" >> ~/.bash_profile # 增加自动补全功能
kubectl version
此时得到的结果应该是:
如果执行的结果是:
1
2/usr/local/bin/kubectl: line 1: syntax error near unexpected token `<'
/usr/local/bin/kubectl: line 1: `<?xml version='1.0' encoding='UTF-8'?><Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Details>No such object: kubernetes-release/release//bin/linux/amd64/kubectl</Details></Error>'
那么很有可能是你的kubectl没有下载完全,这个文件应该是41M左右的,大于小于都不对!
返回到rancher的集群页面,点击kubeconfig文件
,将里面的内容复制到~/.kube/config
里(没有就创建一个),保存退出之后,重开一个终端就能正常使用了,如图:
清理节点
当你不想要一个node的时候,一定要清理干净,不然在新加node的时候就会出现:[etcd] Etcd Cluster is not healthy
的错误。清理节点的方法语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26# 停止服务
systemctl disable kubelet.service
systemctl disable kube-scheduler.service
systemctl disable kube-proxy.service
systemctl disable kube-controller-manager.service
systemctl disable kube-apiserver.service
systemctl stop kubelet.service
systemctl stop kube-scheduler.service
systemctl stop kube-proxy.service
systemctl stop kube-controller-manager.service
systemctl stop kube-apiserver.service
# 删除所有容器
docker rm -f $(docker ps -qa)
# 删除所有容器卷
docker volume rm $(docker volume ls -q)
# 卸载mount目录
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done
# 备份目录
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
node上的重要数据,已经要备份好!
其他问题
如果node是集群,那么把web的语句复制到node的命令行执行后却迟迟不见注册成功,那么可以点击高级选项,然后输入内网IP和名称,如图:
如果在node上执行kubectl version
的时候报错:Unable to connect to the server: x509: certificate signed by unknown authority
,原因可以看https://www.cnrancher.com/docs/rancher/v2.x/cn/configuration/admin-settings/custom-ca-root-certificate/ 。不过不知道是我姿势不对还是怎么的,我按照官方文档操作没有成功,这样可以在rancher的执行语句里添加--no-cacerts
,如下:
1
2
3
4
5docker run -d --restart=unless-stopped \
--name rancher-managment \
-p 8080:80 -p 8443:443 \
-v /rancher/data:/var/lib/rancher/ \
rancher/rancher:latest --no-cacerts
这样就可以解决了。
参考资料
https://www.cnblogs.com/horizonli/p/10572834.html
https://systemoutprint.github.io/kubernetes/2018/07/19/kubernetes%E9%9B%86%E7%BE%A4%E7%97%9B%E8%8B%A6%E6%90%AD%E5%BB%BA%E8%BF%87%E7%A8%8B/