最简单的 KuberNetes 高可用安装方式!
2019-09-03 10:19:58本文教你如何用一条命令构建 Kubernetes 高可用集群且不依赖 HAProxy 和 Keepalived,也无需 Ansible。通过内核 IPVS 对 apiserver 进行负载均衡,并且带 apiserver 健康检测。
本文教你如何用一条命令构建 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:
使用免密钥或者密钥对:
参数解释:
其他参数:
检查安装是否正常:
增加节点
先获取 join command,在 Master 上执行:
可以使用超级 kubeadm,但是 join 时需要增加一个 –master 参数:
也可以用 sealos join 命令:
使用自定义 kubeadm 配置文件
有时你可能需要自定义 kubeadm 的配置文件,比如要在证书里加入域名 sealyun.com。
首先需要获取配置文件模板:
然后修改 kubeadm-config.yaml.tmpl 即可,将 sealyun.com 添加到配置中:
注意:其它部分不用修改,sealos 会自动填充模板里面的内容。
最后在部署时使用 –kubeadm-config 指定配置文件模板即可:
版本升级
本教程以 1.14 版本升级到 1.15 为例,其它版本原理类似,懂了这个其它的参考官方教程即可。
升级过程
升级 kubeadm
把离线包拷贝到所有节点执行 cd kube/shell && sh init.sh。这里会把 kubeadm、kubectl、kubelet 的二进制文件都更新掉,而且会导入高版本镜像。
升级控制节点
重启 kubelet:
其实 kubelet 升级很简单粗暴,我们只需要把新版本的 kubelet 拷贝到 /usr/bin 下面,重启 kubelet service 即可,如果程序正在使用不让覆盖那么就停一下 kubelet 再进行拷贝,kubelet bin 文件在 conf/bin 目录下。
升级其它控制节点:
升级 Node
驱逐节点(要不要驱逐看情况, 喜欢粗暴的直接来也没啥):
更新 kubelet 配置:
然后升级 kubelet。同样是替换二进制再重启 kubelet service。
召回失去的爱情:

