Linux 安装 K8S 之 sealos

摘要

安装前设置(所有节点)

  • 准备三台可以连接外网的主机,不要安装docker,k8s等,如已安装需先卸载

  • (推荐)升级系统内核,本文中非必须,升级内核方法参看 Linux 安装 K8S 之 kubeadm

每个集群节点应该有不同的主机名,主机名不要带下划线

1
2
3
4
# 添加主机名映射: vi /etc/hosts
10.211.55.12 k8s-m1
10.211.55.13 k8s-w1
10.211.55.14 k8s-w2

修正系统的时间

1
2
3
4
5
6
7
8
# 安装chrony
sudo dnf install chrony -y
# 启动服务
sudo systemctl enable --now chronyd
# 修正时间
sudo chronyc makestep
# 查看时间
date

安装 sealos

1
2
3
4
# 下载
wget https://github.com/labring/sealos/releases/download/v5.0.1/sealos_5.0.1_linux_amd64.rpm
# 安装
yum install -y sealos_5.0.1_linux_amd64.rpm
  • 安装 sealos 的自动补全

1
2
echo 'source <(sealos completion bash)' >> ~/.bashrc
source ~/.bashrc

创建k8s集群(master)

  • 创建集群: 使用sealos创建集群只需要一行命令,目前官网示例中的k8s版本为v1.29.9(小版本号越高越稳定)

  • 可以在docker hub上查询,或者使用 Registry Explorer 查看如下镜像的所有版本,不建议使用太高的版本,有可能安装失败。

  • 注意 sealos 与 kubernetes 的版本有对应关系,目前 Sealos >=v5.0.0 对应的 K8s >=1.28,具体可以从sealos官网查询

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
# 国内可以在镜像前面加上 registry.cn-shanghai.aliyuncs.com/
# sealos 推荐的网络接口是 cilium
$ sealos run labring/kubernetes:v1.29.9 labring/helm:v3.9.4 labring/cilium:v1.13.4 \
--masters 10.211.55.12 \
--nodes 10.211.55.13,10.211.55.14 -p [your-ssh-passwd]

## 参数说明
# -masters: 指定 master 节点的 IP 地址,多个节点之间用逗号隔开,但必须是奇数
# -nodes: 指定 worker 节点的 IP 地址,多个节点之间用逗号隔开。
# -p, --passwd: 指定 SSH 登录密码

## 安装成功会显示如下内容
ℹ️ Using Cilium version 1.13.4
🔮 Auto-detected cluster name: kubernetes
🔮 Auto-detected datapath mode: tunnel
🔮 Auto-detected kube-proxy has been installed
2025-07-01T16:59:27 info succeeded in creating a new cluster, enjoy it!
2025-07-01T16:59:27 info
___ ___ ___ ___ ___ ___
/\ \ /\ \ /\ \ /\__\ /\ \ /\ \
/::\ \ /::\ \ /::\ \ /:/ / /::\ \ /::\ \
/:/\ \ \ /:/\:\ \ /:/\:\ \ /:/ / /:/\:\ \ /:/\ \ \
_\:\~\ \ \ /::\~\:\ \ /::\~\:\ \ /:/ / /:/ \:\ \ _\:\~\ \ \
/\ \:\ \ \__\ /:/\:\ \:\__\ /:/\:\ \:\__\ /:/__/ /:/__/ \:\__\ /\ \:\ \ \__\
\:\ \:\ \/__/ \:\~\:\ \/__/ \/__\:\/:/ / \:\ \ \:\ \ /:/ / \:\ \:\ \/__/
\:\ \:\__\ \:\ \:\__\ \::/ / \:\ \ \:\ /:/ / \:\ \:\__\
\:\/:/ / \:\ \/__/ /:/ / \:\ \ \:\/:/ / \:\/:/ /
\::/ / \:\__\ /:/ / \:\__\ \::/ / \::/ /
\/__/ \/__/ \/__/ \/__/ \/__/ \/__/

Website: https://www.sealos.io/
Address: github.com/labring/sealos
Version: 5.0.1-2b74a1281
  • 启用 shell 自动补全功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1.安装 bash-completion
# 1.1 检查bash-completion是否已安装,有输出说明已经安装
$ type _init_completion
# 1.2 安装bash-completion,安装后会创建文件 /usr/share/bash-completion/bash_completion
$ dnf install bash-completion

# 2.安装 kubectl 的自动补全功能
# 2.1 当前用户
echo 'source <(kubectl completion bash)' >> ~/.bashrc
# 2.2 所有用户
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl

# 3 如果 kubectl 有关联的别名,你可以扩展 Shell 补全来适配此别名
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc

# 4.刷新配置文件
source ~/.bashrc
  • 创建集群成功后,查看集群状态

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
# 查看版本
$ kubectl version
Client Version: v1.29.9
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.29.9

# 查看节点
$ kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-m1 Ready control-plane 3m11s v1.29.9 10.211.55.12 <none> Rocky Linux 8.10 (Green Obsidian) 4.18.0-553.el8_10.x86_64 containerd://1.7.27
k8s-w1 Ready <none> 2m52s v1.29.9 10.211.55.13 <none> Rocky Linux 8.10 (Green Obsidian) 4.18.0-553.el8_10.x86_64 containerd://1.7.27
k8s-w2 Ready <none> 2m55s v1.29.9 10.211.55.14 <none> Rocky Linux 8.10 (Green Obsidian) 4.18.0-553.el8_10.x86_64 containerd://1.7.27

# 查看资源
$ kubectl get all -A -owide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system pod/cilium-bbbdl 1/1 Running 0 3m47s 10.211.55.13 k8s-w1 <none> <none>
kube-system pod/cilium-cz47k 1/1 Running 0 3m47s 10.211.55.14 k8s-w2 <none> <none>
kube-system pod/cilium-operator-6946ccbcc5-cxnn4 1/1 Running 0 3m47s 10.211.55.13 k8s-w1 <none> <none>
kube-system pod/cilium-vfc22 1/1 Running 0 3m47s 10.211.55.12 k8s-m1 <none> <none>
kube-system pod/coredns-76f75df574-2ln5x 1/1 Running 0 3m54s 10.0.0.74 k8s-w1 <none> <none>
kube-system pod/coredns-76f75df574-plsds 1/1 Running 0 3m54s 10.0.0.146 k8s-w1 <none> <none>
kube-system pod/etcd-k8s-m1 1/1 Running 0 4m6s 10.211.55.12 k8s-m1 <none> <none>
kube-system pod/kube-apiserver-k8s-m1 1/1 Running 0 4m6s 10.211.55.12 k8s-m1 <none> <none>
kube-system pod/kube-controller-manager-k8s-m1 1/1 Running 0 4m6s 10.211.55.12 k8s-m1 <none> <none>
kube-system pod/kube-proxy-4xbzt 1/1 Running 0 3m51s 10.211.55.13 k8s-w1 <none> <none>
kube-system pod/kube-proxy-rjs8h 1/1 Running 0 3m54s 10.211.55.14 k8s-w2 <none> <none>
kube-system pod/kube-proxy-xv4fg 1/1 Running 0 3m55s 10.211.55.12 k8s-m1 <none> <none>
kube-system pod/kube-scheduler-k8s-m1 1/1 Running 0 4m6s 10.211.55.12 k8s-m1 <none> <none>
kube-system pod/kube-sealos-lvscare-k8s-w1 1/1 Running 0 3m31s 10.211.55.13 k8s-w1 <none> <none>
kube-system pod/kube-sealos-lvscare-k8s-w2 1/1 Running 0 3m34s 10.211.55.14 k8s-w2 <none> <none>

NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4m8s <none>
kube-system service/hubble-peer ClusterIP 10.96.1.9 <none> 443/TCP 3m47s k8s-app=cilium
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 4m7s k8s-app=kube-dns

NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
kube-system daemonset.apps/cilium 3 3 3 3 3 kubernetes.io/os=linux 3m47s cilium-agent quay.io/cilium/cilium:v1.13.4 k8s-app=cilium
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 4m7s kube-proxy registry.k8s.io/kube-proxy:v1.29.9 k8s-app=kube-proxy

NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
kube-system deployment.apps/cilium-operator 1/1 1 1 3m47s cilium-operator quay.io/cilium/operator:v1.13.4 io.cilium/app=operator,name=cilium-operator
kube-system deployment.apps/coredns 2/2 2 2 4m7s coredns registry.k8s.io/coredns/coredns:v1.11.1 k8s-app=kube-dns

NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
kube-system replicaset.apps/cilium-operator-6946ccbcc5 1 1 1 3m47s cilium-operator quay.io/cilium/operator:v1.13.4 io.cilium/app=operator,name=cilium-operator,pod-template-hash=6946ccbcc5
kube-system replicaset.apps/coredns-76f75df574 2 2 2 3m54s coredns registry.k8s.io/coredns/coredns:v1.11.1 k8s-app=kube-dns,pod-template-hash=76f75df574

测试:用K8S部署Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建deployment
kubectl create deployment nginx --image=nginx
# 创建service,--type指定为NodePort,其含义为将deployment的80端口映射到Node的随机端口
kubectl expose deployment nginx --type=NodePort --port=80

# 查看pod和service,不加 -n 参数,默认查看的是default命名空间
$ k get pods,svc -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-7854ff8877-wgfxc 1/1 Running 0 19s 10.0.1.204 k8s-w2 <none> <none>

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 44m <none>
service/nginx NodePort 10.96.2.54 <none> 80:31044/TCP 5s app=nginx

# 浏览器访问任意nodeIP:31044

# 删除测试资源
## 删除deployment
kubectl delete deployment nginx
## 删除service
kubectl delete service nginx

sealos 命令

  • sealos 命令概览

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
Cluster Management Commands:
apply 使用 Clusterfile 在 Kubernetes 集群中运行云镜像
cert 更新 Kubernetes API Server 的证书
run 轻松运行云原生应用,可用于已有或新建集群
reset 重置集群中的所有内容
status 查看 sealos 的状态

Node Management Commands:
add 向集群中添加节点
delete 从集群中移除节点

Remote Operation Commands:
exec 在指定节点上执行 shell 命令或脚本
scp 将文件复制到指定节点的远程主机上

Experimental Commands:
registry 与镜像仓库相关的实验性功能

Container and Image Commands:
build 根据 Containerfile 或 Kubefile 构建镜像
create 创建集群但不执行命令,用于检查镜像
diff 查看对象文件系统的更改
inspect 检查容器或镜像的配置信息
images 列出本地存储中的镜像
load 从归档文件加载镜像
login 登录到容器镜像仓库
logout 登出容器镜像仓库
manifest 操作 manifest 列表和镜像索引
merge 合并多个镜像为一个
pull 从指定位置拉取镜像
push 将镜像推送到指定目标
rmi 从本地删除一个或多个镜像
save 将镜像保存为归档文件
tag 为本地镜像添加额外的名称标签

Other Commands:
completion 生成指定 shell 的自动补全脚本
docs 生成 API 参考文档
env 输出 sealos 使用的所有环境变量信息
gen 生成包含默认设置的 Clusterfile
version 打印版本信息

集群管理(master节点执行命令)

  • 创建集群

1
2
3
4
5
6
7
8
9
10
11
sealos run labring/kubernetes:v1.29.9 labring/helm:v3.9.4 labring/cilium:v1.13.4 \
--masters 10.211.55.12 \
--nodes 10.211.55.13,10.211.55.14 -p [your-ssh-passwd]

## 参数说明
-masters: 指定 master 节点的 IP 地址,多个节点之间用逗号隔开,但必须是奇数
-nodes: 指定 worker 节点的 IP 地址,多个节点之间用逗号隔开。
-p, --passwd: 指定 SSH 登录密码
-u, --user: 登录用户名,默认为 root
-i, --pk='/root/.ssh/id_rsa': 指定 SSH 密钥文件路径
--port: 指定 SSH 端口,默认为 22
  • Clusterfile 方式创建集群

1
2
3
4
5
6
7
# 生成集群配置文件,Clusterfile就是一个yaml文件,里面包含集群的配置信息
sealos gen labring/kubernetes:v1.29.9 labring/helm:v3.9.4 labring/cilium:v1.13.4 \
--masters 10.211.55.12 \
--nodes 10.211.55.13,10.211.55.14 -p [your-ssh-passwd] > Clusterfile

# 执行配置文件
sealos apply -f Clusterfile
  • 查看集群状态

1
sealos status
  • 清除K8s集群

1
sealos reset
  • 更新 Kubernetes API 服务器的证书

1
2
3
4
5
6
7
8
9
10
# sealos 创建的证书存放在 /etc/kubernetes/pki/ 下,默认证书有效期为 100 年
# 更新证书一般只会在添加新的访问ip或域名时才需要
sealos cert --alt-names apiserver.cluster.local,10.211.55.12,127.0.0.1,localhost
# 参数说明
# --alt-names: 添加新的访问ip或域名,多个逗号分隔
# -c, --cluster='default': 要执行 exec 操作的集群的名称。默认为 default。

# 更新证书后,你可以使用以下命令进行校验:
kubectl -n kube-system get cm kubeadm-config -o yaml
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text

