一、Sealos 介绍
1.简介
Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,能很好的支持在生产环境中部署高可用的 Kubernetes 集群
2.Sealos 特性与优势
- 支持离线安装,工具与部署资源包分离,方便不同版本间快速升级
- 证书有效期默认延期至 99 年
- 工具使用非常简单
- 支持使用自定义配置文件,可灵活完成集群环境定制
- 使用内核进行本地负载,稳定性极高,故障排查也极其简单
- 最主要的优势是不需要翻墙出去
二、部署K8S集群
准备四台虚拟机,三台master做apiserver高可用,一台worker
1.下载 Sealos 命令行工具
[root@master1 ~]# VERSION=v5.0.1
[root@master1 ~]# export PROXY_PREFIX=https://ghfast.top
[root@master1 ~]# curl -sfL ${PROXY_PREFIX}/https://raw.githubusercontent.com/labring/sealos/main/scripts/install.sh | PROXY_PREFIX=${PROXY_PREFIX} sh -s ${VERSION} labring/sealos
[root@master1 ~]# sealos version
SealosVersion:
buildDate: "2024-10-09T02:18:27Z"
compiler: gc
gitCommit: 2b74a1281
gitVersion: 5.0.1
goVersion: go1.20.14
platform: linux/amd64
2.安装需求
- 每个集群节点应该有不同的主机名。主机名不要带下划线
- 所有节点的时间需要同步
- 需要在 K8s 集群的第一个 master 节点 上运行 sealos run 命令,目前集群外的节点不支持集群安装
- 建议使用干净的操作系统来创建集群。不要自己装 Docker
- 支持大多数 Linux 发行版,例如:Ubuntu、CentOS、Rocky linux
- 支持Docker Hub中的所有 Kubernetes 版本
- 支持使用 Containerd 作为容器运行时
- 在公有云上安装请使用私有 IP
3.生成集群配置文件
# -p 参数指的是 虚拟机的 SSH 登录密码
[root@master1 ~]# sealos gen registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.14 \
registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2 \
registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
--masters 192.168.5.10,192.168.5.20,192.168.5.30 \
--nodes 192.168.5.40 \
-p '342888' --output Clusterfile.yaml
# 初始化集群
[root@master1 ~]# sealos apply -f Clusterfile.yaml
2025-12-03T19:04:28 info succeeded in creating a new cluster, enjoy it!
2025-12-03T19:04:28 info
___ ___ ___ ___ ___ ___
/\ \ /\ \ /\ \ /\__\ /\ \ /\ \
/::\ \ /::\ \ /::\ \ /:/ / /::\ \ /::\ \
/:/\ \ \ /:/\:\ \ /:/\:\ \ /:/ / /:/\:\ \ /:/\ \ \
_\:\~\ \ \ /::\~\:\ \ /::\~\:\ \ /:/ / /:/ \:\ \ _\:\~\ \ \
/\ \:\ \ \__\ /:/\:\ \:\__\ /:/\:\ \:\__\ /:/__/ /:/__/ \:\__\ /\ \:\ \ \__\
\:\ \:\ \/__/ \:\~\:\ \/__/ \/__\:\/:/ / \:\ \ \:\ \ /:/ / \:\ \:\ \/__/
\:\ \:\__\ \:\ \:\__\ \::/ / \:\ \ \:\ /:/ / \:\ \:\__\
\:\/:/ / \:\ \/__/ /:/ / \:\ \ \:\/:/ / \:\/:/ /
\::/ / \:\__\ /:/ / \:\__\ \::/ / \::/ /
\/__/ \/__/ \/__/ \/__/ \/__/ \/__/
Website: https://www.sealos.io/
Address: github.com/labring/sealos
Version: 5.0.1-2b74a1281
[root@master1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 32m v1.30.14
master2 Ready control-plane 31m v1.30.14
master3 Ready control-plane 30m v1.30.14
worker Ready <none> 30m v1.30.14
补充知识点:
kubectl如何找到apiserver?
[root@master1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.5.10 sealos.hub
192.168.5.10 apiserver.cluster.local
[root@worker ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.5.10 sealos.hub
10.103.97.2 apiserver.cluster.local
192.168.5.40 lvscare.node.ip
worker节点如何实现高可用?
[root@worker ~]# vi /etc/kubernetes/manifests/kube-sealos-lvscare.yaml
- care
- --vs
- 10.103.97.2:6443
- --health-path
- /healthz
- --health-schem
- https
- --rs
- 192.168.5.10:6443
- --rs
- 192.168.5.20:6443
- --rs
- 192.168.5.30:6443
# 本地负载均衡器:
客户端请求 10.103.97.2:6443 这个VIP
→ lvscare 负载均衡
→ 转发到健康的 Master 节点(如 192.168.5.10:6443.....)
4.重置集群
sealos reset
注:如果出了问题可以重置集群再安装
5.增删节点
# 添加节点
sealos add --nodes x.x.x.x
# 添加控制节点
sealos add --masters x.x.x.x
# 删除节点
sealos delete --nodes x.x.x.x
# 删除控制节点
sealos delete --masters x.x.x.x
6.查看集群证书有效期
[root@master1 ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W1203 19:32:06.042552 10779 utils.go:69] The recommended value for "healthzBindAddress" in "KubeletConfiguration" is: 127.0.0.1; the provided value is: 0.0.0.0
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Nov 09, 2125 11:01 UTC 99y ca no
apiserver Nov 09, 2125 11:01 UTC 99y ca no
apiserver-etcd-client Nov 09, 2125 11:01 UTC 99y etcd-ca no
apiserver-kubelet-client Nov 09, 2125 11:01 UTC 99y ca no
controller-manager.conf Nov 09, 2125 11:01 UTC 99y ca no
etcd-healthcheck-client Nov 09, 2125 11:01 UTC 99y etcd-ca no
etcd-peer Nov 09, 2125 11:01 UTC 99y etcd-ca no
etcd-server Nov 09, 2125 11:01 UTC 99y etcd-ca no
front-proxy-client Nov 09, 2125 11:01 UTC 99y front-proxy-ca no
scheduler.conf Nov 09, 2125 11:01 UTC 99y ca no
super-admin.conf Dec 03, 2026 11:02 UTC 364d ca no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Nov 09, 2125 11:01 UTC 99y no
etcd-ca Nov 09, 2125 11:01 UTC 99y no
front-proxy-ca Nov 09, 2125 11:01 UTC 99y no
注:证书有效期都是99年
三、控制面组件高可用
[root@master1 ~]# kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
cilium-4w5hb 1/1 Running 0 53m
cilium-dqrkf 1/1 Running 0 53m
cilium-jzpcs 1/1 Running 0 53m
cilium-operator-748c49f488-4fkpz 1/1 Running 0 53m
cilium-qg989 1/1 Running 0 53m
coredns-55cb58b774-p2nrn 1/1 Running 0 55m
coredns-55cb58b774-w8tz5 1/1 Running 0 55m
etcd-master1 1/1 Running 0 55m
etcd-master2 1/1 Running 0 55m
etcd-master3 1/1 Running 0 54m
kube-apiserver-master1 1/1 Running 0 55m
kube-apiserver-master2 1/1 Running 0 55m
kube-apiserver-master3 1/1 Running 0 54m
kube-controller-manager-master1 1/1 Running 0 55m
kube-controller-manager-master2 1/1 Running 0 55m
kube-controller-manager-master3 1/1 Running 0 54m
kube-proxy-pjgvm 1/1 Running 0 54m
kube-proxy-pm52p 1/1 Running 0 54m
kube-proxy-pnm7j 1/1 Running 0 55m
kube-proxy-qdwgh 1/1 Running 0 55m
kube-scheduler-master1 1/1 Running 0 55m
kube-scheduler-master2 1/1 Running 0 55m
kube-scheduler-master3 1/1 Running 0 54m
kube-sealos-lvscare-worker 1/1 Running 0 53m
1.kube-apiserver
实现方式: 多实例 + 负载均衡
- 部署 3、5、7 个实例(奇数台)
- 所有实例同时工作,处理客户端请求
- 需要外部负载均衡器将流量分发到各实例
负载均衡方案:
- 负载均衡器 SLB 云上
- Keepalived + HAproxy 4层负载均衡 私有云
- Keepalived + Nginx
- LVS
2.kube-controller-manager
实现方式: 多实例 + Leader 选举
-
部署多个实例(通常与 Master 节点数相同)
-
只有 Leader 工作,其他实例处于备用状态
-
选举机制:通过 etcd 分布式锁实现
-
故障转移:Leader 故障后,其他实例竞争成为新 Leader(约15秒)
查看当前 Leader
[root@master1 ~]# kubectl -n kube-system exec -it etcd-master3 -- sh
sh-5.2# etcdctl --endpoints https://localhost:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt get /registry/leases/kube-system/kube-controller-manager

3.kube-scheduler
实现方式: 多实例 + Leader 选举
-
部署多个实例(通常与 Master 节点数相同)
-
只有 Leader 工作,其他实例备用
-
选举机制:同样通过 etcd 分布式锁
查看当前 Leader
[root@master1 ~]# kubectl -n kube-system exec -it etcd-master3 -- sh
sh-5.2# etcdctl --endpoints https://localhost:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt get /registry/leases/kube-system/kube-scheduler

4.etcd

实现方式: 多实例 + Raft 共识算法
- 部署 3、5、7 个实例(必须奇数)
- Raft 算法核心机制:
- Leader 选举:只有一个 Leader 处理写请求
- 日志复制:Leader 将数据复制到所有 Follower
- 多数派原则:需要 (N/2 + 1) 个节点确认
- 客户端通过负载均衡连接到 etcd 集群
- 容错能力:
- 3 节点集群:允许 1 个节点故障
- 5 节点集群:允许 2 个节点故障
- 写操作需要多数节点确认
四、知识点补充
1.公有云方案
2.分布式锁
- 分布式锁是一种用于协调分布式系统中并发访问共享资源的机制。在分布式系统中,多个节点或进程可能同时竞争访问某个共享资源,而分布式锁可以确保在任意时刻只有一个节点或进程能够获取到锁,从而避免并发冲突和数据不一致的问题。
- 实现分布式锁的方式有很多种,其中一种常见的方式是使用基于共享存储(如etcd、ZooKeeper等)的分布式锁。具体而言,每个节点或进程可以通过在共享存储中创建特定的标记或临时节点来尝试获取锁。只有成功创建标记或节点的实体才能获得锁,其他实体将等待或轮询直到锁被释放。