在 CentOS 上用 kubeadm 部署多节点 Kubernetes 集群
一 架构与准备
- 节点规划:至少准备1 台 Master + 2 台 Worker;推荐 CentOS 7/8,每台≥2 核 CPU、≥2 GB 内存,节点间网络互通,主机名与 MAC/Product UUID 不重复。
- 网络规划:建议固定 Service CIDR=10.96.0.0/12、Pod CIDR=10.244.0.0/16(与 Flannel 默认一致);如用域名访问 API,准备 controlPlaneEndpoint。
- 主机名与解析:设置主机名(如 master、node1、node2),并在所有节点配置 /etc/hosts 或使用 DNS。
- 基础环境:关闭 Swap、配置内核网络参数、开启 bridge-nf-call-iptables、安装容器运行时(Docker 或 containerd)。
二 所有节点通用配置
- 关闭防火墙与 SELinux(测试环境常用做法;生产请按安全策略放通端口):
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config
- 禁用 Swap:
swapoff -a && sed -i ‘/ swap / s/^/#/’ /etc/fstab
- 内核与模块:
cat >/etc/modules-load.d/k8s.conf </etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
- 安装容器运行时(二选一)
- Docker(CentOS 7 常用):
yum install -y yum-utils && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<‘EOF’
{
“registry-mirrors”: [“https://82m9ar63.mirror.aliyuncs.com”],
“exec-opts”: [“native.cgroupdriver=systemd”],
“log-driver”: “json-file”,
“log-opts”: { “max-size”: “100m” },
“storage-driver”: “overlay2”
}
EOF
systemctl daemon-reload && systemctl enable --now docker
- containerd(更贴近 kubeadm 默认):
yum install -y containerd
mkdir -p /etc/containerd && containerd config default >/etc/containerd/config.toml
sed -i ‘s/SystemdCgroup = false/SystemdCgroup = true/’ /etc/containerd/config.toml
systemctl enable --now containerd
- 安装 kubeadm/kubelet/kubectl:
cat >/etc/yum.repos.d/kubernetes.repo <<‘EOF’
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
三 初始化控制平面 Master
- 预拉取镜像(避免墙导致 init 失败):
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
- 初始化命令(单 Master 示例,按需替换参数):
kubeadm init \
–apiserver-advertise-address=<MASTER_IP> \
–image-repository=registry.aliyuncs.com/google_containers \
–kubernetes-version=v1.28.4 \
–service-cidr=10.96.0.0/12 \
–pod-network-cidr=10.244.0.0/16
说明:如有多网卡,请指定 –apiserver-advertise-address;如用域名或 VIP,使用 –controlPlaneEndpoint。
- 初始化完成后按提示执行:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- 安装网络插件(与 Pod CIDR 保持一致):
- Flannel:kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- Calico:kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
四 加入 Worker 节点
- 获取加入命令(在 Master 上):
kubeadm token create --print-join-command
输出示例:
kubeadm join <MASTER_IP>:6443 --token --discovery-token-ca-cert-hash sha256:
- 在每台 Worker 上执行上述命令,完成后在 Master 检查:
kubectl get nodes -o wide
等待节点状态变为 Ready。
五 高可用与常见问题
- 高可用控制平面(多 Master):
- 初始化首个 Master 时添加 –controlPlaneEndpoint <VIP|域名>:6443 与 –upload-certs;
- 其他 Master 加入:
kubeadm join <VIP|域名>:6443 \
–token \
–discovery-token-ca-cert-hash sha256: \
–control-plane --certificate-key
- 常见问题速查
- 镜像拉取失败:使用国内镜像仓库(如 registry.aliyuncs.com/google_containers)并提前 images pull。
- 节点 NotReady:确认 Pod CIDR 与网络插件一致(Flannel 默认 10.244.0.0/16),检查 kubelet 日志:journalctl -u kubelet -f。
- cgroup 驱动不一致:Docker 使用 native.cgroupdriver=systemd;containerd 配置 SystemdCgroup=true。
- 端口连通性:确保 6443/10250/2379 等端口放通(或临时关闭防火墙用于排障)。