在执行此操作之前,你最好先备份旧的证书。
执行 sealos cert 命令后,会更新集群 API 服务器的证书,你无需手动重启 API 服务器,sealos会自动帮你重启服务。

  • 查看环境变量

1
2
3
4
5
6
7
8
9
10
# -v 显示变量的说明
sealos env -v
## 说明
SEALOS_PROMPT=enabled # 是否启用终端中的交互提示功能。
SEALOS_RUNTIME_ROOT=/root/.sealos # Sealos 的运行时根目录,用于持久化运行相关的操作或配置。
SEALOS_DATA_ROOT=/var/lib/sealos # 集群在远程节点上的根目录路径,用于存储集群相关的数据。
BUILDAH_FORMAT=oci # 镜像构建时使用的格式,`oci` 表示符合 OCI 镜像规范。
BUILDAH_LOG_LEVEL= # buildah 模块中使用的日志级别,可以是 "trace", "debug", "info", "warn", "error", "fatal", 或 "panic"。
CONTAINERS_STORAGE_CONF= # 容器存储配置文件的路径,设置这个变量可以覆盖默认的配置位置。
SEALOS_SYNC_WORKDIR=true # 是否将运行时根目录(SEALOS_RUNTIME_ROOT)同步到所有 master 节点,作为备份用途。
  • 在集群中执行命令

1
2
3
4
5
6
7
# sealos exec "shell command or script"

# 在所有节点上执行命令
sealos exec "cat /etc/hosts"

# 在指定的节点上执行命令,--ips: 参数指定要执行的节点IP,多个节点之间用逗号分隔
sealos exec "cat /etc/hosts" --ips=10.211.55.13,10.211.55.14
  • 在集群间拷贝文件

1
2
3
4
5
6
# sealos scp "source file path" "destination file path"
# 在所有节点上执行命令
sealos scp ~/Clusterfile /tmp/Clusterfile

# 在指定的节点上执行命令,--ips: 参数指定要执行的节点IP,多个节点之间用逗号分隔
sealos scp ~/Clusterfile /tmp/Clusterfile --ips=10.211.55.13,10.211.55.14

节点管理(master节点执行命令)

  • 添加 master 节点

1
2
# 添加 master 节点后,总的 master 节点个数必须为奇数,否则会报错
sealos add --masters 10.211.55.18,10.211.55.19
  • 添加 worker 节点

1
2
# 添加 worker 节点,多个都会分隔
sealos add --nodes 10.211.55.20,10.211.55.21
  • 删除 master 节点

1
2
# 删除 master 节点后,剩余的 master 节点个数必须为奇数,否则会报错
sealos delete --masters 10.211.55.18,10.211.55.19
  • 删除 worker 节点

1
sealos delete --nodes 10.211.55.20,10.211.55.21

镜像管理

  • 查看所有镜像

1
2
3
4
5
$ sealos images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/labring/kubernetes v1.29.9 bca192f35556 2 months ago 669 MB
docker.io/labring/cilium v1.13.4 71aa52ad0a11 23 months ago 483 MB
docker.io/labring/helm v3.9.4 3376f6822067 2 years ago 46.4 MB
  • 删除镜像

1
2
# sealos rmi [image_id] | [image_name]
sealos rmi docker.io/labring/kubernetes:v1.29.9
  • 拉取镜像

1
sealos pull docker.io/labring/kubernetes:v1.29.9
  • 登录镜像仓库,建议登录仓库,这样可以提高拉取镜像的次数,避免拉取镜像失败

1
2
# docker.io 官方dockerhub镜像仓库
sealos login docker.io -u [username] -p [password]
  • 为镜像打tag

1
sealos tag docker.io/labring/kubernetes:v1.29.9 docker.io/hanqunfeng/kubernetes:v1.29.9
  • 推送镜像

1
sealos push docker.io/hanqunfeng/kubernetes:v1.29.9
  • 查看镜像详情

1
2
# sealos inspect [image_id] | [image_name]
sealos inspect docker.io/labring/kubernetes:v1.29.9
  • 登出镜像仓库

1
2
3
4
# 登出指定的仓库
sealos logout docker.io
# 登出所有仓库
sealos logout --all
  • 通过 Dockerfile 构建镜像

1
2
# 与 docker build 类似,构建好的镜像会增加前缀 localhost/
sealos build -t myapp:v1.0.0 -f Dockerfile .

容器管理

  • 查看所有容器

1
sealos ps
  • 查看容器详情

1
2
# sealos inspect [container_id] | [container_name]
sealos inspect bca192f35556