sealos——高可用集群的部署

一、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 算法核心机制:
  1. Leader 选举:只有一个 Leader 处理写请求
  2. 日志复制:Leader 将数据复制到所有 Follower
  3. 多数派原则:需要 (N/2 + 1) 个节点确认
  4. 客户端通过负载均衡连接到 etcd 集群
  • 容错能力:
  1. 3 节点集群:允许 1 个节点故障
  2. 5 节点集群:允许 2 个节点故障
  3. 写操作需要多数节点确认

四、知识点补充

1.公有云方案

2.分布式锁

  • 分布式锁是一种用于协调分布式系统中并发访问共享资源的机制。在分布式系统中,多个节点或进程可能同时竞争访问某个共享资源,而分布式锁可以确保在任意时刻只有一个节点或进程能够获取到锁,从而避免并发冲突和数据不一致的问题。
  • 实现分布式锁的方式有很多种,其中一种常见的方式是使用基于共享存储(如etcd、ZooKeeper等)的分布式锁。具体而言,每个节点或进程可以通过在共享存储中创建特定的标记或临时节点来尝试获取锁。只有成功创建标记或节点的实体才能获得锁,其他实体将等待或轮询直到锁被释放。

相关推荐
seven_76782309840 分钟前
【前瞻创想】Kurator架构演进与云原生未来
分布式·云原生·架构·kurator·全链路
可可苏饼干1 小时前
容器与 Docker
运维·笔记·学习·docker·容器
熊出没1 小时前
微服务架构介绍
微服务·云原生·架构
能不能别报错1 小时前
k8s的cicd流水线环境搭建实验
云原生·容器·kubernetes
Hernon1 小时前
微服务架构设计 - 单体架构
微服务·云原生·架构·系统架构
todoitbo1 小时前
openEuler 云原生进阶:K3s 轻量级 Kubernetes 集群实战
云原生·容器·kubernetes·openeuler
凯子坚持 c1 小时前
深探 openEuler 云原生基石:iSula 与 Kata Containers 安全容器的极致评测与性能剖析
安全·云原生·rpc
赴前尘2 小时前
docker 配置ipv6地址
java·docker·容器