验证
如果版本信息都对的话基本就升级成功了。
kubeadm upgrade apply 干了啥?
源码编译
因为使用了 netlink 库,所以推荐在容器内进行编译,只需一条命令:
如果你使用的是 go mod,则需要指定通过 vendor 编译:
卸载
sealos 实现原理
执行流程
所有对 apiserver 的请求都是通过域名进行访问,因为 Node 需要通过虚拟 IP 连接多个 Master,每个节点的 kubelet 与 kube-proxy 访问 apiserver 的虚拟地址是不一样的,而 kubeadm 又只能在配置文件中指定一个地址,所以使用一个域名但是每个节点解析的 IP 不同。当 IP 地址发生变化时仅需要修改解析地址即可。
本地内核负载
通过这样的方式实现每个 Node 上通过本地内核负载均衡访问 masters:
在 Node 上起了一个 LVScare 的 static pod 去守护这个 IPVS,一旦 apiserver 不可访问了,会自动清理掉所有 Node 上对应的 IPVS 规则, Master 恢复正常时添加回来。
所以在你的 Node 上加了三个东西,可以直观的看到:
定制 kubeadm
sealos 对 kubeadm 改动非常少,主要是延长了证书过期时间和扩展了 join 命令。下面主要讲讲对 join 命令的改造。
首先 join 命令增加 –master 参数用于指定 Master 地址列表:
这样就可以拿到 Master 地址列表去做 IPVS 负载均衡了。
如果不是控制节点且不是单 Master,那么就只创建一条 IPVS 规则,控制节点上不需要创建,连自己的 apiserver 即可:
然后再去创建 lvscare static pod 来守护 IPVS:
所以哪怕你不使用 sealos,也可以直接用定制过的 kubeadm 去部署集群,只是麻烦一些。下面给出安装步骤。
kubeadm 配置文件:
在 master0(假设 vip 地址为 10.103.97.100)上执行以下命令:
在 master1(假设 vip 地址为 10.103.97.101)上执行以下命令:
在 master2(假设 vip 地址为 10.103.97.102)上执行以下命令:
在 node 上 join 时加上 –master 参数指定 master 地址列表:
离线包结构分析
巴西龟冬天放在北面阳台能存活吗?北京
常温0度以上就可以,
生化危机5配置高吗?
生化危机5配置要求最低配置-操作系统:Windows XP-处理器:Pentium D或者Athlon 64 X2系列-内存:XP 512MB;Vista 1GB-硬盘:8GB或更多可用空间-显卡:支持DX9.0c、256MB显存,GeForce 6800系列或者Radeon HD 2400 Pro-声卡:DX9.0c兼容-显示器:800×600分辨率-控制器:键盘和鼠标-网络:宽带连接推荐配置-操作系统:Windows Vista-处理器:Core 2 Quad/Phenom X4系列或更好-内存:XP 1GB或更多;Vista 2GB或更多-硬盘:8GB或更多可用空间-显卡:512MB显存,GeForce 9800/Radeon HD 4800系列或更好-声卡:DX9.0c兼容-显示器:1280×720分辨率或更高-控制器:Xbox 360 for Windows手柄-网络:宽带连接
天棚和吊顶有什么区别
怎么选择吊顶天花板?吊顶是室内设计中常常采用的一种手法,人们的视线往往与它接触的时间较多。 因此,吊顶的外形及艺术处理很显著地影响着空间效果。 吊顶材料主要有矿棉板、石膏板、木板、PVC塑料扣板、玻璃、金属等几种。 这里着重介绍各种材料的特征状况。 怎么选择吊顶天花板之PVC塑料扣板①特点它以PVC为原料,经加工成为企口式型材,具有重量轻、安装简便、防水防潮、防蠹虫的特点,它表面的花色图案变化也非常多,并且耐污染、好清洗、有隔音、隔热的良好机能,特别是新工艺中加入了阻燃材料,使其能离火即灭,使用更为安全。 它本钱低、装饰效果好。 因此,在家庭装修吊顶材料中据有重要位置,成为卫生间、厨房、阳台等吊顶的主导材料。 怎么选择吊顶天花板效果图1②质量鉴定选购PVC吊顶型材时,一定要向经销商索要质检讲演和产品检测合格证。 目测外观质量板面应平整光滑、无裂纹、无磕碰、能装拆自如,表面有汹涌无划痕;用手敲击板面声音清脆。 检查测试讲演中,产品的机能指标应知足:热收缩率小于0.3%,氧指数大于35%,软化温度摄氏度以上,燃点3000摄氏度以上,吸水率小于15%,吸湿率小于4%。 ③安装首先,应在墙面弹出标高线,在墙的两端固定压线条,用水泥钉与墙面固定牢固。 板材按顶棚实际尺寸裁好,将板材插入压条内,板条的企口向外,安装端正后,用钉子固定住,然后插入第二片板。 最后一块板应按照实际尺寸裁切,裁切时使用锋利裁刀,用钢尺压住弹线切裁,装入时稍作弯曲就可插入上块板企口内,装完后两侧压条封口。 ④维护和更换PVC吊顶型材的耐水、耐擦洗能力很强。 日常使用中可用清洗剂擦洗后,用净水清洗;板缝间易受油渍,清洗时,可用刷子蘸清洗剂洗擦后,用净水冲净;留意照明电路不要沾水。 PVC吊顶型材若发生损坏,更新十分利便,只要将一真个压条取下,将板逐块从压条中抽出,用新板更换破损板再重新安装,压好压条即可。 更换时应留意新板与旧板的颜色需一样,不要有色差。 怎么选择吊顶天花板效果图2怎么选择吊顶天花板之金属制品吊顶金属制品吊顶指的是一种集多种功能、装饰性于一体的吊顶金属装饰板。 与传统吊顶材料比拟,除保持其特性外,质感、装饰感方面更优,可分为吸声板和装饰板(不开孔)。 吸声板是根据声学原理,利用各种不同穿孔率的金属板来达到消除噪声,也型根据需要有圆孔、方孔、长圆孔、长方孔、大小组合孔等不同孔型,底板大都是白色或铝色。 另一种金属装饰板,特别注重装饰性,线条简洁流畅,造型美观,光彩优雅,有古铜、黄金、红蓝、奶白等颜色;规格刚好与普通住宅的宽度相吻全,与大理石、铝合金门窗等材料连接浑然一体,高雅华丽,为适静的居室环境锦上添花。 金属装饰板的材质种类有铝、铜、不锈钢、铝合金等,选择铜、不锈钢材料的装饰板档次较高,价格也高,一般的居室装饰,选择铝合金装饰板较合适,符合人们一般的购物心理,即物美价廉。 规格方面有长方形、方形等,长方形板的最大规格有6000mm×100mm×0.5mm,一般居室的宽度约5m多,对较大居室的装修,选用长条形板材的整体性强;对斗室间的装饰一般可选用500mm×500mm的。 因为金属板的绝热机能较差,为了获得一定的吸音、绝热功能,在选择金属板进行吊顶装饰时,可以利用内加玻璃棉、岩棉等保温吸音的产品达到绝热吸音的功能。 尤其是栖身在顶层的居民,装饰后可改善室内环境,显著节约空调的能源消耗用度。 怎么选择吊顶天花板效果图3怎么选择吊顶天花板之石膏板吊顶石膏板是目前应用比较广泛的一类新型吊顶装饰材料,具有良好的装饰效果和较好的吸音机能,较常用的有浇筑石膏装饰板和纸面装饰吸音板。 浇筑石膏装饰板具有质轻、防潮、不变形、防火、阻燃等特点。 并有施工利便,加工机能好,可锯、可钉、可刨、可粘结等长处。 主要品种有:各种平板、花纹浮雕板、半穿孔板、全穿孔板、防水板等。 花纹浮雕板合用于居室的客厅、卧室、书房吊顶;防水板多用于整体厨房、卫生间等湿度较大的场所。 纸面装饰吸音板具有防火、隔音、隔热、抗振念头能好、施工利便等特点。
发表评论