最简单的 Kubernetes 高可用安装方式!
副标题[/!--empirenews.page--]
本文教你如何用一条命令构建 Kubernetes 高可用集群且不依赖 HAProxy 和 Keepalived,也无需 Ansible。通过内核 IPVS 对 apiserver 进行负载均衡,并且带 apiserver 健康检测。架构如下图所示: 本项目名叫 sealos,旨在做一个简单干净轻量级稳定的 Kubernetes 安装工具,能很好的支持高可用安装。其实把一个东西做的功能强大并不难,但是做到极简且灵活可扩展就比较难。所以在实现时就必须要遵循这些原则。 设计原则sealos 特性与优势:
为什么不用 Ansible?1.0 版本确实是用 Ansible 实现,但是用户还是需要先装 Ansible,装 Ansible 又需要装 Python 和一些依赖等,为了不让用户那么麻烦把 Ansible 放到了容器里供用户使用。如果不想配置免密钥使用用户名密码时又需要 ssh-pass 等,总之不能让我满意,不是我想的极简。 所以我想就来一个二进制文件工具,没有任何依赖,文件分发与远程命令都通过调用 SDK 实现所以不依赖其它任何东西,总算让我这个有洁癖的人满意了。 为什么不用 Keepalived 和 HAProxy?HAProxy 用 static pod 跑没有太大问题,还算好管理,Keepalived 现在大部分开源 Ansible 脚本都用 yum 或者 apt 等装,这样非常的不可控,有如下劣势:
所以为了解决这个问题,我把 Keepalived 跑在了容器中(社区提供的镜像基本是不可用的),改造中间也是发生过很多问题,最终好在解决了。 总而言之,累觉不爱,所以在想能不能甩开 HAProxy 和 Keepalived 做出更简单更可靠的方案出来,还真找到了。 本地负载为什么不使用 Envoy 或者 Nginx?我们通过本地负载解决高可用问题。 解释一下本地负载,就是在每个 Node 节点上都启动一个负载均衡,上游就是三个 Master。负载方式有很多 IPVS、Envoy、Nginx 等,我们最终使用内核 IPVS。 如果使用 Envoy 之类的负载均衡器,则需要在每个节点上都跑一个进程,消耗的资源更多,这是我不希望的。IPVS 实际也多跑了一个进程 LVScare,但是 LVScare 只是负责管理 IPVS 规则,和 kube-proxy 类似,真正的流量还是从很稳定的内核走的,不需要再把包丢到用户态中去处理。 在架构实现上有个问题会让使用 Envoy 等变得非常尴尬,就是 join 时如果负载均衡没有建立那是会卡住的,kubelet 就不会起来,所以为此你需要先启动 Envoy,意味着你又不能用 static pod 去管理它,同上面 Keepalived 宿主机部署一样的问题,用 static pod 就会相互依赖,逻辑死锁,鸡说要先有蛋,蛋说要先有鸡,最后谁都没有。 使用 IPVS 就不一样,我可以在 join 之前先把 IPVS 规则建立好,再去 join 就可以了,然后对规则进行守护即可。一旦 apiserver 不可访问了,会自动清理掉所有 Node 上对应的 IPVS 规则, 等到 Master 恢复正常时添加回来。 为什么要定制 kubeadm?首先是由于 kubeadm 把证书过期时间写死了,所以需要定制把它改成 99 年,虽然大部分人可以自己去签个新证书,但是我们还是不想再依赖个别的工具,就直接改源码了。 其次就是做本地负载时修改 kubeadm 代码是最方便的,因为在 join 时我们需要做两个事,第一是 join 之前先创建好 IPVS 规则,第二是创建 static pod。如果这块不去定制 kubeadm 就报静态 Pod 目录已存在的错误,忽略这个错误很不优雅。而且 kubeadm 中已经提供了一些很好用的 SDK 供我们去实现这个功能。 且这样做之后最核心的功能都集成到 kubeadm 中了,sealos 就单单变成分发和执行上层命令的轻量级工具了,增加节点时我们也就可以直接用 kubeadm 了。 使用教程安装依赖
安装 多 Master HA 只需执行以下命令:
然后,就没有然后了……没错,你的高可用集群已经装好了,是不是觉得一脸懵逼?就是这么简单快捷! 单 Master 多 Node:
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |