摘要
安装前设置(所有节点)
每个集群节点应该有不同的主机名,主机名不要带下划线
1 2 3 4 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 sudo dnf install chrony -ysudo systemctl enable --now chronydsudo chronyc makestepdate
安装 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
1 2 echo 'source <(sealos completion bash)' >> ~/.bashrcsource ~/.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 $ 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] ℹ️ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ type _init_completion $ dnf install bash-completion echo 'source <(kubectl completion bash)' >> ~/.bashrckubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null sudo chmod a+r /etc/bash_completion.d/kubectlecho 'alias k=kubectl' >>~/.bashrcecho 'complete -o default -F __start_kubectl k' >>~/.bashrcsource ~/.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 kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --type =NodePort --port=80 $ 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 kubectl delete deployment nginx kubectl delete service nginx
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
1 2 3 4 5 6 7 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 2 3 4 5 6 7 8 9 10 sealos cert --alt-names apiserver.cluster.local,10.211.55.12,127.0.0.1,localhost 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 sealos env -v SEALOS_PROMPT=enabled SEALOS_RUNTIME_ROOT=/root/.sealos SEALOS_DATA_ROOT=/var/lib/sealos BUILDAH_FORMAT=oci BUILDAH_LOG_LEVEL= CONTAINERS_STORAGE_CONF= SEALOS_SYNC_WORKDIR=true
1 2 3 4 5 6 7 sealos exec "cat /etc/hosts" sealos exec "cat /etc/hosts" --ips=10.211.55.13,10.211.55.14
1 2 3 4 5 6 sealos scp ~/Clusterfile /tmp/Clusterfile sealos scp ~/Clusterfile /tmp/Clusterfile --ips=10.211.55.13,10.211.55.14
节点管理(master节点执行命令)
1 2 sealos add --masters 10.211.55.18,10.211.55.19
1 2 sealos add --nodes 10.211.55.20,10.211.55.21
1 2 sealos delete --masters 10.211.55.18,10.211.55.19
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 docker.io/labring/kubernetes:v1.29.9
1 sealos pull docker.io/labring/kubernetes:v1.29.9
1 2 sealos login docker.io -u [username] -p [password]
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 docker.io/labring/kubernetes:v1.29.9
1 2 3 4 sealos logout docker.io sealos logout --all
1 2 sealos build -t myapp:v1.0.0 -f Dockerfile .
容器管理
1 2 sealos inspect bca192f35556