说明

官网地址: https://sealyun.com
Sealos 以云原生的方式,抛弃了传统的云计算架构,转向以 Kubernetes 为云内核的新架构,实现一个开源的、可随处运行的 AWS 替代方案
具体使用方式请参考官网文档
我这里介绍一些使用sealos安装k8s集群的一些定制化操作和小技巧

1. 下载sealos

以下方法任选其一

1.1 二进制下载安装sealos

1
2
wget https://github.com/labring/sealos/releases/download/v4.2.0/sealos_4.2.0_linux_amd64.tar.gz \
&& tar zxvf sealos_4.2.0_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin
1
2
wget https://github.com/labring/sealos/releases/download/v4.2.0/sealos_4.2.0_linux_arm64.tar.gz \
&& tar zxvf sealos_4.2.0_linux_arm64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin

1.2 包管理器安装sealos

1
2
3
4
5
6
7
8
9
sudo cat > /etc/yum.repos.d/labring.repo << EOF
[fury]
name=labring Yum Repo
baseurl=https://yum.fury.io/labring/
enabled=1
gpgcheck=0
EOF
sudo yum clean all
sudo yum install sealos
1
2
3
echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | sudo tee /etc/apt/sources.list.d/labring.list
sudo apt update
sudo apt install sealos

1.3 源码编译安装sealos

前置依赖

git
golang 1.19+
libgpgme-dev libbtrfs-dev libdevmapper-dev
如果在 arm64 环境下需要添加 :arm64 后缀。
构建

1
2
3
4
# git clone the repo
git clone https://github.com/labring/sealos.git
# just make it
make build BINS=sealos

2. 安装k8s集群

2.1 一键安装

2.1.1 单机一键安装

单机安装 Kuberentes

1
2
# sealos version must >= v4.1.0
sealos run labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 --single
  1. kubernetes版本为containerd版本,可选kubernetes-dockerkubernetes-crio等版本
  2. calico请选择与k8s版本对应的版本,否则会出现calico网络问题
  3. helm请务必安装,因为安装calico需要用到helm安装crd资源
  4. --single表示单机安装,如果不加--single则默认为高可用安装

2.1.2 高可用一键安装

1
2
3
sealos run labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \
--masters 192.168.64.2,192.168.64.22,192.168.64.20 \
--nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd]
  1. --masters表示master节点的ip地址,多个ip地址用,分割,--nodes同理
  2. 不设置主机名的情况下,默认主机名为IP地址,请在部署前设置好主机名
  3. -p 表示ssh密码

2.1.3 增加节点

1
2
sealos add --masters 192.168.64.21,192.168.64.19
sealos add --nodes 192.168.64.21,192.168.64.19

2.1.4 删除节点

1
2
sealos delete --masters 192.168.64.21,192.168.64.19 
sealos delete --nodes 192.168.64.21,192.168.64.19

2.1.5 清理重置集群

1
sealos reset

安装过程中如果出现问题,可以使用sealos reset命令清理集群,然后重新安装

3. 定制化安装

完成上面步骤就已经拥有了一个高可用k8s集群

下面介绍一些高级的定制化的安装方案

3.1 跨网段安装

你可以会遇到所用的服务器非同一个内网环境,比如阿里云的服务器、腾讯云的服务器和华为云的服务器需要组建成一个k8s集群
服务器不在同一个地域,masterA在上海,masterB在北京,nodeA在上海,nodeB在北京等情况
服务器的操作系统不一,腾讯云默认是OpenCloudOS,阿里使用AlmaLinux,华为云使用EulerOS

  1. 需要使用tincWireGuardZeroTierSoftEtherOpenVPN等工具组建虚拟局域网,这里推荐使用tincWireGuard
  2. 请将内核升级到5.4.240(x86_64)以上,或者一些适配k8s环境的内核版本
  3. sealos跨网络安装时复制文件是特别慢的,请看我下一部分的介绍
  4. 这里的思路就是将所有的服务器都加入到同一个虚拟局域网,然后sealos就可以在这个虚拟局域网中复制文件
  5. tinc等工具配置网络名称请配置为eth0ens33等网卡名称,比如腾讯云默认内网网卡名称为eth0,你就将虚拟网卡名称配置为ens33

