首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

作者头像
iMike
发布于 2019-10-15 15:22:01
发布于 2019-10-15 15:22:01
4.5K00
代码可运行
举报
文章被收录于专栏:运维之美运维之美
运行总次数:0
代码可运行

前段时间,我们在 「使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群」一文中介绍了如何使用 Kind 这个开箱即可快速部署 Kubernetes 高可用集群的神器,相信不少同学用上这个神器后大大的降低了 Kubernetes 集群的部署难度和提高了 Kubernetes 集群的部署速度。

不过有一点比较遗憾的是 Kind 当前仅仅支持在本地快速构建一个开发或者测试环境,目前暂时还是不支持在生产环境中部署 Kubernetes 高可用集群的。今天,我们就要给大家介绍另一款可以支持在生产环境中部署 Kubernetes 高可用集群的利器 Sealos

什么是 Sealos ?

Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,Sealos 能很好的支持在生产环境中部署高可用的 Kubernetes 集群。

Sealos 架构图

Sealos 特性与优势

  1. 支持离线安装,工具与部署资源包分离,方便不同版本间快速升级。
  2. 证书有效期默认延期至 99 年。
  3. 工具使用非常简单。
  4. 支持使用自定义配置文件,可灵活完成集群环境定制。
  5. 使用内核进行本地负载,稳定性极高,故障排查也极其简单。

Sealos 设计原则和工作原理

1. 为什么不使用 Ansilbe 实现

Sealos 1.0 版本时是使用 Ansible 实现的,这样在使用时就必须先安装 Ansible 及一些 Python 的依赖包和进行一些必须的相关环境配置,使用起来还是比较复杂的。

为了解决这个问题,目前新版本的 Sealos 采用二进制文件方式提供。新版本 Sealos 没有任何依赖,开箱即用。

文件分发与远程命令都通过调用对应 SDK 实现,不依赖其它任何环境。

2. 为什么不用 KeepAlived 和 HAProxy 实现集群高可用

无论是通过 KeepAlived 还是 HAProxy 进行高可用集群调度都会存在以下一些劣势。

  1. 软件源不一致可能导致容器中安装的软件版本也不一致,进而会引起相应检查脚本不生效等故障。
  2. 可能因为系统依赖库问题,在某些特定环境下就直接无法完成安装。
  3. 只依靠检测 HAProxy 进程是否存活是无法保证集群高可用的,正确的检测方式应该是判断 ApiServer 是否 healthz 状态。
  4. Keepalived 可能存在 Cpu 占满的情况。

3. 本地负载为什么不使用 Envoy 或者 Nginx 实现

Sealos 高可用实现是通过本地负载方式完成的。本地负载实现方式有多种,比如:IPVSEnvoyNginx 等,而 Sealos 采用的是通过内核 IPVS 来实现的。

本地负载:在每个 Node 节点上都启动一个负载均衡,同时监听集群中的多个 Master 节点。

Sealos 选择通过内核 IPVS 来实现主要有以下几个原因:

  • 如果使用 Envoy 等需要在每个节点上都跑一个进程,消耗更多资源。虽然 IPVS 实际上也会多跑一个 lvscare 进程 ,但是 lvscare 只是负责管理 IPVS 规则,原理和 Kube-Proxy类似。真正的流量直接从内核层面走,不需要把数据包先走到用户态中去处理。
  • 使用 Envoy 存在启动优先级的问题,比如:Join 集群时,如果负载均衡没有建立,Kubelet 就会启动失败。使用 IPVS 则不会存在这样的问题,因为我们可以在 Join 集群前先建立好转发规则。

3.1 本地内核负载工作原理

Sealos 通过本地内核负载的方式实现每个 Node 节点负载均衡访问所有 Master 节点,具体参见下图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  +----------+                       +---------------+  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 PodIPVS 进行守护。如果检测到 ApiServer 不可用时,Sealos 会自动清理掉所有 Node 节点上对应的主节点 IPVS 转发规则。直到 Master 节点恢复正常时,再自动生成对应规则。为了实现以上功能,我们在 Node 节点上增加了下面这些内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 增加了一个 lvscare 的 Static Pod$ cat /etc/kubernetes/manifests
# 自动创建的一些 IPVS 规则$ ipvsadm -Ln
# 增加了对虚拟 IP 的地址解析$ cat /etc/hosts

4. 为什么要定制 Kubeadm

  • 解决默认证书有效期只有一年的问题。
  • 更方便的实现本地负载。
  • 核心的功能均集成到 Kubeadm 中了,Sealos 只管分发和执行上层命令,相对就更轻量了。

