KubeSphere 最佳实战:KubeKey 扩容 Kubernetes Worker 节点实战指南

KubeSphere 最佳实战:KubeKey 扩容 Kubernetes Worker 节点实战指南

2024 年云原生运维实战文档 99 篇原创计划 第 039 篇 |KubeSphere 最佳实战「2024」系列 第 011 篇

你好,欢迎来到运维有术

今天分享的内容是 KubeSphere 最佳实战「2024」 系列文档中的 KubeKey 扩容 Kubernetes Worker 节点实战指南

在今天的技术分享中,我们将探讨一个生产环境中不可或缺的环节--集群扩容。我将带领大家模拟一个真实的生产场景,展示如何运用 KubeSphere 打造的 KubeKey 工具,实现将新的 Worker 节点自动化地融入到现有 Kubernetes 集群的全过程。

尽管本文的操作示例是基于 openEuler 22.03 LTS SP3 操作系统,但是,这套扩容策略和步骤同样适用于通过 KubeKey 部署的,运行在 CentOS、Ubuntu 等主流操作系统之上的 Kubernetes 集群。

实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)

主机名 IP CPU 内存 系统盘 数据盘 用途
ksp-registry 192.168.9.90 4 8 40 200 Harbor 镜像仓库
ksp-control-1 192.168.9.91 4 8 40 100 KubeSphere/k8s-control-plane
ksp-control-2 192.168.9.92 4 8 40 100 KubeSphere/k8s-control-plane
ksp-control-3 192.168.9.93 4 8 40 100 KubeSphere/k8s-control-plane
ksp-worker-1 192.168.9.94 4 16 40 100 k8s-worker/CI
ksp-worker-2 192.168.9.95 4 16 40 100 k8s-worker
ksp-worker-3 192.168.9.96 4 16 40 100 k8s-worker
ksp-storage-1 192.168.9.97 4 8 40 400+ Containerd、OpenEBS、ElasticSearch/Longhorn/Ceph/NFS
ksp-storage-2 192.168.9.98 4 8 40 300+ Containerd、OpenEBS、ElasticSearch/Longhorn/Ceph
ksp-storage-3 192.168.9.99 4 8 40 300+ Containerd、OpenEBS、ElasticSearch/Longhorn/Ceph
ksp-gpu-worker-1 192.168.9.101 4 16 40 100 k8s-worker(GPU NVIDIA Tesla M40 24G)
ksp-gpu-worker-2 192.168.9.102 4 16 40 100 k8s-worker(GPU NVIDIA Tesla P100 16G)
ksp-gateway-1 192.168.9.103 2 4 40 自建应用服务代理网关/VIP:192.168.9.100
ksp-gateway-2 192.168.9.104 2 4 40 自建应用服务代理网关/VIP:192.168.9.100
ksp-mid 192.168.9.105 4 8 40 100 部署在 k8s 集群之外的服务节点(Gitlab 等)
合计 15 56 152 600 2100+

实战环境涉及软件版本信息

  • 操作系统:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • Containerd:1.7.13
  • NVIDIA GPU Operator:v24.3.0
  • NVIDIA 显卡驱动:550.54.15

1. 前置条件

1.1 准备需要扩容的 Worker 节点

后续实验,我们计划增加 Ceph、Longhorn 等服务作为集群持久化存储。

按规划增加以下 3个 节点,每个节点增加 3 块盘,作为 Containerd、Longhorn、Ceph 等服务的数据盘,ksp-storage-1 节点多加一块,用作 NFS 存储

节点名称 100G 磁盘 /dev/sdb 规划 100G 磁盘 /dev/sdc 规划 100G 磁盘 /dev/sdd 规划 100G 磁盘 /dev/sde 规划
ksp-storage-1 采用 LVM 类型, 格式化并挂载到 /data,提供给 Containerd、OpenEBS 、ElasticSearch、NFS 使用 采用 LVM 类型, 格式化并挂载到 /longhorn,提供给 Longhorn 使用 裸盘提供给 Ceph 使用 采用 LVM 类型, 格式化并挂载到 /datanfs,提供给 NFS 使用
ksp-storage-2 采用 LVM 类型, 格式化并挂载到 /data,提供给 Containerd、OpenEBS 、ElasticSearch 使用 采用 LVM 类型, 格式化并挂载到 /longhorn,提供给 Longhorn 使用 裸盘提供给 Ceph 使用
ksp-storage-3 采用 LVM 类型, 格式化并挂载到 /data,提供给 Containerd、OpenEBS 、ElasticSearch 使用 采用 LVM 类型, 格式化并挂载到 /longhorn,提供给 Longhorn 使用 裸盘提供给 Ceph 使用

1.2 操作系统初始化配置

请参考 Kubernetes 集群节点 openEuler 22.03 LTS SP3 系统初始化指南,完成操作系统初始化配置。

注意: 磁盘初始化时只需要配置 Containerd 对应的 /dev/sdb

初始化配置指南中没有涉及操作系统升级的任务,在能联网的环境初始化系统的时候一定要升级操作系统,然后重启节点。

2. 使用 KubeKey 扩容 Worker 节点

接下来我们使用 KubeKey 将新增加的节点加入到已有的 Kubernetes 集群,参考官方说明文档,整个过程比较简单,仅需两步。

  • 修改 KubeKey 部署集群时使用的配置文件
  • 执行增加节点的命令

2.1 修改集群配置文件

登录 Control-1 节点,切换到部署集群时使用的 KubeKey 程序目录,修改原有的集群配置文件,我们实战中使用的名字为 ksp-v341-v1288.yaml,请根据实际情况修改 。

主要修改点:

  • spec.hosts 部分:增加新的 worker 节点的信息。
  • spec.roleGroups.worker 部分:增加新的 worker 节点的信息

修改后的示例如下:

yaml 复制代码
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
  name: opsxlab
spec:
  hosts:
  ......(保持不变)
  - {name: ksp-storage-1, address: 192.168.9.97, internalAddress: 192.168.9.97, user: root, password: "OpsXlab@2024"}
  - {name: ksp-storage-2, address: 192.168.9.98, internalAddress: 192.168.9.98, user: root, password: "OpsXlab@2024"}
  - {name: ksp-storage-3, address: 192.168.9.99, internalAddress: 192.168.9.99, user: root, password: "OpsXlab@2024"}
  roleGroups:
    ......(保持不变)
    worker:
    ......(保持不变)
    - ksp-storage-1
    - ksp-storage-2
    - ksp-storage-3
    
# 下面的内容保持不变

2.2 使用 KubeKey 增加节点

在增加节点之前,我们再确认一下当前集群的节点信息。

arduino 复制代码
$ kubectl get nodes -o wide
NAME               STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                        CONTAINER-RUNTIME
ksp-control-1      Ready    control-plane   13d     v1.28.8   192.168.9.91    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-2      Ready    control-plane   13d     v1.28.8   192.168.9.92    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-3      Ready    control-plane   13d     v1.28.8   192.168.9.93    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-gpu-worker-1   Ready    worker          7d      v1.28.8   192.168.9.101   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-gpu-worker-2   Ready    worker          7d      v1.28.8   192.168.9.102   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-1       Ready    worker          13d     v1.28.8   192.168.9.94    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-2       Ready    worker          13d     v1.28.8   192.168.9.95    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-3       Ready    worker          13d     v1.28.8   192.168.9.96    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13

接下来我们执行下面的命令,使用修改后的配置文件将新增的 Worker 节点加入集群。

bash 复制代码
export KKZONE=cn
./kk add nodes -f ksp-v341-v1288.yaml

上面的命令执行后,KubeKey 先检查部署 Kubernetes 的依赖及其它配置是否符合要求。通过检查后,系统将提示您确认安装。输入 yes 并按 ENTER 继续部署。

扩容完成需要大约 2~5 分钟左右,具体时间看网速、机器配置、增加的节点数量。

扩容完成后,您应该会在终端上看到类似于下面的输出。

