一个计算机技术爱好者与学习者

0%

好好学Sealos:Sealos入门篇

1. sealos简介

2018年8月,方海涛大佬提交了sealos的一个commit,最初的目标是把kubernetes安装做进一条命令。
如今,sealos 是以 kubernetes 为内核的云操作系统发行版。单机操作系统如同 linux 发行版本可以在上面安装和使用各种单机应用,如 PPT,Word,Excel 等。 云操作系统只需要把这些单机应用替换成各种云应用,如数据库,对象存储,消息队列等,就很容易理解了,这些应用都是分布式高可用的。 sealos 就是能支撑运行各种分布式应用的云操作系统。有了 sealos 就拥有了一朵云。

参考文档:

2. sealos原理简介

2.1. 高可用

通过内核 ipvs 对 apiserver 进行负载均衡,并且带 apiserver 健康检测。

2.2. 定制kubeadm

首先是由于 kubeadm 把证书过期时间写死了,所以需要定制把它改成 99 年,虽然大部分人可以自己去签个新证书,但是我们还是不想再依赖个别的工具,就直接改源码了。

其次就是做本地负载时修改 kubeadm 代码是最方便的,因为在 join 时我们需要做两个事,第一是 join 之前先创建好 ipvs 规则,第二是创建 static pod。如果这块不去定制 kubeadm 就把报静态 pod 目录已存在的错误,忽略这个错误很不优雅。 而且 kubeadm 中已经提供了一些很好用的 sdk 供我们去实现这个功能。

且这样做之后最核心的功能都集成到 kubeadm 中了,sealos 就单单变成分发和执行上层命令的轻量级工具了,增加节点时我们也就可以直接用 kubeadm 了。

2.3. k8s安装流程

1、通过 sftp或者 wget 把离线安装包拷贝到目标机器上(masters 和 nodes)。
2、在 master0 上执行 kubeadm init。
3、在其它 master 上执行 kubeadm join 并设置控制面,这个过程会在其它 master 上起动 etcd 并与 master0 的 etcd 组成集群,并启动控制平面的组件(apiserver、controller 等)。
4、join node 节点,会在 node 上配置 ipvs 规则,配置 /etc/hosts 等。

3. 安装使用sealos

3.1. 安装sealos

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

3.2. 安装k8s集群

参考文档:Run: Execute Cluster Images

1、安装k8s集群

1
2
3
4
5
mkdir -p /data/k8s/docker
sealos run labring/kubernetes-docker:v1.24.8 labring/helm:v3.8.2 labring/calico:v3.24.1 \
--env criData=/data/k8s/docker \
--masters 192.168.56.100 \
--nodes 192.168.56.101 -p voidking

注意:
(1)不要安装labring/kubernetes:v1.24.8,这种版本默认使用的CRI是containerd,而不是docker。
否则,安装软件时pod调度完成后可能会报错:
Error: failed to create containerd container: error unpacking image: failed to extract layer sha256:xxx: failed to get reader from content store: content digest sha256:xxx: not found

(2)calico和kubernetes版本要对应,否则calico可能无法正常启动。
对应关系参考文档Kubernetes requirementsCalico3.23 - Kubernetes requirements等。

更多k8s版本,请访问hub.sealos.cn获取。

2、查看安装

1
2
3
4
docker ps
kubectl get nodes
kubectl get all -n kube-system
kubectl get all -n calico-system

安装速度太快了,真的是一键安装!!!不用做各种初始化,这一点吊打kubeadm(sealos底层也是使用的kubeadm)。
另外,sealos安装的k8s集群,证书是100年,不用考虑证书续期问题,也是省了很多事情。

3、去掉master节点污点(可选)

1
2
kubectl taint nodes 192.168.56.100 node-role.kubernetes.io/master:NoSchedule-
kubectl taint nodes 192.168.56.100 node-role.kubernetes.io/control-plane:NoSchedule-

3.3. 安装失败处理办法

如果安装失败,再次安装时可能会报错:

1
error Applied to cluster error: failed to init runtime, cluster image kubernetes version cannot be empty

这时需要先重置一下sealos,然后重新安装。

1
2
sealos reset
rm /root/.sealos -rf

3.4. 添加节点

1
2
3
sealos add --nodes 192.168.56.200
sealos add --masters 192.168.56.101 --nodes 192.168.56.200
sealos add --masters 192.168.56.101-192.168.56.102 --nodes 192.168.56.200-192.168.56.203

3.5. 删除节点

1
2
sealos delete --nodes 192.168.56.202,192.168.56.203 
sealos delete --masters 192.168.56.101,192.168.56.102

3.6. 自定义安装k8s集群

参考文档:

1、生成集群配置

1
2
3
4
5
mkdir -p /data/k8s/docker
sealos gen labring/kubernetes-docker:v1.24.8 labring/helm:v3.8.2 labring/calico:v3.24.1 \
--env criData=/data/k8s/docker \
--masters 192.168.56.100 \
--nodes 192.168.56.101 -p voidking > Clusterfile

2、修改POD和SVC的CIDR
搜索kubeadm.k8s.io,Networking部分修改为:

1
2
3
4
5
6
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
Networking:
PodSubnet: 172.16.0.0/16
ServiceSubnet: 172.17.0.0/16

3、安装k8s集群

1
sealos apply -f Clusterfile

集群运行成功后会把 Clusterfile 保存到 .sealos/default/Clusterfile 文件中,可以修改其中字段来重新 apply 对集群进行变更。

4. sealos问题记录

4.1. docker版本coredns启动失败

系统环境:sealos4.1.3,系统CentOS7,内核Linux 3.10.0-957.el7.x86_64

labring/kubernetes:v1.22.3版本,可以正常安装运行。

labring/kubernetes-docker:v1.22.3版本,coredns pod无法启动,一直处于Blocked状态。切换ubuntu18系统,也存在同样的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Status:         Pending
Reason: NoNewPrivs
Message: Cannot enforce NoNewPrivs: illegal version string "v1alpha2"
Containers:
coredns:
Container ID:
Image: k8s.gcr.io/coredns:1.7.0
Image ID:
Ports: 53/UDP, 53/TCP, 9153/TCP
Host Ports: 0/UDP, 0/TCP, 0/TCP
Args:
-conf
/etc/coredns/Corefile
State: Waiting
Reason: Blocked
Ready: False

no_new_privs相关概念参考文档Linux Capabilities 入门教程:基础实战篇

经过多次尝试,发现labring/kubernetes-docker:v1.24.8版本可以安装成功,再低的版本都会有这个问题。

请教方海涛大佬得知,sealos4.1.4 之后修复了这个问题,实际验证确实可以。

一个验证可行的K8S和Calico匹配版本为:labring/kubernetes-docker:v1.20.14labring/calico:v3.22.1

4.2. 一键安装软件

参考文档sealos - Kubernetes 生命周期管理

一键安装软件:

1
2
sealos run labring/minio-operator:v4.4.16 labring/ingress-nginx:4.1.0 \
labring/mysql-operator:8.0.23-14.1 labring/redis-operator:3.1.4

安装时卡住了,报错:
Error: INSTALLATION FAILED: failed pre-install: timed out waiting for the condition
2023-01-06T16:22:50 error Applied to cluster error: exit status 1

再次安装,没有报错,但是软件并没有安装成功。

1
kubectl describe  pod/ingress-nginx-admission-create-xsnmg -n ingress-nginx

Pod处于Blocked状态。
这个问题,和上面的coredns问题本质是相同的问题,只不过表现形式不同。

4.3. 自定义软件配置?

一键安装软件很方便,但是,怎样对这些软件进行自定义配置?
答:逐个软件安装,使用--cmd自定义安装命令和配置。

4.4. 卸载软件?

怎样卸载软件?
答:sealos不考虑软件卸载,如果有需要卸载,直接执行helm uninstall即可。

4.5. 怎样指定Calico使用的网卡?

在使用Calico作为Kubernetes集群的CNI(容器网络接口)时,节点上可能具有多个网络接口和IP地址。Calico需要为每个节点选择一个IP地址以便于在集群内的节点之间建立隧道(如使用IPIP或VXLAN隧道技术)以及通信。
如果没有做任何配置,Calico将自动选择节点的默认路由出口的IP地址。这是最常用的网口IP地址。但是,这可能会导致calico建立tun时使用的是不同的网段,最终导致节点间通信产生问题。

因此,为保证稳定性,最好是能够指定Calico使用的网卡。
在使用sealos已经安装好的K8s集群中,Calico本质上是通过helm的方式安装的,chart路径为:/var/lib/sealos/data/default/rootfs/charts/calico
指定Calico使用的网卡,方法为修改Calico配置,然后更新Calico:
1、修改Calico配置

1
2
cd /var/lib/sealos/data/default/rootfs/charts/calico
vim values.yaml

修改 installation.calicoNetwork 部分的配置:

1
2
3
4
5
6
7
installation:
enabled: true
kubernetesProvider: ""
calicoNetwork:
nodeAddressAutodetectionV4:
#interface: eth.*|en.*
interface: ens5f2|ens9f2

2、更新Calico

1
helm upgrade calico . -n tigera-operator

3、确认效果

1
route -n

检查 tunl0 的网关IP是否符合预期。

5. sealos和sealer是什么关系?

参考文档:《sealer入门篇》