5. Sealos 执行流程

  1. 通过 SFTP 或者 Wget 命令把离线安装包拷贝到目标机器上,包括所有 MasterNode 节点。
  2. Master 0 节点上执行 kubeadm init 命令。
  3. 在其它 Master 节点上执行 kubeadm join 命令并设置控制面。这个过程中多个 Master 节点上的 Etcd 会自动组成一个 Etcd 集群,并启动相应控制组件。
  4. 所有 Node 节点都加入到集群中,这个过程中会在 Node 节点上进行 IPVS 转发规则和 /etc/hosts 配置。

Node 节点对 ApiServer 的访问均是通过域名进行的。因为 Node 节点需要通过 虚拟 IP 连接到多个 Master 上,但是每个 Node 节点的 KubeletKube-Proxy 访问 ApiServer 的地址是不同的,所以这里使用域名来解析每个节点上 ApiServer 不同的 IP 地址。

使用 Sealos 部署高可用 Kubernetes 集群

1. 安装相关环境依赖

通过 Sealos 进行 Kubernetes 集群部署,你需要先准备好以下环境。

  1. 在所有要部署的机器上,先完成 Docker 的安装和启动。
  2. 下载 Kubernetes 离线安装包。
  3. 下载最新版本 Sealos
  4. 对所有服务器进行时间同步。

1. Sealos 项目地址:https://github.com/fanux/sealos/releases 2. Kubernetes 离线安装包:https://github.com/sealstore/cloud-kernel/releases/

2. 通过 Sealos 部署高可用 Kubernetes 集群

目前 Sealos 已经支持最新版本 Kubernetes 1.16.0 的高可用集群安装。

2.1 Sealos 常用参数说明
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--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 ,不推荐修改,集群外不可访问
2.2 部署一个单主节点的 Kubernetes 集群

通过 Sealos 部署 Kubernetes 集群是非常简单的 ,通常只需以下两条指令就可以完成安装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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 免密登陆,你可以直接使用对应密钥进行部署。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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/ 进行下载。

2.3 部署一个多主节点的高可用 Kubernetes 集群
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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
2.4 验证部署是否成功
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get nodeNAME                      STATUS   ROLES    AGE     VERSIONizj6cdqfqw4o4o9tc0q44rz   Ready    master   2m25s   v1.16.0izj6cdqfqw4o4o9tc0q44sz   Ready    master   119s    v1.16.0izj6cdqfqw4o4o9tc0q44tz   Ready    master   63s     v1.16.0izj6cdqfqw4o4o9tc0q44uz   Ready    <none>   38s     v1.16.0
$ kubectl get pod --all-namespacesNAMESPACE     NAME                                              READY   STATUS    RESTARTS   AGEkube-system   calico-kube-controllers-5cbcccc885-9n2p8          1/1     Running   0          3m1skube-system   calico-node-656zn                                 1/1     Running   0          93skube-system   calico-node-bv5hn                                 1/1     Running   0          2m54skube-system   calico-node-f2vmd                                 1/1     Running   0          3m1skube-system   calico-node-tbd5l                                 1/1     Running   0          118skube-system   coredns-fb8b8dccf-8bnkv                           1/1     Running   0          3m1skube-system   coredns-fb8b8dccf-spq7r                           1/1     Running   0          3m1skube-system   etcd-izj6cdqfqw4o4o9tc0q44rz                      1/1     Running   0          2m25skube-system   etcd-izj6cdqfqw4o4o9tc0q44sz                      1/1     Running   0          2m53skube-system   etcd-izj6cdqfqw4o4o9tc0q44tz                      1/1     Running   0          118skube-system   kube-apiserver-izj6cdqfqw4o4o9tc0q44rz            1/1     Running   0          2m15skube-system   kube-apiserver-izj6cdqfqw4o4o9tc0q44sz            1/1     Running   0          2m54skube-system   kube-apiserver-izj6cdqfqw4o4o9tc0q44tz            1/1     Running   1          47skube-system   kube-controller-manager-izj6cdqfqw4o4o9tc0q44rz   1/1     Running   1          2m43skube-system   kube-controller-manager-izj6cdqfqw4o4o9tc0q44sz   1/1     Running   0          2m54skube-system   kube-controller-manager-izj6cdqfqw4o4o9tc0q44tz   1/1     Running   0          63skube-system   kube-proxy-b9b9z                                  1/1     Running   0          2m54skube-system   kube-proxy-nf66n                                  1/1     Running   0          3m1skube-system   kube-proxy-q2bqp                                  1/1     Running   0          118skube-system   kube-proxy-s5g2k                                  1/1     Running   0          93skube-system   kube-scheduler-izj6cdqfqw4o4o9tc0q44rz            1/1     Running   1          2m43skube-system   kube-scheduler-izj6cdqfqw4o4o9tc0q44sz            1/1     Running   0          2m54skube-system   kube-scheduler-izj6cdqfqw4o4o9tc0q44tz            1/1     Running   0          61skube-system   kube-sealyun-lvscare-izj6cdqfqw4o4o9tc0q44uz      1/1     Running   0          86s
2.5 最简单粗暴的视频教程