以下是内核升级的参考方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--------------------升级内核 -------------------->
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org -y
# yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y #RHEL-7, SL-7 或者 CentOS-7
yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y #RHEL-8, SL-8 或者 CentOS-8
sed -i 's|mirrorlist=|#mirrorlist=|g; s|elrepo.org/linux|mirrors.aliyun.com/elrepo|g' /etc/yum.repos.d/elrepo.repo
sudo yum makecache

# 列出可用的所有版本内核相关包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates
# 安装支持版本的内核
# yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y # 最新主线版
yum --enablerepo=elrepo-kernel install kernel-lt -y # 最新长期支持版

# 设置 GRUB 默认的内核版本
grub2-set-default 0

# 开启BBR功能
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 删除旧内核
# rpm -qa | grep kernel
# yum remove kernel-3.10.0-957.1.3.el7.x86_64 -y

3.2 离线安装

sealos提供了下面命令用来打包和加载镜像的命令

1
2
3
sealos pull labring/kubernetes:v1.25.0  # 拉取镜像
sealos save -o kubernetes.tar labring/kubernetes:v1.25.0 # 打包镜像为tar包的文件
sealos load -i kubernetes.tar # 加载镜像

你可以使用sealos save命令将镜像打包为tar包,然后将tar包拷贝到离线环境中,使用sealos load命令加载镜像
然后通过sealos run kuberentes:v1.25.0之类的命令安装k8s集群,跟线上一样
sealosk8s等镜像是制作好了的,把所有k8s相关需要用到的镜像和文件打包好了放在里面的,所以安装的时候不需要联网

3.2.1 解决安装过程中复制文件长达几个小时的问题

sealos第一台执行命令的机器会把k8s相关的文件解压到/var/lib/sealos目录下,然后根据节点类别复制到其他机器上,如果是跨网段安装,那么复制文件的速度会很慢,走得是公网网络
第一台sealos会成为默认的镜像仓库,其他机器会从这台机器上拉取镜像,跨网络其过程也会很慢,甚至出错
解决方案:

  1. 在本地部署sealos分别把master/var/lib/sealos目录和node/var/lib/sealos目录打包成tar包解压到线上的/var/lib/sealos目录下,这样就可以跳过长时间的文件复制过程
  2. 将本地sealos的生成的k8s相关镜像,包括corednspausekube-proxykube-schedulerkube-controller-managerkube-apiserverkubeletetcdkube-proxyhelmcalicometrics-server等镜像打包成tar包加载到线上环境,不过这一步需要卡好时间,需要在sealos开始初始集群前进行load -i的操作
  3. 用这种方法将为你节省大量的时间,当然时间充裕可以慢慢等

3.2.2 自定义calico网络所用的网卡

calico默认使用eth0作为网卡,如果是跨网段安装,肯定是不行的,因为我们想让流量走虚拟内网,所以需要修改calico的配置
创建Clusterfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
name: default
spec:
hosts:
- ips:
- 192.168.0.2:22 # master节点ip
- 192.168.0.3:22
- 192.168.0.4:22
roles:
- master
- amd64
- ips:
- 192.168.0.5:22 # node节点ip
- 192.168.0.6:22
- 192.168.0.7:22
roles:
- node
- amd64
image:
- labring/kubernetes:v1.25.0
- labring/helm:v3.8.2
- labring/calico:v3.24.1
ssh:
passwd: xxx
pk: /root/.ssh/id_rsa
port: 22
user: root
status: {}
---
apiVersion: apps.sealos.io/v1beta1
kind: Config
metadata:
name: calico
spec:
path: charts/calico/values.yaml
strategy: merge
data: |
installation:
enabled: true
kubernetesProvider: ""
calicoNetwork:
ipPools:
- blockSize: 26
cidr: 10.160.0.0/12
encapsulation: IPIP
natOutgoing: Enabled
nodeSelector: all()
nodeAddressAutodetectionV4:
interface: "eth.*|en.*" # 这里修改为你的网卡

3.2.3 自定义k8s安装内容