ini 复制代码
......
20:45:09 CST [ChownModule] Chown user $HOME/.kube dir
20:45:10 CST success: [ksp-gpu-worker-2]
20:45:10 CST success: [ksp-storage-2]
20:45:10 CST success: [ksp-storage-3]
20:45:10 CST success: [ksp-gpu-worker-1]
20:45:10 CST success: [ksp-storage-1]
20:45:10 CST success: [ksp-worker-3]
20:45:10 CST success: [ksp-worker-2]
20:45:10 CST success: [ksp-worker-1]
20:45:10 CST success: [ksp-control-2]
20:45:10 CST success: [ksp-control-3]
20:45:10 CST success: [ksp-control-1]
20:45:10 CST [AutoRenewCertsModule] Generate k8s certs renew script
20:45:11 CST success: [ksp-control-2]
20:45:11 CST success: [ksp-control-1]
20:45:11 CST success: [ksp-control-3]
20:45:11 CST [AutoRenewCertsModule] Generate k8s certs renew service
20:45:12 CST success: [ksp-control-3]
20:45:12 CST success: [ksp-control-2]
20:45:12 CST success: [ksp-control-1]
20:45:12 CST [AutoRenewCertsModule] Generate k8s certs renew timer
20:45:13 CST success: [ksp-control-2]
20:45:13 CST success: [ksp-control-1]
20:45:13 CST success: [ksp-control-3]
20:45:13 CST [AutoRenewCertsModule] Enable k8s certs renew service
20:45:14 CST success: [ksp-control-3]
20:45:14 CST success: [ksp-control-2]
20:45:14 CST success: [ksp-control-1]
20:45:14 CST Pipeline[AddNodesPipeline] execute successfully

3. 扩容后集群状态验证

3.1 KubeSphere 管理控制台验证集群状态

我们打开浏览器访问 Control-1 节点的 IP 地址和端口 30880,登录 KubeSphere 管理控制台的登录页面。

进入集群管理界面,单击左侧「节点」菜单,点击「集群节点」查看 Kubernetes 集群可用节点的详细信息。

3.2 Kubectl 命令行验证集群状态

  • 查看集群节点信息

在 Control-1 节点运行 kubectl 命令获取 Kubernetes 集群的节点信息。

arduino 复制代码
kubectl get nodes -o wide

在输出结果中可以看到,Kubernetes 集群节点已经变成 11个,并详细展示每个节点的名字、状态、角色、存活时间、Kubernetes 版本号、内部 IP、操作系统类型、内核版本和容器运行时等信息。

arduino 复制代码
$ kubectl get nodes -o wide
NAME               STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                        CONTAINER-RUNTIME
ksp-control-1      Ready    control-plane   13d   v1.28.8   192.168.9.91    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-2      Ready    control-plane   13d   v1.28.8   192.168.9.92    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-3      Ready    control-plane   13d   v1.28.8   192.168.9.93    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-gpu-worker-1   Ready    worker          7d    v1.28.8   192.168.9.101   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-gpu-worker-2   Ready    worker          7d    v1.28.8   192.168.9.102   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-storage-1      Ready    worker          21m   v1.28.8   192.168.9.97    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-storage-2      Ready    worker          21m   v1.28.8   192.168.9.98    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-storage-3      Ready    worker          21m   v1.28.8   192.168.9.99    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-1       Ready    worker          13d   v1.28.8   192.168.9.94    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-2       Ready    worker          13d   v1.28.8   192.168.9.95    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-3       Ready    worker          13d   v1.28.8   192.168.9.96    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-218.0.0.121.oe2203sp3.x86_64   containerd://1.7.13
  • 查看 Pod 列表

输入以下命令获取在 Kubernetes 集群上运行的 Pod 列表,按工作负载在 NODE 上的分布排序。

arduino 复制代码
kubectl get pods -o wide -A | sort -k 8

ksp-storage-1 为例,输出结果中可以看到, 新增的 Worker 节点上运行了 5 个必须的基本组件。

