总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战
一、工具介绍
1.1、背景说明
本文面向 运维工程师、K8s 学习者 以及需要在内网/离线环境快速交付 Kubernetes 集群的开发者。阅读本文前,建议具备 Linux 基础操作能力(如文件编辑、命令执行)并了解 容器与 Kubernetes 的基本概念。通过本文,你将掌握基于 containerd 的 Kubernetes 1.36.4 集群离线部署工具的使用方法,理解其自动化部署脚本的设计思路,并能够独立完成单机、一主多从、三主多从(高可用)集群的部署、检查与卸载,以及集群功能的验证。
该工具完整展示了自动化部署脚本的设计思路,适合想深入了解 K8s 部署原理的开发者。点击下方链接获取工具包。
1.2、部署流程
说明:下面是本工具的整体架构与部署流程总览图。
#mermaid-svg-qmnreURwgbQBfIFE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qmnreURwgbQBfIFE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qmnreURwgbQBfIFE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qmnreURwgbQBfIFE .error-icon{fill:#552222;}#mermaid-svg-qmnreURwgbQBfIFE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qmnreURwgbQBfIFE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qmnreURwgbQBfIFE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qmnreURwgbQBfIFE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qmnreURwgbQBfIFE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qmnreURwgbQBfIFE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qmnreURwgbQBfIFE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qmnreURwgbQBfIFE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qmnreURwgbQBfIFE .marker.cross{stroke:#333333;}#mermaid-svg-qmnreURwgbQBfIFE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qmnreURwgbQBfIFE p{margin:0;}#mermaid-svg-qmnreURwgbQBfIFE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qmnreURwgbQBfIFE .cluster-label text{fill:#333;}#mermaid-svg-qmnreURwgbQBfIFE .cluster-label span{color:#333;}#mermaid-svg-qmnreURwgbQBfIFE .cluster-label span p{background-color:transparent;}#mermaid-svg-qmnreURwgbQBfIFE .label text,#mermaid-svg-qmnreURwgbQBfIFE span{fill:#333;color:#333;}#mermaid-svg-qmnreURwgbQBfIFE .node rect,#mermaid-svg-qmnreURwgbQBfIFE .node circle,#mermaid-svg-qmnreURwgbQBfIFE .node ellipse,#mermaid-svg-qmnreURwgbQBfIFE .node polygon,#mermaid-svg-qmnreURwgbQBfIFE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qmnreURwgbQBfIFE .rough-node .label text,#mermaid-svg-qmnreURwgbQBfIFE .node .label text,#mermaid-svg-qmnreURwgbQBfIFE .image-shape .label,#mermaid-svg-qmnreURwgbQBfIFE .icon-shape .label{text-anchor:middle;}#mermaid-svg-qmnreURwgbQBfIFE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qmnreURwgbQBfIFE .rough-node .label,#mermaid-svg-qmnreURwgbQBfIFE .node .label,#mermaid-svg-qmnreURwgbQBfIFE .image-shape .label,#mermaid-svg-qmnreURwgbQBfIFE .icon-shape .label{text-align:center;}#mermaid-svg-qmnreURwgbQBfIFE .node.clickable{cursor:pointer;}#mermaid-svg-qmnreURwgbQBfIFE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qmnreURwgbQBfIFE .arrowheadPath{fill:#333333;}#mermaid-svg-qmnreURwgbQBfIFE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qmnreURwgbQBfIFE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qmnreURwgbQBfIFE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qmnreURwgbQBfIFE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qmnreURwgbQBfIFE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qmnreURwgbQBfIFE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qmnreURwgbQBfIFE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qmnreURwgbQBfIFE .cluster text{fill:#333;}#mermaid-svg-qmnreURwgbQBfIFE .cluster span{color:#333;}#mermaid-svg-qmnreURwgbQBfIFE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qmnreURwgbQBfIFE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qmnreURwgbQBfIFE rect.text{fill:none;stroke-width:0;}#mermaid-svg-qmnreURwgbQBfIFE .icon-shape,#mermaid-svg-qmnreURwgbQBfIFE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qmnreURwgbQBfIFE .icon-shape p,#mermaid-svg-qmnreURwgbQBfIFE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qmnreURwgbQBfIFE .icon-shape .label rect,#mermaid-svg-qmnreURwgbQBfIFE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qmnreURwgbQBfIFE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qmnreURwgbQBfIFE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qmnreURwgbQBfIFE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} single-node
one-master
three-master
离线部署工具 kube-tools.sh
选择部署模式
单机集群
一主多从集群
三主多从集群(高可用)
编辑 single-node.conf
执行 deploy single-node
check 检查集群状态
clear 卸载集群
control-plane 节点部署
拷贝部署包到 worker 节点
worker 节点部署 --join-as-worker
check 检查集群状态
clear 卸载(worker > control-plane)
第一个 control-plane 节点部署
拷贝部署包到其它节点
第二、三个 control-plane 节点部署 --join-as-master
worker 节点部署 --join-as-worker
check 检查集群状态
clear 卸载(worker > 额外control-plane > control-plane)
1.3、目录说明
1、目录设计如下图所示:

2、目录结构如下图所示:
bash
root@kube-master-90:/opt/kube-tools-v1.36.4# ll
drwxr-xr-x 5 root root 4096 Oct 12 17:53 common/ # 公共函数库(被 source)
-rwxr-xr-x 1 root root 109511 Oct 12 17:49 kube-tools.sh # 主控脚本(入口)
-rw-r--r-- 1 root root 5074 Oct 12 18:17 one-master.config.tpl # 一主多从集群配置文件
drwxr-xr-x 3 root root 4096 Oct 12 17:49 resource/ # 资源文件目录
-rw-r--r-- 1 root root 5094 Oct 12 18:18 single-node.config.tpl # 单机集群配置文件
drwxr-xr-x 3 root root 4096 Oct 12 17:49 templates/ # kubeadm初始化配置文件模板目录
drwxr-xr-x 4 root root 4096 Oct 12 17:49 test/ # 集群测试文件目录
-rw-r--r-- 1 root root 6085 Oct 12 18:17 three-master.config.tpl # 三主多从集群配置文件
如下图所示:


3、主控脚本部分内容如下:



1.4、帮助命令
a、单机部署
bash
./kube_tools.sh deploy single-node
b、一主多从部署
bash
# 1、control-plane节点部署
./kube_tools.sh deploy one-master
# 2、worker节点部署
./kube_tools.sh deploy one-master --join-as-worker
c、三主多从部署
bash
# 1、control-plane节点部署
./kube_tools.sh deploy three-master
./kube_tools.sh deploy three-master --join-as-master
./kube_tools.sh deploy three-master --join-as-master
# 2、worker节点部署
./kube_tools.sh deploy three-master --join-as-worker
二、工具下载
基于x86_64 + aarch64架构CPU + containerd一键离线部署容器版K8S 1.36.4高可用集群工具

三、工具介绍
提供基于 containerd 的 Kubernetes 1.36.4 集群一键离线部署能力,适配多种客户环境,具有以下核心特性:
1、多操作系统支持:兼容 Ubuntu 22.04、Ubuntu 24.04、Kylin V10。
2、多架构支持:同时支持 x86_64 和 aarch64 架构。
3、灵活的部署模式: 单机模式、一主多从、三主多从(高可用集群), 证书有效期长达 100 年,减少续期烦恼。
4、丰富的集群管理功能: 一键部署、集群健康检查、集群一键移除。
5、弹性节点管理:支持对一主多从、三主多从集群中的 Worker 节点进行一键扩容与移除,轻松调整集群规模。
总结:工具完全离线部署,不依赖外网,让 Kubernetes 集群交付更简单、更高效。
为帮助读者快速选择适合自身场景的部署模式,下表对单机集群、一主多从集群、三主多从集群三种模式进行对比:
| 对比维度 | 单机集群 | 一主多从集群 | 三主多从集群(高可用) |
|---|---|---|---|
| 适用场景 | 开发测试、学习验证、资源有限的单节点环境 | 中小规模生产环境,需要独立 Worker 节点承载业务负载 | 大规模生产环境、核心业务系统,对可用性要求极高 |
| 节点数量 | 1 个节点(同时承担 control-plane 与 worker 角色) | 1 个 control-plane 节点 + N 个 worker 节点 | 3 个 control-plane 节点 + N 个 worker 节点 |
| 高可用性 | 无高可用,单点故障即集群不可用 | control-plane 单点,存在单点故障风险;worker 节点可横向扩展 | 高可用,3 个 control-plane 节点互为备份,任一节点故障不影响集群运行 |
| 部署复杂度 | 最低,仅需编辑 single-node.conf 并执行一条命令 | 中等,需分别部署 control-plane 与 worker 节点 | 较高,需依次部署 3 个 control-plane 节点及多个 worker 节点 |
| 证书有效期 | 9 年 | 9 年 | 9 年 |
| 推荐环境 | 个人学习、功能验证、临时测试环境 | 中小型业务系统、测试与生产兼顾的环境 | 生产级核心业务、金融/政务等高可用要求场景 |
选择建议:
1、若仅用于学习、功能验证或临时测试,推荐选择单机集群,部署最简单、资源占用最少。
2、若业务规模较小但需要独立 Worker 节点承载负载,且能接受 control-plane 单点风险,推荐选择一主多从集群。
3、若为核心生产业务或对集群可用性有严格要求,推荐选择三主多从集群,通过多 control-plane 节点实现高可用,避免单点故障导致业务中断。
四、单机集群
4.1、部署单机集群
1、编辑变量文件
bash
root@localhost:/opt/kube-tools-v1.36.4# cp single-node.conf.tpl single-node.conf
root@localhost:/opt/kube-tools-v1.36.4# vim single-node.conf
bash
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# NODE_NAME:表示当前节点名称,此参数会作为主机名,根据实际情况修改
export NODE_IP="172.18.1.165" # 当前节点内网IP,可根据实际情况修改
# 表示当前节点名称,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-master-165"
# 表示集群为单节点,默认不修改
export NODE_TYPE="single-node"
# API Server服务主机IP地址、主机名、端口,端口不冲突情况下,建议不修改,主机IP和主机名根据实际情况修改
export API_SERVER_HOST_IP="${NODE_IP}"
export API_SERVER_HOST_NAME="${NODE_NAME}"
export API_SERVER_HOST_PORT="6443"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # Coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # Pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # Containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl版本,默认不修改
export CALICO_VERSION="v3.32.2" # Calico版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="876000h0m0s"
export CERT_VALIDITY_PERIOD="700800h0m0s"
export CLUSTER_SIGNING_DURATION="438000h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${API_SERVER_HOST_IP}:${API_SERVER_HOST_PORT}"
2、执行部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy single-node


4.2、检查集群状态
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh check single-node
执行结果,如下图所示:

4.3、卸载单机集群
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh clear single-node
执行结果,如下图所示:

五、一主多从集群
5.1 部署一主多从集群
5.1.1、control-plane节点
1、上传部署包到control-plane节点
2、编辑变量文件
bash
root@localhost:/opt/kube-tools-v1.36.4# cp one-master.conf.tpl one-master.conf
root@localhost:/opt/kube-tools-v1.36.4# vim one-master.conf
bash
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# 当前节点内网IP,可根据实际情况修改
export NODE_IP="172.18.1.165"
# 当前节点名称,部署过程中,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-master-165"
# 表示当前节点类型,可选值为<control-plane和worker>,control-plane表示控制节点,worker表示工作节点,根据实际情况修改
export NODE_TYPE="control-plane"
# API Server服务主机IP地址、主机名、端口,端口不冲突情况下,建议不修改,主机IP和主机名根据实际情况修改
export API_SERVER_HOST_IP="172.18.1.165"
export API_SERVER_HOST_NAME="kube-master-165"
export API_SERVER_HOST_PORT="6443"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # Coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # Pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # Containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl版本,默认不修改
export CALICO_VERSION="v3.32.2" # Calico版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="876000h0m0s"
export CERT_VALIDITY_PERIOD="700800h0m0s"
export CLUSTER_SIGNING_DURATION="438000h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${API_SERVER_HOST_IP}:${API_SERVER_HOST_PORT}"
3、执行一键部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy one-master
执行结果,如下图所示:


4、control-plane 节点部署完成后,将部署包分别拷贝到 worker 节点。
bash
root@kube-master-165:/opt# scp -r kube-tools-v1.36.4 root@172.18.1.168:/opt
5.1.2、worker节点
说明:worker 节点的部署只需要修改 three-master.conf 文件中的 NODE_IP、NODE_NAME、NODE_TYPE 变量,其它变量无需修改。
1、编辑变量文件
bash
root@localhost:/opt/kube-tools-v1.36.4# vim one-master.conf
bash
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# 当前节点内网IP,可根据实际情况修改
export NODE_IP="172.18.1.168"
# 当前节点名称,部署过程中,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-worker-168"
# 表示当前节点类型,可选值为<control-plane和worker>,control-plane表示控制节点,worker表示工作节点,根据实际情况修改
export NODE_TYPE="worker"
# API Server服务主机IP地址、主机名、端口,端口不冲突情况下,建议不修改,主机IP和主机名根据实际情况修改
export API_SERVER_HOST_IP="172.18.1.165"
export API_SERVER_HOST_NAME="kube-master-165"
export API_SERVER_HOST_PORT="6443"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # Coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # Pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # Containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl版本,默认不修改
export CALICO_VERSION="v3.32.2" # Calico版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="876000h0m0s"
export CERT_VALIDITY_PERIOD="700800h0m0s"
export CLUSTER_SIGNING_DURATION="438000h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${API_SERVER_HOST_IP}:${API_SERVER_HOST_PORT}"
2、执行一键部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy one-master --join-as-worker
执行结果,如下图所示:


5.2、检查集群状态
1. 检查 control-plane 节点状态
bash
./kube-tools.sh check one-master
执行结果,如下图所示:

2. 检查 worker 节点状态
bash
./kube-tools.sh check one-master --join-as-worker
执行结果,如下图所示:

5.3、卸载一主多从集群
说明:卸载顺序:worker 节点 > control-plane 节点。
1、卸载 worker 节点
bash
./kube-tools.sh clear one-master --join-as-worker
执行结果,如下图所示:

2、卸载 control-plane 节点
bash
./kube-tools.sh clear one-master
执行结果,如下图所示:

六、三主多从集群
6.1 部署一主多从集群
6.1.1、第一个control-plane节点
说明:上传部署包到第一个 control-plane 节点。
1、编辑变量文件
bash
root@localhost:/opt/kube-tools-v1.36.4# cp three-master.conf.tpl three-master.conf
root@localhost:/opt/kube-tools-v1.36.4# vim three-master.conf
如下图所示:
bash
#--------------------------------------------------------------------------------------------------------------------------
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# 当前节点内网IP,可根据实际情况修改
export NODE_IP="172.18.1.165"
# 当前节点名称,部署过程中,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-master-165"
# 节点类型,可选值为<control-plane和worker>,control-plane表示控制节点,worker表示工作节点,根据实际情况修改
export NODE_TYPE="control-plane"
# API Server服务监听端口,端口不冲突情况下,建议不修改
export API_SERVER_PORT="6443"
# 三个control-plane节点API Server服务主机IP地址、主机名、端口,端口默认不修改,主机IP和主机名根据实际情况修改
export API_SERVER_01_HOST_IP="172.18.1.165"
export API_SERVER_01_HOST_NAME="kube-master-165"
export API_SERVER_01_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_02_HOST_IP="172.18.1.168"
export API_SERVER_02_HOST_NAME="kube-master-168"
export API_SERVER_02_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_03_HOST_IP="172.18.1.90"
export API_SERVER_03_HOST_NAME="kube-master-90"
export API_SERVER_03_HOST_PORT="${API_SERVER_PORT}"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl工具版本,默认不修改
export CALICO_VERSION="v3.32.2" # calico网络插件版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export API_SERVER_PORT="6443" # API Server服务监听端口,端口不冲突情况下,建议不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="87600h0m0s"
export CERT_VALIDITY_PERIOD="70080h0m0s"
export CLUSTER_SIGNING_DURATION="43800h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
#--------------------------------------------------------------------------------------------------------------------------
# kube-lb负载组件,包含docker及Nginx
export DOCKER_DATA_DIR="${BASE_DIR}/basic-data/docker" # Docker服务数据目录,默认不修改
export NGINX_HOST_IP="${API_SERVER_01_HOST_IP}" # Nginx主机IP地址,主机IP,默认不修改
export NGINX_PROXY_PORT="8443" # Nginx代理端口,端口不冲突情况下,建议不修改
export NGINX_CONFIG_DIR="${BASE_DIR}/basic-data/nginx/conf" # Nginx配置文件目录,默认不修改
export NGINX_LOG_DIR="${BASE_DIR}/basic-data/nginx/logs" # Nginx日志文件目录,默认不修改
export NGINX_CONTAINER_NAME="kube-lb" # Nginx容器名称,默认不修改
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${NGINX_HOST_IP}:${NGINX_PROXY_PORT}"
#--------------------------------------------------------------------------------------------------------------------------
2、执行部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy three-master
执行结果,如下图所示:


4、第一个 control-plane 节点部署完成后,将部署包分别拷贝到其它 control-plane 节点和 worker 节点。
bash
# 其它control-plane 节点
root@kube-master-165:/opt# scp -r kube-tools-v1.36.4 root@172.18.1.168:/opt/
root@kube-master-165:/opt# scp -r kube-tools-v1.36.4 root@172.18.1.90:/opt/
# worker节点
root@kube-master-165:/opt# scp -r kube-tools-v1.36.4 root@172.18.1.197:/opt/
root@kube-master-165:/opt# scp -r kube-tools-v1.36.4 root@172.18.1.94:/opt/
6.1.2、第二个control-plane节点
说明:第二个 control-plane 节点的部署只需要修改 three-master.conf 文件中的 NODE_IP、NODE_NAME变量,其它变量无需修改。
1、编辑变量文件
bash
root@localhost:/opt/kube-tools-v1.36.4# vim three-master.conf
bash
#--------------------------------------------------------------------------------------------------------------------------
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# 当前节点内网IP,可根据实际情况修改
export NODE_IP="172.18.1.168"
# 当前节点名称,部署过程中,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-master-168"
# 节点类型,可选值为<control-plane和worker>,control-plane表示控制节点,worker表示工作节点,根据实际情况修改
export NODE_TYPE="control-plane"
# API Server服务监听端口,端口不冲突情况下,建议不修改
export API_SERVER_PORT="6443"
# 三个control-plane节点API Server服务主机IP地址、主机名、端口,端口默认不修改,主机IP和主机名根据实际情况修改
export API_SERVER_01_HOST_IP="172.18.1.165"
export API_SERVER_01_HOST_NAME="kube-master-165"
export API_SERVER_01_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_02_HOST_IP="172.18.1.168"
export API_SERVER_02_HOST_NAME="kube-master-168"
export API_SERVER_02_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_03_HOST_IP="172.18.1.90"
export API_SERVER_03_HOST_NAME="kube-master-90"
export API_SERVER_03_HOST_PORT="${API_SERVER_PORT}"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl工具版本,默认不修改
export CALICO_VERSION="v3.32.2" # calico网络插件版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export API_SERVER_PORT="6443" # API Server服务监听端口,端口不冲突情况下,建议不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="87600h0m0s"
export CERT_VALIDITY_PERIOD="70080h0m0s"
export CLUSTER_SIGNING_DURATION="43800h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
#--------------------------------------------------------------------------------------------------------------------------
# kube-lb负载组件,包含docker及Nginx
export DOCKER_DATA_DIR="${BASE_DIR}/basic-data/docker" # Docker服务数据目录,默认不修改
export NGINX_HOST_IP="${API_SERVER_01_HOST_IP}" # Nginx主机IP地址,主机IP,默认不修改
export NGINX_PROXY_PORT="8443" # Nginx代理端口,端口不冲突情况下,建议不修改
export NGINX_CONFIG_DIR="${BASE_DIR}/basic-data/nginx/conf" # Nginx配置文件目录,默认不修改
export NGINX_LOG_DIR="${BASE_DIR}/basic-data/nginx/logs" # Nginx日志文件目录,默认不修改
export NGINX_CONTAINER_NAME="kube-lb" # Nginx容器名称,默认不修改
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${NGINX_HOST_IP}:${NGINX_PROXY_PORT}"
#--------------------------------------------------------------------------------------------------------------------------
2、执行部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy three-master --join-as-master
执行结果,如下图所示:


6.1.3、第三个control-plane节点
说明:第三个 control-plane 节点的部署只需要修改 three-master.conf 文件中的 NODE_IP、NODE_NAME变量,其它变量无需修改。
1、修改 three-master.conf 文件
bash
root@localhost:/opt/kube-tools-v1.36.4# vim three-master.conf
bash
#--------------------------------------------------------------------------------------------------------------------------
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# 当前节点内网IP,可根据实际情况修改
export NODE_IP="172.18.1.90"
# 当前节点名称,部署过程中,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-master-90"
# 节点类型,可选值为<control-plane和worker>,control-plane表示控制节点,worker表示工作节点,根据实际情况修改
export NODE_TYPE="control-plane"
# API Server服务监听端口,端口不冲突情况下,建议不修改
export API_SERVER_PORT="6443"
# 三个control-plane节点API Server服务主机IP地址、主机名、端口,端口默认不修改,主机IP和主机名根据实际情况修改
export API_SERVER_01_HOST_IP="172.18.1.165"
export API_SERVER_01_HOST_NAME="kube-master-165"
export API_SERVER_01_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_02_HOST_IP="172.18.1.168"
export API_SERVER_02_HOST_NAME="kube-master-168"
export API_SERVER_02_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_03_HOST_IP="172.18.1.90"
export API_SERVER_03_HOST_NAME="kube-master-90"
export API_SERVER_03_HOST_PORT="${API_SERVER_PORT}"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl工具版本,默认不修改
export CALICO_VERSION="v3.32.2" # calico网络插件版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export API_SERVER_PORT="6443" # API Server服务监听端口,端口不冲突情况下,建议不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="87600h0m0s"
export CERT_VALIDITY_PERIOD="70080h0m0s"
export CLUSTER_SIGNING_DURATION="43800h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
#--------------------------------------------------------------------------------------------------------------------------
# kube-lb负载组件,包含docker及Nginx
export DOCKER_DATA_DIR="${BASE_DIR}/basic-data/docker" # Docker服务数据目录,默认不修改
export NGINX_HOST_IP="${API_SERVER_01_HOST_IP}" # Nginx主机IP地址,主机IP,默认不修改
export NGINX_PROXY_PORT="8443" # Nginx代理端口,端口不冲突情况下,建议不修改
export NGINX_CONFIG_DIR="${BASE_DIR}/basic-data/nginx/conf" # Nginx配置文件目录,默认不修改
export NGINX_LOG_DIR="${BASE_DIR}/basic-data/nginx/logs" # Nginx日志文件目录,默认不修改
export NGINX_CONTAINER_NAME="kube-lb" # Nginx容器名称,默认不修改
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${NGINX_HOST_IP}:${NGINX_PROXY_PORT}"
#--------------------------------------------------------------------------------------------------------------------------
2、执行部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy three-master --join-as-master
执行结果,如下图所示:


6.1.4、worker节点
说明:其它 worker 节点的部署只需要修改 three-master.conf 文件中的 NODE_IP、NODE_NAME、NODE_TYPE 变量,其它变量无需修改。
1、修改 three-master.conf 文件
bash
root@localhost:/opt/kube-tools-v1.36.4# vim three-master.conf
bash
#--------------------------------------------------------------------------------------------------------------------------
# 建议填写为当前磁盘最大存储空间目录,如果根(/)目录空间空间最大,建议填写为/data,如果挂载盘空间最大,建议填写为挂载目录
export BASE_DIR="/data"
# cpu架构,可选值为<x86_64和aarch64>,根据实际情况修改
export CPU_PLATFORM="x86_64"
# 当前节点内网IP,可根据实际情况修改
export NODE_IP="172.18.1.197"
# 当前节点名称,部署过程中,此参数会作为主机名,根据实际情况修改
# 注意:必须符合K8S DNS标签规范<如小写字母、数字、'-'和'.'>,且只能以小写字母/数字开头或结尾
export NODE_NAME="kube-worker-197"
# 节点类型,可选值为<control-plane和worker>,control-plane表示控制节点,worker表示工作节点,根据实际情况修改
export NODE_TYPE="worker"
# API Server服务监听端口,端口不冲突情况下,建议不修改
export API_SERVER_PORT="6443"
# 三个control-plane节点API Server服务主机IP地址、主机名、端口,端口默认不修改,主机IP和主机名根据实际情况修改
export API_SERVER_01_HOST_IP="172.18.1.165"
export API_SERVER_01_HOST_NAME="kube-master-165"
export API_SERVER_01_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_02_HOST_IP="172.18.1.168"
export API_SERVER_02_HOST_NAME="kube-master-168"
export API_SERVER_02_HOST_PORT="${API_SERVER_PORT}"
export API_SERVER_03_HOST_IP="172.18.1.90"
export API_SERVER_03_HOST_NAME="kube-master-90"
export API_SERVER_03_HOST_PORT="${API_SERVER_PORT}"
export KUBERNETES_VERSION="v1.36.4" # Kubernetes版本,默认不修改
export COREDNS_VERSION="v1.14.2" # coredns版本,默认不修改
export PAUSE_VERSION="3.10.2" # pause版本,默认不修改
export ETCD_VERSION="3.6.8-0" # etcd版本,默认不修改
export CONTAINERD_VERSION="v2.4.1" # containerd版本,默认不修改
export RUNC_VERSION="v1.5.2" # runc版本,默认不修改
export CNI_PLUGIN_VERSION="v1.9.1" # cni插件版本,默认不修改
export CRICTL_VERSION="v1.36.0" # crictl工具版本,默认不修改
export CALICO_VERSION="v3.32.2" # calico网络插件版本,默认不修改
export ETCD_DATA_DIR="${BASE_DIR}/basic-data/etcd" # etcd数据目录,默认不修改
export CONTAINERD_DATA_DIR="${BASE_DIR}/basic-data/containerd" # containerd数据目录,默认不修改
export IMAGE_REPOSITORY="registry.aliyuncs.com/google_containers" # 阿里云镜像仓库地址,默认不修改
export API_SERVER_PORT="6443" # API Server服务监听端口,端口不冲突情况下,建议不修改
export POD_SUBNET="10.48.0.0/16" # K8S集群Pod网段,不冲突情况下,建议不修改
export SERVICE_SUBNET="10.96.0.0/16" # K8S集群Service网段,不冲突情况下,建议不修改
export SERVICE_CLUSTER_IP="10.96.0.1" # K8S集群内部Service服务地址,主要为集群内部提供服务发现和负载均衡,<始终为Service网段第1个IP>,可根据实际情况修改
export CLUSTER_DNS_IP="10.96.0.10" # K8S集群中Pod使用的DNS服务器地址,<默认为集群Service网段第10个IP>,可根据实际情况修改
export SERVICE_NODE_POD_RANGE="30000-36000" # NodePort类型Service可使用的端口范围,默认不修改
export CRI_SOCKET="unix:///var/run/containerd/containerd.sock" # kubelet连接容器运行时的CRI套接字地址,默认不修改
# 注意:CA 根证书有效期 ≥ (非 CA 证书)有效期 ≥ CSR 动态签发证书有效期,且必须符合 Go time.Duration 格式,如 "87600h" 或 "87600h0m0s",建议不修改
# CA_CERT_VALIDITY_PERIOD:根证书的自有有效期,主要包括:集群的主根 CA、etcd 专用 CA、Front-Proxy 专用 CA
# CERT_VALIDITY_PERIOD:kubeadm在init或join时签发的所有叶子证书(非CA证书)的有效期,主要包括:控制平面组件证书、etcd 组件证书、kubeconfig文件内嵌证书、Kubelet客户端证书
# CLUSTER_SIGNING_DURATION:控制集群运行期间通过CSR (Certificate Signing Request) API动态签发的证书的有效期,主要包括:kubelet服务端证书
export CA_CERT_VALIDITY_PERIOD="87600h0m0s"
export CERT_VALIDITY_PERIOD="70080h0m0s"
export CLUSTER_SIGNING_DURATION="43800h0m0s"
# kube-proxy的转发模式变量,可选值为<iptables、ipvs、nftables>,根据实际情况修改,生产环境建议使用ipvs、nftables,其中nftables是未来主推方向
# ipvs模式要求:Kubernetes部署版本 < v1.35(已弃用 since Kubernetes v1.35);操作系统内核版本>= 5.9
# nftables模式要求:Kubernetes部署版本 >= v1.33(已启用since Kubernetes v1.33);操作系统内核版本>= 5.13;nft版本>=v1.0.1
export PROXY_MODE="nftables"
# kubelet在启动容器时,读取宿主机DNS解析配置的源文件路径,根据实际情况填写
# Ubuntu 22.04、Ubuntu 24.04系统填写为</run/systemd/resolve/resolv.conf>;kylin V10系统填写为</etc/resolv.conf>
export DNS_RESOLV_CONF="/run/systemd/resolve/resolv.conf"
#--------------------------------------------------------------------------------------------------------------------------
# kube-lb负载组件,包含docker及Nginx
export DOCKER_DATA_DIR="${BASE_DIR}/basic-data/docker" # Docker服务数据目录,默认不修改
export NGINX_HOST_IP="${API_SERVER_01_HOST_IP}" # Nginx主机IP地址,主机IP,默认不修改
export NGINX_PROXY_PORT="8443" # Nginx代理端口,端口不冲突情况下,建议不修改
export NGINX_CONFIG_DIR="${BASE_DIR}/basic-data/nginx/conf" # Nginx配置文件目录,默认不修改
export NGINX_LOG_DIR="${BASE_DIR}/basic-data/nginx/logs" # Nginx日志文件目录,默认不修改
export NGINX_CONTAINER_NAME="kube-lb" # Nginx容器名称,默认不修改
# 控制平面端点,集群的统一访问入口,默认不修改
export CONTROL_PLANE_ENDPOINT="${NGINX_HOST_IP}:${NGINX_PROXY_PORT}"
#--------------------------------------------------------------------------------------------------------------------------
2、执行部署
bash
root@localhost:/opt/kube-tools-v1.36.4# ./kube-tools.sh deploy three-master --join-as-worker
执行结果,如下图所示:


6.2、检查集群状态
1. 检查 control-plane 节点状态
说明:以下操作可在对应节点上执行。
bash
./kube-tools.sh check three-master
执行结果,如下图所示:
2. 检查额外 control-plane 节点状态
说明:以下操作可在对应节点上执行。
bash
./kube-tools.sh check three-master --join-as-master
执行结果,如下图所示:
3. 检查 worker 节点状态
说明:以下操作可在对应节点上执行。
bash
./kube-tools.sh check three-master --join-as-worker
执行结果,如下图所示:
6.3、卸载三主多从集群
说明:卸载顺序:worker 节点 > 额外control-plane 节点 > control-plane 节点。
1、卸载 worker 节点
bash
./kube-tools.sh clear three-master --join-as-worker
2、卸载 额外 control-plane 节点
bash
./kube-tools.sh clear three-master --join-as-master
3、卸载 control-plane 节点
bash
./kube-tools.sh clear three-master
七、集群功能测试
1、检查集群状态
说明:以下操作可在任意一个 control-plane 节点上执行,这里默认在 kube-master-165 节点。
bash
kubectl get nodes -o wide
kubectl get pods -A -o wide
如下图所示:

2、检查证书有效时间
说明:以下操作可在任意一个 control-plane 节点上执行,这里默认在 kube-master-165 节点。
bash
kubeadm certs check-expiration
如下图所示:

3、集群 DNS 测试
1、worker 节点导入测试容器镜像
说明:worker 节点导入测试容器镜像。
bash
root@localhost:/opt/kube-tools-v1.36.4/test/x86_64# ./load_images.sh
2、control-plane 节点执行如下命令
说明:以下操作可在任意一个 control-plane 节点上执行,这里默认在 kube-master-165 节点。
bash
kubectl run busybox --image busybox:1.34 --restart=Never --rm -it busybox -- sh
nslookup default.svc.cluster.local
如下图所示:

4、集群功能测试
说明:以下操作可在任意一个 control-plane 节点上执行,这里默认在 kube-master-165 节点。
bash
root@kube-master-165:/opt/kube-tools-v1.36.4/test/x86_64# kubectl apply -f nginx.yaml
deployment.apps/nginx created
service/nginx-test-service created
如下图所示:

在浏览器上访问 Nginx,如下所示:

总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战