本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux。node
「运维之美」是一个有情怀、有态度,专一于 Linux 运维相关技术文章分享的公众号。公众号致力于为广大运维工做者分享各种技术文章和发布最前沿的科技信息。公众号的核心理念是:分享,咱们认为只有分享才能使咱们的团体更强大。若是你想第一时间获取最新技术文章,欢迎关注咱们!git
公众号做者 Mike,一个月薪 3000 的杂工。从事 IT 相关工做 15+ 年,热衷于互联网技术领域,认同开源文化,对运维相关技术有本身独特的看法。很愿意将本身积累的经验、心得、技能与你们分享交流,篇篇干货不要错过哟。若是你想联系到我,可关注公众号获取相关信息。github
前段时间,咱们在 「使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群」一文中介绍了如何使用 Kind
这个开箱便可快速部署 Kubernetes
高可用集群的神器,相信很多同窗用上这个神器后大大的下降了 Kubernetes
集群的部署难度和提升了 Kubernetes
集群的部署速度。不过有一点比较遗憾的是 Kind
当前仅仅支持在本地快速构建一个开发或者测试环境,目前暂时仍是不支持在生产环境中部署 Kubernetes
高可用集群的。shell
今天,咱们就要给你们介绍另外一款能够支持在生产环境中部署 Kubernetes
高可用集群的利器 Sealos
。api
Sealos
是一个 Go 语言开发的简单干净且轻量的 Kubernetes
集群部署工具,Sealos
能很好的支持在生产环境中部署高可用的 Kubernetes
集群。服务器
Sealos
架构图微信
Sealos 特性与优点架构
Sealos 1.0
版本时是使用 Ansible
实现的,这样在使用时就必须先安装 Ansible
及一些 Python
的依赖包和进行一些必须的相关环境配置,使用起来仍是比较复杂的。app
为了解决这个问题,目前新版本的 Sealos
采用二进制文件方式提供。新版本 Sealos
没有任何依赖,开箱即用。负载均衡
文件分发与远程命令都经过调用对应
SDK
实现,不依赖其它任何环境。
不管是经过 KeepAlived
仍是 HAProxy
进行高可用集群调度都会存在如下一些劣势。
HAProxy
进程是否存活是没法保证集群高可用的,正确的检测方式应该是判断 ApiServer
是否 healthz
状态。 Keepalived
可能存在 Cpu
占满的状况。 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
节点,具体参见下图。
+----------+ +---------------+ virturl server: 127.0.0.1:6443
| mater0 |<----------------------| ipvs nodes | real servers:
+----------+ |+---------------+ 10.103.97.200:6443
| 10.103.97.201:6443
+----------+ | 10.103.97.202:6443
| mater1 |<---------------------+
+----------+ |
|
+----------+ |
| mater2 |<---------------------+
+----------+复制代码
在全部 Node
节点上启动一个包含 lvscare
进程的 Static Pod
对 IPVS
进行守护。 若是检测到 ApiServer
不可用时,Sealos
会自动清理掉全部 Node
节点上对应的主节点 IPVS
转发规则。直到 Master
节点恢复正常时,再自动生成对应规则。为了实现以上功能,咱们在 Node
节点上增长了下面这些内容。
# 增长了一个 lvscare 的 Static Pod
$ cat /etc/kubernetes/manifests
# 自动建立的一些 IPVS 规则
$ ipvsadm -Ln
# 增长了对虚拟 IP 的地址解析
$ cat /etc/hosts 复制代码
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
集群部署,你须要先准备好如下环境。
Docker
的安装和启动。 Kubernetes
离线安装包。 Sealos
。 Sealos 项目地址:https://github.com/fanux/sealos/releases
Kubernetes 离线安装包:https://github.com/sealstore/cloud-kernel/releases/
目前 Sealos
已经支持最新版本 Kubernetes 1.16.0
的高可用集群安装。
--master Master 节点服务器地址列表
--node Node 节点服务器地址列表
--user 服务器 SSH 用户名
--passwd 服务器 SSH 用户密码
--pkg-url 离线包所在位置,能够是本地目录,也能够是一个 HTTP 地址
--version 指定须要部署的 Kubernetes 版本
--pk 指定 SSH 私钥所在位置,默认为 /root/.ssh/id_rsa
Other flags:
--kubeadm-config string kubeadm-config.yaml 用于指定自定义 kubeadm 配置文件
--vip string virtual ip (default "10.103.97.2") 本地负载时虚拟 IP ,不推荐修改,集群外不可访问复制代码
经过 Sealos
部署 Kubernetes
集群是很是简单的 ,一般只需如下两条指令就能够完成安装。
$ wget https://github.com/fanux/sealos/releases/download/v2.0.7/sealos && \
chmod +x sealos && mv sealos /usr/bin
$ sealos init --passwd YOUR_SERVER_PASSWD \
--master 192.168.0.2 --master 192.168.0.3 --master 192.168.0.4 \
--node 192.168.0.5 \
--pkg-url https://sealyun.oss-cn-beijing.aliyuncs.com/cf6bece970f6dab3d8dc8bc5b588cc18-1.16.0/kube1.16.0.tar.gz \
--version v1.16.0复制代码
若是你的服务器已经配置了 SSH
免密登录,你能够直接使用对应密钥进行部署。
$ sealos init --master 192.168.0.2 \
--node 192.168.0.3 \
--pkg-url https://YOUR_HTTP_SERVER/kube1.15.0.tar.gz \
--pk /root/kubernetes.pem \
--version v1.16.0复制代码
若是你须要其它 Kubernetes
版本离线包,可到 Sealos
官网 http://store.lameleg.com/ 进行下载。
$ sealos init --master 192.168.0.2 \
--master 192.168.0.3 \
--master 192.168.0.4 \
--node 192.168.0.5 \
--user root \
--passwd your-server-password \
--version v1.16.0 \
--pkg-url /root/kube1.16.0.tar.gz 复制代码
$ kubectl get node
NAME STATUS ROLES AGE VERSION
izj6cdqfqw4o4o9tc0q44rz Ready master 2m25s v1.16.0
izj6cdqfqw4o4o9tc0q44sz Ready master 119s v1.16.0
izj6cdqfqw4o4o9tc0q44tz Ready master 63s v1.16.0
izj6cdqfqw4o4o9tc0q44uz Ready <none> 38s v1.16.0
$ kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5cbcccc885-9n2p8 1/1 Running 0 3m1s
kube-system calico-node-656zn 1/1 Running 0 93s
kube-system calico-node-bv5hn 1/1 Running 0 2m54s
kube-system calico-node-f2vmd 1/1 Running 0 3m1s
kube-system calico-node-tbd5l 1/1 Running 0 118s
kube-system coredns-fb8b8dccf-8bnkv 1/1 Running 0 3m1s
kube-system coredns-fb8b8dccf-spq7r 1/1 Running 0 3m1s
kube-system etcd-izj6cdqfqw4o4o9tc0q44rz 1/1 Running 0 2m25s
kube-system etcd-izj6cdqfqw4o4o9tc0q44sz 1/1 Running 0 2m53s
kube-system etcd-izj6cdqfqw4o4o9tc0q44tz 1/1 Running 0 118s
kube-system kube-apiserver-izj6cdqfqw4o4o9tc0q44rz 1/1 Running 0 2m15s
kube-system kube-apiserver-izj6cdqfqw4o4o9tc0q44sz 1/1 Running 0 2m54s
kube-system kube-apiserver-izj6cdqfqw4o4o9tc0q44tz 1/1 Running 1 47s
kube-system kube-controller-manager-izj6cdqfqw4o4o9tc0q44rz 1/1 Running 1 2m43s
kube-system kube-controller-manager-izj6cdqfqw4o4o9tc0q44sz 1/1 Running 0 2m54s
kube-system kube-controller-manager-izj6cdqfqw4o4o9tc0q44tz 1/1 Running 0 63s
kube-system kube-proxy-b9b9z 1/1 Running 0 2m54s
kube-system kube-proxy-nf66n 1/1 Running 0 3m1s
kube-system kube-proxy-q2bqp 1/1 Running 0 118s
kube-system kube-proxy-s5g2k 1/1 Running 0 93s
kube-system kube-scheduler-izj6cdqfqw4o4o9tc0q44rz 1/1 Running 1 2m43s
kube-system kube-scheduler-izj6cdqfqw4o4o9tc0q44sz 1/1 Running 0 2m54s
kube-system kube-scheduler-izj6cdqfqw4o4o9tc0q44tz 1/1 Running 0 61s
kube-system kube-sealyun-lvscare-izj6cdqfqw4o4o9tc0q44uz 1/1 Running 0 86s复制代码
若是你以为上面的教程仍是不够直观,如今就给你一个更简单粗暴的学习方式。猛击这里的视频,开始吧!
Kubernetes
集群目前处于一个高速迭代期,每一个新版本的发布都提供了很多新的特性。升级 Kubernetes
集群版本也就成了屡见不鲜,Sealos
也为你们提供很是方便的功能来帮助你们快速完成 Kubernetes
集群升级。Kubernetes
集群升级大体须要如下几个步骤:
Kubeadm
并导入新的镜像。 Master
节点上的 Kubelet
。 Master
节点。 Node
节点。 2.6.1 升级 Kubeadm
这一步主要用于更新 Kubeadm
、Kubectl
、Kubelet
等二进制文件,并导入新版本的镜像。升级方法很简单,只需复制离线包到全部节点并执行如下命令。
$ cd kube/shell && sh init.sh复制代码
2.6.2 升级 Master 节点上的 Kubelet
升级 Kubelet
仍是很简单的,只须要把新版本的 Kubelet
复制到 /usr/bin
目录下替换旧版本,而后重启 Kubelet
服务便可。
$ kubeadm upgrade plan
$ kubeadm upgrade apply v1.16.0
# 重启 Kubelet
$ systemctl restart kubelet复制代码
其中最重要的 kubeadm upgrade apply
命令主要完成如下一些操做。
Kube-DNS
和 Kube-Proxy
进行升级。 2.6.3 升级其它 Master 节点
$ kubeadm upgrade apply复制代码
2.6.4 升级 Node 节点
升级 Node
节点前,首先要驱逐节点。
$ kubectl drain $NODE --ignore-daemonsets复制代码
其次,是更新 Kubelet
的配置文件和升级 Node
节点的 Kubelet
。
$ kubeadm upgrade node config --kubelet-version v1.16.0
# 一样是替换二进制文件并重启 Kubelet
$ systemctl restart kubelet复制代码
最后,恢复 Node
节点为可调度状态。
$ kubectl uncordon $NODE复制代码
2.6.5 验证集群是否升级成功
$ kubectl get nodes复制代码
若是输出的节点的版本信息是和升级的版本一致的话,一切就搞定了!
若是你须要快速清理已部署的 Kubernetes
集群环境,你可使用下面的命令快速完成。
$ sealos clean \
--master 192.168.0.2 \
--master 192.168.0.3 \
--master 192.168.0.4 \
--node 192.168.0.5 \
--user root \
--passwd your-server-password复制代码
至此,使用 Sealos
快速部署一个生产级别的 Kubernetes
高可用集群的基本方法就介绍完了。若是你对 Sealos
很是的感兴趣,你还能够去官网探索更多高级功能哟!
对于在生产环境中快速部署 Kubernetes
高可用集群,你还有哪些更好用高效的方法呢?欢迎你们在留言讨论哟!