sql 复制代码
$ kubectl get pods -o wide -A | sort -k 8
NAMESPACE                      NAME                                   READY   STATUS    RESTARTS        AGE     IP              NODE          NOMINATED NODE   READINESS GATES
kube-system                    calico-node-9d8zp                      1/1     Running     0             18m     192.168.9.97    ksp-storage-1      <none>           <none>
kube-system                    haproxy-ksp-storage-1                  1/1     Running     0             38m     192.168.9.97    ksp-storage-1      <none>           <none>
kube-system                    kube-proxy-xfkqd                       1/1     Running     0             38m     192.168.9.97    ksp-storage-1      <none>           <none>
kube-system                    nodelocaldns-znxsn                     1/1     Running     0             38m     192.168.9.97    ksp-storage-1      <none>           <none>
kubesphere-monitoring-system   node-exporter-7cdhg                    2/2     Running     0             16m     192.168.9.97    ksp-storage-1      <none>           <none>
  • 查看 Image 列表

输入以下命令查看在 Worker 节点上已经下载的 Image 列表。

bash 复制代码
crictl images ls

在新增的 Worker 节点执行,输出结果如下:

bash 复制代码
$ crictl images ls
IMAGE                                                                         TAG                 IMAGE ID            SIZE
registry.cn-beijing.aliyuncs.com/kubesphereio/haproxy                         2.9.6-alpine        52687313354fc       12.3MB
registry.cn-beijing.aliyuncs.com/kubesphereio/kube-rbac-proxy                 v0.11.0             29589495df8d9       19.2MB
registry.cn-beijing.aliyuncs.com/kubesphereio/pause                           3.9                 e6f1816883972       321kB
registry.cn-beijing.aliyuncs.com/kubesphereio/calico/cni                      v3.27.3             6527a35581401       88.4MB
registry.cn-beijing.aliyuncs.com/kubesphereio/calico/node                     v3.27.3             5c6ffd2b2a1d0       116MB
registry.cn-beijing.aliyuncs.com/kubesphereio/kubesphere/k8s-dns-node-cache   1.22.20             ff71cd4ea5ae5       30.5MB
registry.cn-beijing.aliyuncs.com/kubesphereio/kubesphere/kube-proxy           v1.28.8             5ce97277076c6       28.1MB
registry.cn-beijing.aliyuncs.com/kubesphereio/prom/node-exporter              v1.3.1              1dbe0e9319764       10.3MB

注意: Worker 节点的 Image 初始数量为 8 个。

至此,我们完成了利用 Kubekey 在现有Kubernetes 集群中增加 Worker 节点的全部任务。

4. 运维自动化

文章中所有操作步骤,已全部编排为自动化脚本,包含以下内容(因篇幅限制,不在此文档中展示):

  • Ansible 自动初始化 K8S 集群节点

运维有术 星球会员请到专属代码仓库下载(价值内容,仅星球会员专享)。

以上,就是我今天分享的全部内容。下一期分享的内容还没想好,敬请期待开盲盒

如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @运维有术,及时收看更多好文!

欢迎加入 「知识星球|运维有术」 ,获取更多的 KubeSphere、Kubernetes、云原生运维、自动化运维、AI 大模型等实战技能。未来运维生涯始终有我坐在你的副驾

免责声明:

  • 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境由此引发的任何问题,作者概不负责

Get 本文实战视频(请注意,文档视频异步发行,请先关注)

版权声明

  • 所有内容均属于原创,感谢阅读、收藏,转载请联系授权,未经授权不得转载
相关推荐
wuxingge5 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX6 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总6 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿6 小时前
k8s 集群安装
云原生·容器·kubernetes
Code_Artist7 小时前
Docker镜像加速解决方案:配置HTTP代理,让Docker学会科学上网!
docker·云原生·容器
何遇mirror7 小时前
云原生基础-云计算概览
后端·云原生·云计算
颜淡慕潇8 小时前
【K8S系列】kubectl describe pod显示ImagePullBackOff,如何进一步排查?
后端·云原生·容器·kubernetes
Linux运维日记8 小时前
k8s1.31版本最新版本集群使用容器镜像仓库Harbor
linux·docker·云原生·容器·kubernetes
AI_小站10 小时前
RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答
人工智能·程序人生·langchain·kubernetes·llama·知识库·rag
长囧鹿14 小时前
云原生之k8s服务管理
云原生·容器·kubernetes