Skip to content

一、部署前置规划与环境基线 ​

使用 kubeadm 搭建高可用与标准化 Kubernetes 集群前,需要确保所有物理机或虚拟机节点满足基本硬件与网络基线要求:

  • 硬件资源:Master 节点建议至少 2 核 CPU、4GB 内存;Worker 节点根据实际业务容器密度规划;
  • 网络连通性:集群内所有主机内网互相连通,节点间不能存在重复的主机名(hostname)、MAC 地址或 product_uuid;
  • 操作系统:推荐 CentOS 7.9 / Rocky Linux 9 / Ubuntu 22.04 LTS。

二、操作系统底层初始化与调优(所有节点执行) ​

1. 主机名与本地 Hosts 解析 ​

bash
# 节点 1 设置 master,节点 2 设置 node1
hostnamectl set-hostname k8s-master

# 写入静态映射
cat >> /etc/hosts <<EOF
10.0.1.10 k8s-master
10.0.1.11 k8s-node1
10.0.1.12 k8s-node2
EOF

2. 永久关闭 Swap 分区(强制要求) ​

Kubelet 要求必须禁用操作系统的内存交换分区,否则 Kubelet 容器调度将无法正常启动:

bash
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

3. 放行网桥过滤与网络转发内核参数 ​

bash
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

三、容器运行时配置:对齐 Cgroup 驱动 ​

安装 Docker / containerd 后,最关键的一步是将 Docker 的 cgroupdriver 从默认的 cgroupfs 调整为 systemd,确保与 Linux 系统的 Init 进程保持一致的资源层级管理:

编辑 /etc/docker/daemon.json:

json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

重新加载生效:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker --now

四、安装 Kubeadm、Kubelet 与 Kubectl ​

添加官方镜像源并安装指定大版本的核心组件:

bash
# 安装指定版本核心包(以 v1.23 为例)
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet --now

五、Master 节点初始化(kubeadm init) ​

在 Master 主控节点执行初始化命令,并指定 Pod 虚拟网段:

bash
kubeadm init \
  --apiserver-advertise-address=10.0.1.10 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --kubernetes-version=v1.23.6 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

配置 Kubectl 访问凭据 ​

初始化成功后,按照终端输出配置当前管理员上下文:

bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

六、部署 Flannel CNI 容器网络插件 ​

集群初始化后,节点默认处于 NotReady 状态,这是因为集群尚未安装 CNI(Container Network Interface)网络插件。

部署 Flannel 网络组件:

bash
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

等待 Pod 镜像拉取完成后,查看节点状态变为就绪:

bash
kubectl get nodes
# 输出:k8s-master    Ready    control-plane,master   ...

七、Worker 节点加入集群(kubeadm join) ​

在各 Worker 节点上,直接执行 Master 初始化时生成的 Join Token 命令:

bash
kubeadm join 10.0.1.10:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef...

在 Master 上验证集群状态:

bash
kubectl get nodes -o wide

至此,一个具备多节点容器调度与服务网络通信能力的 Kubernetes 生产级集群搭建完毕。

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win