一、部署前置规划与环境基线
使用 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
EOF2. 永久关闭 Swap 分区(强制要求)
Kubelet 要求必须禁用操作系统的内存交换分区,否则 Kubelet 容器调度将无法正常启动:
bash
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab3. 放行网桥过滤与网络转发内核参数
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 生产级集群搭建完毕。