基于 Sealos 的镜像构建能力,快速部署自定义 k8s 集群
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 集群的更多相关文章
- 用Docker swarm快速部署Nebula Graph集群
用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...
- 使用kind快速搭建本地k8s集群
Kind是什么? k8s集群的组成比较复杂,如果纯手工部署的话易出错且时间成本高.而本文介绍的Kind工具,能够快速的建立起可用的k8s集群,降低初学者的学习门槛. Kind是Kubernetes I ...
- 5.基于二进制部署kubernetes(k8s)集群
1 kubernetes组件 1.1 Kubernetes 集群图 官网集群架构图 1.2 组件及功能 1.2.1 控制组件(Control Plane Components) 控制组件对集群做出全局 ...
- docker swarm快速部署redis分布式集群
环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...
- Centos7 安装部署Kubernetes(k8s)集群
目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4. ...
- China Azure中部署Kubernetes(K8S)集群
目前China Azure还不支持容器服务(ACS),使用名称"az acs create --orchestrator-type Kubernetes -g zymtest -n kube ...
- Harbor快速部署到Kubernetes集群及登录问题解决
Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...
- 快速部署一个Kubernetes集群
官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...
- 第3章:快速部署一个Kubernetes集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点$ kubeadm in ...
- 使用docker快速部署一个consul集群
作为一个开发者,有时候需要一个集群环境,之前的做法要么就是使用多个虚拟机,要么就是采用不同的端口来模拟,但是虚拟机比较占内存,而且启动慢,采用不同的端口来模拟,管理起来比较麻烦一些,程序隔离性差一些. ...
随机推荐
- Mysql之基础知识笔记
Mysql数据库基础知识个人笔记 连接本地数据库: mysql -h localhost -u root -p 回车输入数据库密码 数据库的基础操作: 查看当前所有的数据库:show database ...
- 表单动态增加div元素提交方法
实现的效果如下: 1 var detail_div = 1; 2 var i=0; 3 function add_div() { 4 var e = document.getElementById(& ...
- KingbaseES R6集群归档备份故障分析解决案例
案例说明: 在使用ps工具查看主库进程,发现主库'archiver'进程失败,检查sys_log日志可以发现归档失败的信息.通过sys_log日志提取归档语句手工执行归档操作,提示"当前数据 ...
- windows清理必看
清理缓存 代码如下 介绍此文件夹都是缓存文件全选删除即可 ctrl+A全选shift+del强制删除(不会添加到回收站) %temp% 找到C盘右击属性选择想要删除的文件进行清理即可 清理完点击清理系 ...
- 使用Steamwork.Net 接入Steam一点心得
1. 前言 这是我在开发过程中使用的一点总结,目前使用的东西包含基础登录功能,存档功能,成就系统,以及DLC安装功能.Steamwork不仅仅有这些功能还有游戏内交易,排行榜,数据传输等功能,这些功 ...
- maxHBLT的合并&初始化&时间复杂度分析
1. 定义 [extened binary tree] 扩充二叉树是有 external node (用来代替空子树, 也就是 nullptr) 的 binary tree. 对应地, 其他 node ...
- 在终端启动Python时报错的解决
最近,在终端启动Python时,报了一个错误: 1 Failed calling sys.__interactivehook__ 2 Traceback (most recent call last) ...
- 中国DevOps平台市场,华为云再次位居领导者位置
摘要:华为云软件开发生产线DevCloud在市场份额和发展战略两大维度均排名第一,再次位居领导者位置. 9月21日 ,国际权威分析师机构IDC发布<IDC MarketScape: 中国 Dev ...
- 使用kubeoperator安装的k8s集群配置Ingress规则有关说明
单独创建一个nginx 在 Deployment 里创建一个nginx工作负载,镜像用:nginx:alpine,并配置service为ClusterIP,然后添加Ingress规则 本地主机host ...
- 重要参考文档---MySQL 8.0.29 使用yum方式安装,开启navicat远程连接,搭建主从,读写分离(需要使用到ProxySQL,此文不讲述这个)
yum方式安装 echo "删除系统默认或之前可能安装的其他版本的 mysql" for i in $(rpm -qa|grep mysql);do rpm -e $i --nod ...