如果你觉得上面的教程还是不够直观,现在就给你一个更简单粗暴的学习方式。猛击下方视频,开始吧!

2.6 升级 Kubernetes 集群版本

Kubernetes 集群目前处于一个高速迭代期,每个新版本的发布都提供了不少新的特性。升级 Kubernetes 集群版本也就成了家常便饭,Sealos 也为大家提供非常方便的功能来帮助大家快速完成 Kubernetes 集群升级。Kubernetes 集群升级大致需要以下几个步骤:

  1. 升级所有节点的 Kubeadm 并导入新的镜像。
  2. 升级 Master 节点上的 Kubelet
  3. 升级其它 Master 节点。
  4. 升级 Node 节点。
  5. 验证集群状态。

2.6.1 升级 Kubeadm

这一步主要用于更新 KubeadmKubectlKubelet 等二进制文件,并导入新版本的镜像。升级方法很简单,只需复制离线包到所有节点并执行以下命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd kube/shell && sh init.sh

2.6.2 升级 Master 节点上的 Kubelet

升级 Kubelet 还是很简单的,只需要把新版本的 Kubelet 复制到 /usr/bin 目录下替换旧版本,然后重启 Kubelet 服务即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubeadm upgrade plan$ kubeadm upgrade apply v1.16.0
# 重启 Kubelet$ systemctl restart kubelet

其中最重要的 kubeadm upgrade apply 命令主要完成以下一些操作。

  • 验证集群是否可升级并执行版本升级策略。
  • 确认离线包中相关镜像是否可用。
  • 对控制组件的容器进行升级,失败就回滚。
  • Kube-DNSKube-Proxy 进行升级。
  • 创建新的证书文件并备份旧的证书文件。

2.6.3 升级其它 Master 节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubeadm upgrade apply

2.6.4 升级 Node 节点

升级 Node 节点前,首先要驱逐节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl drain $NODE --ignore-daemonsets

其次,是更新 Kubelet 的配置文件和升级 Node 节点的 Kubelet

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubeadm upgrade node config --kubelet-version v1.16.0
# 同样是替换二进制文件并重启 Kubelet$ systemctl restart kubelet

最后,恢复 Node 节点为可调度状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl uncordon $NODE

2.6.5 验证集群是否升级成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get nodes

如果输出的节点的版本信息是和升级的版本一致的话,一切就搞定了!

3. 集群清理

如果你需要快速清理已部署的 Kubernetes 集群环境,你可以使用下面的命令快速完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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 高可用集群,你还有哪些更好用更高效的方法呢?欢迎大家留言讨论哟!

你可能还喜欢

点击下方图片即可阅读

