sealos
简单介绍
今天分享一个完全自动化安装kubernetes高可用环境的安装工具,之前我也不太相信,能把操作繁杂的搭建k8s的过程做的这么简单高效,完全是一条命令,包含所有的依赖,并且解决了很多日常维护时的痛点:
- 完全使用ipvs高可用apiserver,并且带apiserver的健康监测
- 抛弃传统的高可用搭配服务(haproxy和keepalived)
- 支持99年的证书(几乎不用担心证书过期的问题了)
- 安装简单,一条命令,包含所有的依赖
- 支持离线部署,工具与资源包(二进制程序,配置文件,镜像,yaml文件等)分离,不存在因为无法科学上网拉去不了镜像等问题
认识sealon
sealos如文章前面说了,通过ssh进行文件分发,没有使用流行的ansible配置管理工具以及高可用负载服务方案,主要是因为简化用户的操作,快速的安装使用。了解作者开发的一些意图:
1.0版本确实是用ansible实现,但是用户还是需要先装ansible,装ansible有需要装python和一些依赖等,为了不让用户那么麻烦把ansible放到了容器里供用户使用。如果不想配置免密钥使用用户名密码时又需要ssh-pass等,总之不能让我满意,不是我想的极简。
所以我想就来一个二进制文件工具,没有任何依赖,文件分发与远程命令都通过调用sdk实现所以不依赖其它任何东西,总算让我这个有洁癖的人满意了。
haproxy用static pod跑没有太大问题还算好管理,keepalived现在大部分开源ansible脚本都用yum 或者apt等装,这样非常的不可控,有如下劣势:
- 源不一致可能导致版本不一致,版本不一直连配置文件都不一样,我曾经检测脚本不生效一直找不到原因,后来才知道是版本原因
- 系统原因安装不上,依赖库问题某些环境就直接装不上了
- 看了网上很多安装脚本,很多检测脚本与权重调节方式都不对,直接去检测haproxy进程在不在,其实是应该去检测apiserver是不是healthz的,api挂了即使haproxy在集群也会不正常了,就是伪高可用了。
- 管理不方便,通过prometheus对集群进行监控,是能直接监控到static pod的但是用systemd跑又需要单独设置监控,且重启啥的还需要单独拉起。不如kubelet统一管理来的干净简洁。
- 我们还出现过keepalived把CPU占满的情况。
所以为了解决这个问题,我把keepalived跑在了容器中(社区提供的镜像基本是不可用的) 改造中间也是发生过很多问题,最终好在解决了。
总而言之,累觉不爱,所以在想能不能甩开haproxy和keepalived做出更简单更可靠的方案出来,还真找到了。。。
我们通过本地负载解决高可用问题
解释一下本地负载,就是在每个node节点上都启动一个负载均衡,上游就是三个master,负载方式有很多 ipvs envoy nginx等,我们最终使用内核ipvs
如果使用envoy等需要在每个节点上都跑一个进程,消耗更多资源,这是我不希望的。ipvs实际也多跑了一个进程lvscare,但是lvscare只是负责管理ipvs规则,和kube-proxy类似,真正的流量还是从很稳定的内核走的,不需要再把包走到用户态中去处理。
实现上有个问题会让使用envoy等变得非常尴尬,就是join时如果负载均衡没有建立那是会卡住的,kubelet就不会起,所以为此你需要先把envory起起来,意味着你又不能用static pod去管理它,同上面keepalived宿主机部署一样的问题,用static pod就会相互依赖,逻辑死锁,鸡说要先有蛋,蛋说要先有鸡,最后谁都没有。
使用ipvs就不一样,我可以在join之前先把ipvs规则建立好,再去join就可以join进去了,然后对规则进行守护即可。一旦apiserver不可访问了,会自动清理掉所有node上对应的ipvs规则, master恢复正常时添加回来。
首先是由于kubeadm把证书时间写死了,所以需要定制把它改成99年,虽然大部分人可以自己去签个新证书,但是我们还是不想再依赖个别的工具,就直接改源码了。
其次就是做本地负载时修改kubeadm代码是最方便的,因为在join时我们需要做两个事,第一join之前先创建好ipvs规则,第二创建static pod,如果这块不去定制kubeadm就把报静态pod目录已存在的错误,忽略这个错误很不优雅。 而且kubeadm中已经提供了一些很好用的sdk供我们去实现这个功能。
且这样做之后最核心的功能都集成到kubeadm中了,sealos就单单变成分发和执行上层命令的轻量级工具了,增加节点时我们也就可以直接用kubeadm了
安装
安耐不住好奇的心里,还是快速的克隆了三个(2c4g)的Centos虚拟机,在kubernetes中,默认至少要有2核CPU的。在准备和部署的整个过程好像也没有10分钟吧!
下载sealos
sealos是golang开发的一个二进制文件,我们可以在github上快速的下载并安装它(https://github.com/fanux/sealos/releases/download/v2.0.7/sealos)。和docker-compose安装一样的特别方便
wget https://github.com/fanux/sealos/releases/download/v2.0.7/sealos && \
chmod +x sealos && mv sealos /usr/bin
该命令特点的简单易用,了解一下命令行选项
--master master服务器地址列表
--node node服务器地址列表
--user 服务器ssh用户名
--passwd 服务器ssh用户密码
--pkg-url 离线包位置,可以放在本地目录,也可以放在一个http服务器上,sealos会wget到安装目标机
--version kubernetes版本
--pk ssh私钥地址,配置免密钥默认就是/root/.ssh/id_rsa
安装Kubernetes集群
简单的就一条命令,相信一眼就能看明白每个参数的含义
sealos init --passwd YOUR_SERVER_PASSWD \
--master 172.16.132.144 --master 172.16.132.145 \
--node 172.16.132.146 \
--pkg-url https://sealyun.oss-cn-beijing.aliyuncs.com/37374d999dbadb788ef0461844a70151-1.16.0/kube1.16.0.tar.gz \
--version v1.16.0
在安装kubernetes集群的时候,主要下载kube1.16.0.tar.gz文件包比较耗时,因此我们可以将该文件提前下载到服务器上,然后通过本地加载的方式安装集群。
sealos init --passwd YOUR_SERVER_PASSWD \
--master 172.16.132.144 --master 172.16.132.145 \
--node 172.16.132.146 \
--pkg-url /root/kube1.16.0.tar.gz \
--version v1.16.0
对于sealos工具来说,你可以指定多个--master
或--node
来定制化你需要多少个master几点高可用以及多少个work节点用于调度资源。
检查安装是否正常
检查安装是否正常:
root@node1:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node1 Ready master 2m14s v1.16.0 172.16.132.144 <none> Ubuntu 16.04.6 LTS 4.4.0-142-generic docker://19.3.4
node2 Ready master 88s v1.16.0 172.16.132.145 <none> Ubuntu 16.04.6 LTS 4.4.0-142-generic docker://19.3.4
node3 Ready <none> 15s v1.16.0 172.16.132.146 <none> Ubuntu 16.04.6 LTS 4.4.0-142-generic docker://19.3.4
剩下的就是继续研究学习kubernetes了。
本文分享自微信公众号 - 云原生生态圈(CloudNativeEcoSystem)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。