Sealos 是一个快速构建高可用 k8s 集群的命令行工具,该工具部署时会在第一个 k8s master 节点部署 registry 服务(sealos.hub),该域名通过 hosts 解析到第一个 k8s master 节点 ip;基于内核 ipvs 对 apiserver 进行负载均衡,其默认虚拟 ip 地址为 10.103.97.2(apiserver.cluster.local),所有 k8s Worker 节点通过该虚拟 ip 访问 kube-apiserver

建议通过 PC 端访问本文章,以获取更好阅读体验,由于精力有限,该文章的后续更新、完善仅限于站点 运维技术帮 (https://ywjsbang.com) 望理解 !!

环境配置

# 各组件版本
CenOS7.9 Min(Kernel 5.4.220)
Sealos:v4.1.3
flannel:v0.20.0
kubernetes:v1.25.3
kubernetes-dashboard:v2.7.0 # 设置各节点主机名与 IP 地址映射关系
cat >> /etc/hosts << EOF
192.168.31.51 t1
192.168.31.52 t2
192.168.31.53 t3
192.168.31.54 t4
192.168.31.55 t5
EOF # 安装依赖
yum install socat conntrack-tools -y

flanneld 默认容器

flanneld 默认配置清单 kube-flannel.yml 中的容器配置,简要说明如下

initContainers:
docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0 # 通过卷挂载方式,将 CNI 插件 /opt/cni/bin/flannel 挂载到宿主机对应位置
docker.io/rancher/mirrored-flannelcni-flannel:v0.20.0 # 通过卷挂载方式,将配置目录 /etc/cni/net.d 和 /etc/kube-flannel/ 挂载到宿主机对应位置
containers
docker.io/rancher/mirrored-flannelcni-flannel:v0.20.0 # flanneld 守护进程

自定义 kube-flannel.yml

修改 pod 网段

修改 kube-flannel.yml 配置,其默认 pod 网段为 10.244.0.0/16,可按需修改

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml -C ./manifests/

kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-flannel
labels:
tier: node
app: flannel
data:
...
...
net-conf.json: |
{
"Network": "10.15.0.0/16", # pod 网段, 该网段必须与 kube-controller-manager 配置参数 --cluster-cidr 值匹配
"Backend": {
"Type": "vxlan"
}
}

添加 init 容器

修改 kube-flannel.yml 添加 Init 容器 install-cni-plugin-sealos,其作用是通过卷挂载,将宿主机目录 /opt/cni/bin 挂载到容器目录 /opt/cni/bin

initContainers:
- name: install-cni-plugin-sealos
image: docker.io/labring/docker-cni-plugins:v1.1.0
command: ["/bin/sh"]
args: ["-c", "cp -f /cni-plugins/* /opt/cni/bin/"]
volumeMounts:
- name: cni-plugin-sealos
mountPath: /opt/cni/bin
# 定义卷 cni-plugin-sealos
volumes:
- name: cni-plugin-sealos
hostPath:
path: /opt/cni/bin

部署 Sealos

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

创建 Dockerfile

1、创建镜像构建配置文件,目录 registry 构建时会自动生成,用于存放构建该镜像时依赖的其它镜像信息 !!

cat > Dockerfile << EOF
FROM scratch
COPY manifests ./manifests
COPY registry ./registry
CMD ["kubectl apply -f manifests/kube-flannel.yml"]
EOF

2、使用 sealos 打包构建镜像

# 执行自定义镜像构建
sealos build -f Dockerfile -t it123.me/flannel:v0.20.0 .
# 查看本地镜像
sealos images
# > REPOSITORY TAG IMAGE ID CREATED SIZE
# > it123.me/flannel v0.20.0 6f0563e3df50 19 minutes ago 72.9 MB
# > docker.io/labring/kubernetes v1.25.3 6f1de58f84c4 8 days ago 589 MB
# > docker.io/labring/calico v3.24.1 e2122fc58fd3 8 weeks ago 354 MB
# > docker.io/labring/helm v3.8.2 1123e8b4b455 3 months ago 45.1 MB
# > docker.io/labring/calico v3.22.1 29516dc98b4b 4 months ago 546 MB

生成 Clusterfile

1、生成集群配置文件

sealos gen labring/kubernetes:v1.25.3 it123.me/flannel:v0.20.0 --masters 192.168.31.51 --nodes 192.168.31.54 -p rootroot > Clusterfile
# 参数解析
--masters # 集群 master 节点,可逗号分隔指定多个
--nodes # 集群 worker 节点,可逗号分隔指定多个
-p rootroot # 部署时的 ssh 密码,默认 ssh 用户 root,可通过 -u 参数修改
# 创建集群时需要的镜像
it123.me/flannel:v0.20.0
labring/kubernetes:v1.25.3

2、配置文件 Clusterfile 内容如下

apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
creationTimestamp: null
name: default
spec:
hosts:
- ips:
- 192.168.31.51:22
roles:
- master
- amd64
- ips:
- 192.168.31.54:22
roles:
- node
- amd64
image:
- labring/kubernetes:v1.25.3
- it123.me/flannel:v0.20.0
ssh:
passwd: rootroot
pk: /root/.ssh/id_rsa
port: 22
status: {}

3、向 Clusterfile 文件尾行添加如下内容,以自定义集群的 pod 和 service 网段,将会分别用于设置组件 kube-controller-manager 启动参数 --cluster-cidr 和 --service-cluster-ip-range 的值

---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
podSubnet: 10.15.0.0/16 # 该值必须与 flanneld 配置清单 kube-flannel.yaml 中的配置一致,
serviceSubnet: 10.16.0.0/16

创建集群

1、基于如上配置创建集群

# 创建集群, 并验证节点状态
sealos apply -f Clusterfile
kubectl get node -o wide
# > NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
# > t1 Ready control-plane 41m v1.25.3 192.168.31.51 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t4 Ready <none> 41m v1.25.3 192.168.31.54 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2

2、在需要执行集群管理的节点添加 kubeconfig 配置

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

集群维护

添加 Work 节点

1、添加工作节点 192.168.31.55

sealos add --nodes 192.168.31.55        # 执行 sealos delete --nodes 192.168.31.50 删除节点
kubectl get node -o wide
# > NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
# > t1 Ready control-plane 41m v1.25.3 192.168.31.51 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t4 Ready <none> 41m v1.25.3 192.168.31.54 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t5 Ready <none> 38s v1.25.3 192.168.31.55 <none> CentOS Linux 7 (Core) 5.4.221-1.el7.elrepo.x86_64 containerd://1.6.2

2、验证 pod 、service 网段

kubectl get pod,svc -o wide -A
# > NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
# > kube-system pod/coredns-565d847f94-4lr8z 1/1 Running 0 44m 10.15.0.5 t8 <none> <none>
# > kube-system pod/coredns-565d847f94-65v47 1/1 Running 0 44m 10.15.0.4 t8 <none> <none> # > NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
# > default service/kubernetes ClusterIP 10.16.0.1 <none> 443/TCP 44m <none>
# > kube-system service/kube-dns ClusterIP 10.16.0.10 <none> 53/UDP,53/TCP,9153/TCP 44m k8s-app=kube-dns

添加 Master 节点

1、添加控制器节点 192.168.31.52 和 192.168.31.53

sealos add --masters 192.168.31.52,192.168.31.53

执行该操作时,sealos 会自动在对应 master 节点添加 etcd 服务,但是集群 kube-apiserver 配置项 --etcd-servers 并未更新,因此、还需到各 master 节点更新配置文件 /etc/kubernetes/manifests/kube-apiserver.yaml,设置配置项--etcd-servers=https://192.168.31.51:2379,https://192.168.31.52:2379,https://192.168.31.53:2379 实现 etcd 服务的高可用

备注: 该配置项修改后会自动生效,因为 k8s 会自动监视这些配置文件,当被修改时,k8s 会自动重建对应节点 kube-apiserver 的 pod 实例

2、验证节点

kubectl get node -o wide
# > NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
# > t1 Ready control-plane 54m v1.25.3 192.168.31.51 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t2 Ready control-plane 2m v1.25.3 192.168.31.52 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t3 Ready control-plane 2m v1.25.3 192.168.31.53 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t4 Ready <none> 54m v1.25.3 192.168.31.54 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2
# > t5 Ready <none> 13m v1.25.3 192.168.31.55 <none> CentOS Linux 7 (Core) 5.4.220-1.el7.elrepo.x86_64 containerd://1.6.2

部署 dashboard

sealos run --cluster demo01 labring/kubernetes-dashboard:v2.7.0

清理集群

sealos reset

Q&A

1、error execution phase control-plane-prepare/certs: error creating PKI assets: failed to write or validate certificate "apiserver": certificate apiserver is invalid: x509: certificate is valid for 192.168.31.53, 10.96.0.1, 10.103.97.2, 127.0.0.1, 192.168.31.51, 192.168.31.52, not 10.16.0.1 (生成的 apiserver.cert 证书不包含 10.16.0.1)

使用 sealos apply -f Clusterfile 创建集群时,并未将 Clusterfile 中 kubeadm 的自定义集群配置 ClusterConfiguration 添加至 .sealos/demo01/Clusterfile 文件,因此当使用如下命令添加 master 节点时报错提示,生成的 apiserver.cert 证书中不包含自定义的 service 网段 ip

# 使用默认配置文件 .sealos/demo01/Clusterfile
sealos add --cluster demo01 --masters 192.168.31.52,192.168.31.53

解决方案:在文件 .sealos/demo01/Clusterfile 尾行添加如下配置, 再执行 master 节点添加命令:

---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
podSubnet: 10.15.0.0/16
serviceSubnet: 10.16.0.0/16

2、若执行 sealos apply -f Clusterfile 操作时,提示 no change apps | nodes, 则需要用 Clusterfile 覆盖 /root/.sealos/default/Clusterfile 文件

cp Clusterfile /root/.sealos/default/Clusterfile 或删除 /root/.sealos/default/Clusterfile 状态部分 status:{} 或 sealos reset

3、socat not found in system path !!

集群所有节点安装 yum install socat -y

4、ERROR [2022-11-02 20:11:43] >> Port: 10249 occupied. Please turn off port service.

本次安装受到环境残留干扰,需清理节点环境

5、error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "fk63j7"

新建 default 集群时,执行 sealos reset --cluster default 清除之前创建的集群证书及其它信息

重 要 提 醒: 由于笔者时间、视野、认知有限,本文难免出现错误、疏漏等问题,期待各位读者朋友、业界大佬指正交流, 共同进步 !!

基于 Sealos 的镜像构建能力,快速部署自定义 k8s 集群的更多相关文章

  1. 用Docker swarm快速部署Nebula Graph集群

    用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...

  2. 使用kind快速搭建本地k8s集群

    Kind是什么? k8s集群的组成比较复杂,如果纯手工部署的话易出错且时间成本高.而本文介绍的Kind工具,能够快速的建立起可用的k8s集群,降低初学者的学习门槛. Kind是Kubernetes I ...

  3. 5.基于二进制部署kubernetes(k8s)集群

    1 kubernetes组件 1.1 Kubernetes 集群图 官网集群架构图 1.2 组件及功能 1.2.1 控制组件(Control Plane Components) 控制组件对集群做出全局 ...

  4. docker swarm快速部署redis分布式集群

    环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...

  5. Centos7 安装部署Kubernetes(k8s)集群

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4. ...

  6. China Azure中部署Kubernetes(K8S)集群

    目前China Azure还不支持容器服务(ACS),使用名称"az acs create --orchestrator-type Kubernetes -g zymtest -n kube ...

  7. Harbor快速部署到Kubernetes集群及登录问题解决

    Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...

  8. 快速部署一个Kubernetes集群

    官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...

  9. 第3章:快速部署一个Kubernetes集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点$ kubeadm in ...

  10. 使用docker快速部署一个consul集群

    作为一个开发者,有时候需要一个集群环境,之前的做法要么就是使用多个虚拟机,要么就是采用不同的端口来模拟,但是虚拟机比较占内存,而且启动慢,采用不同的端口来模拟,管理起来比较麻烦一些,程序隔离性差一些. ...

随机推荐

  1. Mysql之基础知识笔记

    Mysql数据库基础知识个人笔记 连接本地数据库: mysql -h localhost -u root -p 回车输入数据库密码 数据库的基础操作: 查看当前所有的数据库:show database ...

  2. 表单动态增加div元素提交方法

    实现的效果如下: 1 var detail_div = 1; 2 var i=0; 3 function add_div() { 4 var e = document.getElementById(& ...

  3. KingbaseES R6集群归档备份故障分析解决案例

    案例说明: 在使用ps工具查看主库进程,发现主库'archiver'进程失败,检查sys_log日志可以发现归档失败的信息.通过sys_log日志提取归档语句手工执行归档操作,提示"当前数据 ...

  4. windows清理必看

    清理缓存 代码如下 介绍此文件夹都是缓存文件全选删除即可 ctrl+A全选shift+del强制删除(不会添加到回收站) %temp% 找到C盘右击属性选择想要删除的文件进行清理即可 清理完点击清理系 ...

  5. 使用Steamwork.Net 接入Steam一点心得

    1.  前言 这是我在开发过程中使用的一点总结,目前使用的东西包含基础登录功能,存档功能,成就系统,以及DLC安装功能.Steamwork不仅仅有这些功能还有游戏内交易,排行榜,数据传输等功能,这些功 ...

  6. maxHBLT的合并&初始化&时间复杂度分析

    1. 定义 [extened binary tree] 扩充二叉树是有 external node (用来代替空子树, 也就是 nullptr) 的 binary tree. 对应地, 其他 node ...

  7. 在终端启动Python时报错的解决

    最近,在终端启动Python时,报了一个错误: 1 Failed calling sys.__interactivehook__ 2 Traceback (most recent call last) ...

  8. 中国DevOps平台市场,华为云再次位居领导者位置

    摘要:华为云软件开发生产线DevCloud在市场份额和发展战略两大维度均排名第一,再次位居领导者位置. 9月21日 ,国际权威分析师机构IDC发布<IDC MarketScape: 中国 Dev ...

  9. 使用kubeoperator安装的k8s集群配置Ingress规则有关说明

    单独创建一个nginx 在 Deployment 里创建一个nginx工作负载,镜像用:nginx:alpine,并配置service为ClusterIP,然后添加Ingress规则 本地主机host ...

  10. 重要参考文档---MySQL 8.0.29 使用yum方式安装,开启navicat远程连接,搭建主从,读写分离(需要使用到ProxySQL,此文不讲述这个)

    yum方式安装 echo "删除系统默认或之前可能安装的其他版本的 mysql" for i in $(rpm -qa|grep mysql);do rpm -e $i --nod ...