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
复制代码 生成 Clusterfile
1、生成集群配置文件- 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 守护进程
复制代码 2、配置文件 Clusterfile 内容如下- 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"
- }
- }
复制代码 3、向 Clusterfile 文件尾行添加如下内容,以自定义集群的 pod 和 service 网段,将会分别用于设置组件 kube-controller-manager 启动参数 --cluster-cidr 和 --service-cluster-ip-range 的值- 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
复制代码 创建集群
1、基于如上配置创建集群- 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
复制代码 2、在需要执行集群管理的节点添加 kubeconfig 配置- cat > Dockerfile << EOF
- FROM scratch
- COPY manifests ./manifests
- COPY registry ./registry
- CMD ["kubectl apply -f manifests/kube-flannel.yml"]
- EOF
复制代码 集群维护
添加 Work 节点
1、添加工作节点 192.168.31.55- # 执行自定义镜像构建
- 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
复制代码 2、验证 pod 、service 网段- 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
复制代码 添加 Master 节点
1、添加控制器节点 192.168.31.52 和 192.168.31.53- 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: {}
复制代码 执行该操作时,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、验证节点- ---
- apiVersion: kubeadm.k8s.io/v1beta2
- kind: ClusterConfiguration
- networking:
- podSubnet: 10.15.0.0/16 # 该值必须与 flanneld 配置清单 kube-flannel.yaml 中的配置一致,
- serviceSubnet: 10.16.0.0/16
复制代码 部署 dashboard
- # 创建集群, 并验证节点状态
- 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
复制代码 清理集群
- mkdir -p $HOME/.kube
- cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- chown $(id -u):$(id -g) $HOME/.kube/config
复制代码 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 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
复制代码 解决方案:在文件 .sealos/demo01/Clusterfile 尾行添加如下配置, 再执行 master 节点添加命令:- 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
复制代码 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:{} 或 mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
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 集群时,执行 mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config --cluster default 清除之前创建的集群证书及其它信息
重 要 提 醒: 由于笔者时间、视野、认知有限,本文难免出现错误、疏漏等问题,期待各位读者朋友、业界大佬指正交流, 共同进步 !!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |