《Kubernetes部署篇:基于x86_64+aarch64架构CPU+containerd一键离线部署容器版K8S1.36.4高可用集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级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集群运维实战

相关推荐
行者全栈架构师2 小时前
【鸿蒙心迹】冷启动从 2.8s 优化到 0.9s——耗时拆解与数据对比实战(HarmonyOS 7.x)
前端·算法·架构
吴声子夜歌2 小时前
Docker入门与实战——配置私有仓库
运维·docker·容器
m0_587383003 小时前
无人自助拼豆系统的全栈开发方案
java·后端·struts·小程序·架构
绾樘3 小时前
Docker
docker·容器
java_logo3 小时前
Docker 部署 MariaDB:轻松搭建开源关系型数据库
数据库·docker·容器·开源·mariadb·轩辕镜像·docker部署教程
池佳齐3 小时前
【软考高级架构师案例】容器化改造:Docker + K8s,如何用云原生视角重构传统多层架构?
docker·云原生·kubernetes
Jmyd01233 小时前
3D数字协同设计实训空间技术架构解析:从三维采集到WebGL虚拟展示的全链路实现
3d·架构·webgl·虚拟实训
m0_587383003 小时前
GogoAI自助健身门店解决方案核心技术实现与落地部署全流程实操指南
运维·spring boot·信息可视化·架构·需求分析
zh73143 小时前
Docker Desktop on Windows 挂载问题根因分析
windows·docker·容器