5 分钟学会写一个自己的 Prometheus Exporter

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奇妙的Linux世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》011-Vue 组件的属性和方法:计算属性和侦听器
在现代前端开发中,Vue.js 作为一款流行的框架,已经成为构建用户界面的重要工具。它通过组件化的方式,使得开发者能够高效地管理复杂的界面和逻辑。在 Vue 组件中,属性和方法是核心概念,而计算属性和侦听器更是实现动态交互和数据响应的重要工具。
愚公搬代码
2025/06/29
1290
前端二面vue面试题总结_2023-03-01
在 Vue3.0 中变量必须 return 出来, template 中才能使用;而在 Vue3.2 中只需要在 script 标签上加上 setup 属性,无需 return, template 便可直接使用,非常的香啊!
用户10377014
2023/03/01
8570
Vue学习3:计算属性computed与监听器
下面是计算属性相关代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vue3</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <!--<link rel="stylesheet" type="text/css" href="main.
用户1149564
2018/05/28
5550
计算属性的基本操作和复杂操作
FGGIT
2024/10/15
1410
Vue3 组合式 API 的特性、用法和最佳实践
Vue3 是一种流行的 JavaScript 框架,它引入了全新的组合式 API,在开发大型和复杂的应用程序时提供了更灵活和强大的工具。本文将详细介绍 Vue3 组合式 API 的特性、用法和最佳实践。
网络技术联盟站
2023/07/05
1.1K0
vue v-model 双向绑定
v-model 双向绑定,用于处理表单输入绑定,类似于 react 中的受控组件。
jgrass
2024/12/25
2420
vue v-model 双向绑定
10天从入门到精通Vue(四)Vue中的路由指南
考虑一个问题:想要实现 名 和 姓 两个文本框的内容改变,则全名的文本框中的值也跟着改变;
共饮一杯无
2022/11/28
6000
10天从入门到精通Vue(四)Vue中的路由指南
VUE基础入门使用教程
第一个Vue程序 .html <!--view层 ${} 变成了一个模板--> <div id="app"> <ul> <li><span v-bind:title="m">鼠标悬停几秒查看此处动态绑定的提示信息!</span> </li> <li>{{name}}</li> <li>{{tit.name}}</li> </ul> <a v-bind:href="tit.url">b站链接</a> </div> .scrip
JanYork_简昀
2022/05/18
4790
Vue专题 01_计算属性vs监听(侦听)属性
对于初学者来说,学到计算属性和监听(侦听)属性这里很容易犯晕,搞不懂这两者之前的区别和什么时候该使用哪个,这里Dapan就来尝试梳理一下计算属性(computed)和监视(侦听)属性(watch)的区别,以及该选择使用哪一个:
用户9999906
2022/09/26
5440
一、Vue2笔记--基础篇--09-监视属性
==================== 监视属性的属性方法 ======================
打不着的大喇叭
2024/03/11
1320
一、Vue2笔记--基础篇--09-监视属性
Vue前端篇——Vue 3中的计算属性(computed)
在Vue 3中,计算属性提供了一种高效的方式来处理数据计算,尤其是当计算结果依赖于多个响应式数据时。与之相比,直接在模板中进行计算可能会导致性能问题和不必要的重复计算。
小明爱吃火锅
2024/07/26
3K0
Vue2.v-指令
上面代码中score上面的click也是可以触发的,不必是按钮。 如果不加this,访问的是全局变量。 可以调用传参。
WuShF
2024/01/10
2070
Vue2.v-指令
vue学习笔记3
什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可; 组件化和模块化的不同:
用户6362579
2019/09/29
8270
Vue专题 02_计算属性(computed) VS 方法(methods)
两种方式的最终结果都是完全相同的(这里解释一下为什么会相同:当计算属性所依赖的数据发生改变时,计算属性会重新调用;当data中的任何一个数据发生变化时,Vue的模板都会重新解析一遍(Vue都会拿过来模板整体再阅读一遍),所以方法也被调用了一次)
用户9999906
2022/09/26
4410
vue学习笔记4
考虑一个问题:想要实现 名 和 姓 两个文本框的内容改变,则全名的文本框中的值也跟着改变;(用以前的知识如何实现???)
用户6362579
2019/09/29
6830
vue基础(四)
什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可; 组件化和模块化的不同: + 模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一; + 组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;
不愿意做鱼的小鲸鱼
2022/09/24
2K0
vue基础(四)
计算属性是如何被Vue实现的
无论是面试过程还是日常业务开发,相信大多数前端开发者对于 Vue 的应用已经熟能生巧了。
19组清风
2022/09/27
9670
计算属性是如何被Vue实现的
Vue之计算属性
--', newValue); const names = newValue.split(' '); this.firstName = names[0]; this.lastName = names[1]; }, get: function () { return this.firstName + ' ' + this.lastName } },
yuanshuai
2022/08/22
6550
Vue之计算属性
2020年,vue面试遇到的问题(上)
原文有 36 到 vue 常用面试题,考虑到太多一次也看不完,所以分为 上、中、下三篇,如果你能读完这三篇文章,相信你在面试中 vue 的问题你不会怕了。
桃翁
2020/03/13
2K0
【Vue3+TypeScript】CRM系统项目搭建之 — 关于 VUE3 语法新变化
vite 是新一代前端构建工具,官网地址:https://vitejs.cn,vite的优势如下:
HelloWorldZ
2024/03/20
6340
【Vue3+TypeScript】CRM系统项目搭建之 — 关于 VUE3 语法新变化
推荐阅读
相关推荐
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》011-Vue 组件的属性和方法:计算属性和侦听器
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 什么是 Sealos ?
  • Sealos 设计原则和工作原理
    • 1. 为什么不使用 Ansilbe 实现
    • 2. 为什么不用 KeepAlived 和 HAProxy 实现集群高可用
    • 3. 本地负载为什么不使用 Envoy 或者 Nginx 实现
    • 4. 为什么要定制 Kubeadm
    • 5. Sealos 执行流程
  • 使用 Sealos 部署高可用 Kubernetes 集群
    • 1. 安装相关环境依赖
    • 2. 通过 Sealos 部署高可用 Kubernetes 集群
      • 2.1 Sealos 常用参数说明
      • 2.2 部署一个单主节点的 Kubernetes 集群
      • 2.3 部署一个多主节点的高可用 Kubernetes 集群
      • 2.4 验证部署是否成功
      • 2.5 最简单粗暴的视频教程
      • 2.6 升级 Kubernetes 集群版本
    • 3. 集群清理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档