前段时间,我们在 「使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群」一文中介绍了如何使用 Kind
这个开箱即可快速部署 Kubernetes
高可用集群的神器,相信不少同学用上这个神器后大大的降低了 Kubernetes
集群的部署难度和提高了 Kubernetes
集群的部署速度。不过有一点比较遗憾的是 Kind
当前仅仅支持在本地快速构建一个开发或者测试环境,目前暂时还是不支持在生产环境中部署 Kubernetes
高可用集群的。
今天,我们就要给大家介绍另一款可以支持在生产环境中部署 Kubernetes
高可用集群的利器 Sealos
。
什么是 Sealos ?
Sealos
是一个 Go 语言开发的简单干净且轻量的 Kubernetes
集群部署工具,Sealos
能很好的支持在生产环境中部署高可用的 Kubernetes
集群。
Sealos
架构图
Sealos 特性与优势
-
支持离线安装,工具与部署资源包分离,方便不同版本间快速升级。
-
证书有效期默认延期至 99 年。
-
工具使用非常简单。
-
支持使用自定义配置文件,可灵活完成集群环境定制。
-
使用内核进行本地负载,稳定性极高,故障排查也极其简单。
Sealos 设计原则和工作原理
1. 为什么不使用 Ansilbe 实现
Sealos 1.0
版本时是使用 Ansible
实现的,这样在使用时就必须先安装 Ansible
及一些 Python
的依赖包和进行一些必须的相关环境配置,使用起来还是比较复杂的。
为了解决这个问题,目前新版本的 Sealos
采用二进制文件方式提供。新版本 Sealos
没有任何依赖,开箱即用。
文件分发与远程命令都通过调用对应
SDK
实现,不依赖其它任何环境。
2. 为什么不用 KeepAlived 和 HAProxy 实现集群高可用
无论是通过 KeepAlived
还是 HAProxy
进行高可用集群调度都会存在以下一些劣势。
-
软件源不一致可能导致容器中安装的软件版本也不一致,进而会引起相应检查脚本不生效等故障。
-
可能因为系统依赖库问题,在某些特定环境下就直接无法完成安装。
-
只依靠检测
HAProxy
进程是否存活是无法保证集群高可用的,正确的检测方式应该是判断ApiServer
是否healthz
状态。 -
Keepalived
可能存在Cpu
占满的情况。
3. 本地负载为什么不使用 Envoy 或者 Nginx 实现
Sealos
高可用实现是通过本地负载方式完成的。本地负载实现方式有多种,比如:IPVS
、Envoy
、Nginx
等,而 Sealos
采用的是通过内核 IPVS
来实现的。
本地负载:在每个
Node
节点上都启动一个负载均衡,同时监听集群中的多个Master
节点。
Sealos
选择通过内核 IPVS
来实现主要有以下几个原因:
-
如果使用
Envoy
等需要在每个节点上都跑一个进程,消耗更多资源。虽然IPVS
实际上也会多跑一个lvscare
进程 ,但是lvscare
只是负责管理IPVS
规则,原理和Kube-Proxy
类似。真正的流量直接从内核层面走,不需要把数据包先走到用户态中去处理。 -
使用
Envoy
存在启动优先级的问题,比如:Join 集群时,如果负载均衡没有建立,Kubelet 就会启动失败。使用IPVS
则不会存在这样的问题,因为我们可以在 Join 集群前先建立好转发规则。
3.1 本地内核负载工作原理
Sealos
通过本地内核负载的方式实现每个 Node
节点负载均衡访问所有 Master
节点,具体参见下图。
1 | +----------+ +---------------+ virturl server: 127.0.0.1:6443 |
在所有 Node
节点上启动一个包含 lvscare
进程的 Static Pod
对 IPVS
进行守护。 如果检测到 ApiServer
不可用时,Sealos
会自动清理掉所有 Node
节点上对应的主节点 IPVS
转发规则。直到 Master
节点恢复正常时,再自动生成对应规则。为了实现以上功能,我们在 Node
节点上增加了下面这些内容。
1 | # 增加了一个 lvscare 的 Static Pod |
4. 为什么要定制 Kubeadm
-
解决默认证书有效期只有一年的问题。
-
更方便的实现本地负载。
-
核心的功能均集成到 Kubeadm 中了,Sealos 只管分发和执行上层命令,相对就更轻量了。
5. Sealos 执行流程
-
通过
SFTP
或者Wget
命令把离线安装包拷贝到目标机器上,包括所有Master
和Node
节点。 -
在
Master 0
节点上执行kubeadm init
命令。 -
在其它
Master
节点上执行kubeadm join
命令并设置控制面。这个过程中多个Master
节点上的Etcd
会自动组成一个Etcd
集群,并启动相应控制组件。 -
所有
Node
节点都加入到集群中,这个过程中会在Node
节点上进行IPVS
转发规则和/etc/hosts
配置。
Node
节点对ApiServer
的访问均是通过域名进行的。因为Node
节点需要通过虚拟 IP
连接到多个Master
上,但是每个Node
节点的Kubelet
与Kube-Proxy
访问ApiServer
的地址是不同的,所以这里使用域名来解析每个节点上ApiServer
不同的IP
地址。
使用 Sealos 部署高可用 Kubernetes 集群
1. 安装相关环境依赖
通过 Sealos
进行 Kubernetes
集群部署,你需要先准备好以下环境。
-
在所有要部署的机器上,先完成
Docker
的安装和启动。 -
下载
Kubernetes
离线安装包。 -
下载最新版本
Sealos
。 -
对所有服务器进行时间同步。
Sealos 项目地址:https://github.com/fanux/sealos/releases
Kubernetes 离线安装包:https://github.com/sealstore/cloud-kernel/releases/
2. 通过 Sealos 部署高可用 Kubernetes 集群
目前 Sealos
已经支持最新版本 Kubernetes 1.16.0
的高可用集群安装。
2.1 Sealos 常用参数说明
1 | --master Master 节点服务器地址列表 |
2.2 部署一个单主节点的 Kubernetes 集群
通过 Sealos
部署 Kubernetes
集群是非常简单的 ,通常只需以下两条指令就可以完成安装。
1 | $ wget https://github.com/fanux/sealos/releases/download/v2.0.7/sealos && \ |
如果你的服务器已经配置了 SSH
免密登陆,你可以直接使用对应密钥进行部署。
1 | $ sealos init --master 192.168.0.2 \ |
如果你需要其它 Kubernetes
版本离线包,可到 Sealos
官网 http://store.lameleg.com/ 进行下载。
2.3 部署一个多主节点的高可用 Kubernetes 集群
1 | $ sealos init --master 192.168.0.2 \ |
2.4 验证部署是否成功
1 | $ kubectl get node |
2.5 最简单粗暴的视频教程
如果你觉得上面的教程还是不够直观,现在就给你一个更简单粗暴的学习方式。猛击这里的视频,开始吧!
2.6 升级 Kubernetes 集群版本
Kubernetes
集群目前处于一个高速迭代期,每个新版本的发布都提供了不少新的特性。升级 Kubernetes
集群版本也就成了家常便饭,Sealos
也为大家提供非常方便的功能来帮助大家快速完成 Kubernetes
集群升级。Kubernetes
集群升级大致需要以下几个步骤:
-
升级所有节点的
Kubeadm
并导入新的镜像。 -
升级
Master
节点上的Kubelet
。 -
升级其它
Master
节点。 -
升级
Node
节点。 -
验证集群状态。
2.6.1 升级 Kubeadm
这一步主要用于更新 Kubeadm
、Kubectl
、Kubelet
等二进制文件,并导入新版本的镜像。升级方法很简单,只需复制离线包到所有节点并执行以下命令。
1 | $ cd kube/shell && sh init.sh |
2.6.2 升级 Master 节点上的 Kubelet
升级 Kubelet
还是很简单的,只需要把新版本的 Kubelet
复制到 /usr/bin
目录下替换旧版本,然后重启 Kubelet
服务即可。
1 | $ kubeadm upgrade plan |
其中最重要的 kubeadm upgrade apply
命令主要完成以下一些操作。
-
验证集群是否可升级并执行版本升级策略。
-
确认离线包中相关镜像是否可用。
-
对控制组件的容器进行升级,失败就回滚。
-
对
Kube-DNS
和Kube-Proxy
进行升级。 -
创建新的证书文件并备份旧的证书文件。
2.6.3 升级其它 Master 节点
1 | $ kubeadm upgrade apply |
2.6.4 升级 Node 节点
升级 Node
节点前,首先要驱逐节点。
1 | $ kubectl drain $NODE --ignore-daemonsets |
其次,是更新 Kubelet
的配置文件和升级 Node
节点的 Kubelet
。
1 | $ kubeadm upgrade node config --kubelet-version v1.16.0 |
最后,恢复 Node
节点为可调度状态。
1 | $ kubectl uncordon $NODE |
2.6.5 验证集群是否升级成功
1 | $ kubectl get nodes |
如果输出的节点的版本信息是和升级的版本一致的话,一切就搞定了!
3. 集群清理
如果你需要快速清理已部署的 Kubernetes
集群环境,你可以使用下面的命令快速完成。
1 | $ sealos clean \ |
至此,使用 Sealos
快速部署一个生产级别的 Kubernetes
高可用集群的基本方法就介绍完了。如果你对 Sealos
非常的感兴趣,你还可以去官网探索更多高级功能哟!
对于在生产环境中快速部署 Kubernetes
高可用集群,你还有哪些更好用高效的方法呢?欢迎大家在留言讨论哟!