自定义registryk8shelmcalicometrics-server等镜像的方法
创建Kubefile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM scratch
MAINTAINER sealyun # 作者
LABEL init="init.sh \$criData \$registryDomain \$registryPort \$registryUsername \$registryPassword" # init.sh是初始化脚本,这里的参数是传给init.sh的参数
LABEL version="v1.24.0" # 版本
LABEL image="" # 镜像名称
LABEL clean="clean.sh \$criData" # clean.sh是清理脚本,这里的参数是传给clean.sh的参数
LABEL check="check.sh" # check.sh是检查脚本,这里的参数是传给check.sh的参数
LABEL init-registry="init-registry.sh \$registryPort \$registryData \$registryConfig" # init-registry.sh是初始化registry脚本,这里的参数是传给init-registry.sh的参数
LABEL clean-registry="clean-registry.sh \$registryData \$registryConfig" # clean-registry.sh是清理registry脚本,这里的参数是传给clean-registry.sh的参数
LABEL auth="auth.sh" # auth.sh是认证脚本,这里的参数是传给auth.sh的参数
ENV criData=/var/lib/containerd
ENV registryData=/var/lib/registry
ENV registryConfig=/etc/registry
ENV registryDomain=sealos.hub # 这里是registry的域名
ENV registryPort=5000 # 这里是registry的端口
ENV registryUsername=admin # 这里是registry的用户名
ENV registryPassword=passw0rd # 这里是registry的密码
COPY . .

#使用 sealos build -t labring/kubernetes:v1.24.0 . 打包即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM scratch
MAINTAINER sealyun
LABEL init="init.sh"
LABEL version="v1.24.0"
LABEL image="__lvscare__"
LABEL clean="clean.sh \$criData \$criDockerdData"
LABEL check="check.sh \$registryData"
LABEL init-registry="init-registry.sh \$registryData \$registryConfig"
LABEL clean-registry="clean-registry.sh \$registryData \$registryConfig"
LABEL auth="auth.sh \$registryDomain \$registryPort \$registryUsername \$registryPassword"
LABEL sealos.io.type="rootfs"
ENV criData=/var/lib/docker
ENV criDockerdData=/var/lib/cri-dockerd
ENV registryData=/var/lib/registry
ENV registryConfig=/etc/registry
ENV registryDomain=sealos.hub
ENV registryPort=5000
ENV registryUsername=admin
ENV registryPassword=passw0rd
COPY . .

sealos build -t docker.io/labring/kubernetes-docker:v1.24.0 .

这样就制作出了自己的镜像,然后在Clusterfile文件中指定镜像名称,然后进行安装即可

4. 常见问题

4.1. 大量5000端口占用

BUG: image-cri-shim导致端口大量占用,耗尽服务器socket资源

该现象存在于一些旧版本的sealos中,在v4.2.0版本已经修复
解决办法:

1
2
3
4
5
wget https://github.com/labring/sealos/releases/download/v4.2.0/sealos_4.2.0_linux_amd64.tar.gz && tar xvf sealos_4.2.0_linux_amd64.tar.gz image-cri-shim
sealos exec -r master,node "systemctl stop image-cri-shim"
sealos scp "./image-cri-shim" "/usr/bin/image-cri-shim"
sealos exec -r master,node "systemctl start image-cri-shim"
sealos exec -r master,node "image-cri-shim -v"

4.2. sealos拉取的k8s、helm、calico镜像无法使用

sealos的镜像不是传统的docker镜像,不要使用docker run去运行 也不要尝试使用docker load -i去加载这些镜像
请正确使用sealos提供的sealos run sealos load -i命令去加载运行这些镜像
同样普通的calico镜像也不要使用sealos去加载,因为sealoscalico镜像是经过修改的,不是原生的calico镜像

4.3. sealos如何升级

使用下面的命令升级即可

1
2
curl -sfL  https://raw.githubusercontent.com/labring/sealos/v4.2.0/scripts/install.sh \
| sh -s v4.2.0 labring/sealos

觉得github下载慢的可以使用wget https://ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v4.2.0/scripts/install.sh下载sh脚本
vi install.shgithub.com替换为ghproxy.com/github.com即可