手把手教你搭建Kubernetes-v1.32高可用集群
文章信息
- 适用系统:Rocky Linux 10 (Red Quartz)
- K8s 版本:v1.32.0
- 容器运行时:containerd
- 网络插件:Flannel
- 部署工具:kubeadm
- 总节点数:9 台(3 Master + 6 Node)
- 目标读者:转行小白,零基础也能跟着做
一、集群架构规划
在开始之前,先明确你的机器 IP 分配。请确保所有节点处于同一局域网,且网络互通。
| 角色 | 主机名 | IP 地址 | 配置建议 |
|---|---|---|---|
| Master-1 | k8s-master1 | 10.10.1.10 | 2核4G+ |
| Master-2 | k8s-master2 | 10.10.1.11 | 2核4G+ |
| Master-3 | k8s-master3 | 10.10.1.12 | 2核4G+ |
| Node-1 | k8s-node1 | 10.10.1.21 | 2核4G+ |
| Node-2 | k8s-node2 | 10.10.1.22 | 2核4G+ |
| Node-3 | k8s-node3 | 10.10.1.23 | 2核4G+ |
| Node-4 | k8s-node4 | 10.10.1.24 | 2核4G+ |
| Node-5 | k8s-node5 | 10.10.1.25 | 2核4G+ |
| Node-6 | k8s-node6 | 10.10.1.26 | 2核4G+ |
网段规划(不与你的局域网冲突即可):
- Pod 网段:
172.16.0.0/16 - Service 网段:
10.96.0.0/12
控制平面端点: 10.10.1.10:6443(使用 Master-1 的 IP 作为统一入口,K8s 核心组件仍为 3 节点高可用)
二、前置说明(必看)
- 以下所有命令,默认使用
root用户执行。如果你用普通用户,请在每条命令前加sudo。 - 网卡名称:Rocky Linux 10 默认网卡可能是
ens160、eth0或enp*s*。请先用ip addr命令确认你的网卡名,后续用到时请替换。 - 本文所有 “所有节点” 指的是 9 台机器全部要执行,“Master 节点” 指 3 台 Master,“Node 节点” 指 6 台 Node。
- 建议先通读一遍全文,了解整体流程后再动手,不要边做边看。
三、环境准备(所有节点执行)
3.1 设置主机名
分别在对应机器上执行:
# 在 10.10.1.10 执行
hostnamectl set-hostname k8s-master1
# 在 10.10.1.11 执行
hostnamectl set-hostname k8s-master2
# 在 10.10.1.12 执行
hostnamectl set-hostname k8s-master3
# 在 10.10.1.21 执行
hostnamectl set-hostname k8s-node1
# 在 10.10.1.22 执行
hostnamectl set-hostname k8s-node2
# 在 10.10.1.23 执行
hostnamectl set-hostname k8s-node3
# 在 10.10.1.24 执行
hostnamectl set-hostname k8s-node4
# 在 10.10.1.25 执行
hostnamectl set-hostname k8s-node5
# 在 10.10.1.26 执行
hostnamectl set-hostname k8s-node6
3.2 配置 hosts 解析
所有节点执行:
cat >> /etc/hosts << 'EOF'
10.10.1.10 k8s-master1
10.10.1.11 k8s-master2
10.10.1.12 k8s-master3
10.10.1.21 k8s-node1
10.10.1.22 k8s-node2
10.10.1.23 k8s-node3
10.10.1.24 k8s-node4
10.10.1.25 k8s-node5
10.10.1.26 k8s-node6
EOF
验证:
ping -c 2 k8s-master1
ping -c 2 k8s-node1
确保每个节点都能 ping 通其他节点的主机名。
3.3 关闭防火墙
所有节点执行:
systemctl stop firewalld && systemctl disable firewalld
生产环境建议开放特定端口而非直接关闭,但学习环境下直接关闭最省心。
3.4 关闭 SELinux
所有节点执行:
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3.5 关闭 Swap
所有节点执行:
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
K8s 官方要求关闭 Swap,否则 kubelet 无法正常启动。
验证 Swap 是否关闭:
free -h
确保 Swap 行显示为 0。
3.6 配置内核参数
所有节点执行:
cat > /etc/sysctl.d/k8s.conf << 'EOF'
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
modprobe br_netfilter
sysctl --system
3.7 配置 IPVS 模块(可选但推荐)
所有节点执行:
yum install -y ipvsadm ipset
cat > /etc/sysconfig/modules/ipvs.modules << 'EOF'
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack
能看到 ip_vs、ip_vs_rr、nf_conntrack 等模块即表示成功。
3.8 时间同步
所有节点执行:
timedatectl set-timezone Asia/Shanghai
yum install -y chrony
systemctl enable --now chronyd
chronyc sources
四、安装容器运行时 Containerd(所有节点执行)
K8s v1.32 不再支持 Docker(dockershim 已移除),我们使用 containerd 作为容器运行时。
4.1 添加 Docker CE 软件源(包含 containerd)
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.2 安装 containerd
yum install -y containerd.io
4.3 配置 containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改关键配置:
# 1. 使用 systemd 作为 cgroup driver(K8s 官方强烈推荐)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 2. 修改默认的 pause 镜像为国内阿里云镜像(防止拉取失败)
sed -i 's|sandbox_image = "registry.k8s.io/pause:.*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"|' /etc/containerd/config.toml
4.4 启动 containerd
systemctl restart containerd
systemctl enable containerd
验证:
ctr version
systemctl status containerd
看到 active (running) 即正常。
五、安装 Kubernetes 组件(所有节点执行)
5.1 添加阿里云 K8s 软件源
cat > /etc/yum.repos.d/kubernetes.repo << 'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
5.2 安装 kubelet、kubeadm、kubectl
yum install -y kubelet-1.32.0 kubeadm-1.32.0 kubectl-1.32.0
这里指定了
1.32.0版本,确保集群版本统一。如果你想安装更新的补丁版本(如1.32.1),可以修改版本号。
5.3 设置 kubelet 开机自启
systemctl enable kubelet
此时 kubelet 会处于不断重启的状态,这是正常的,因为集群尚未初始化,等待 kubeadm 初始化后会自动恢复正常。
六、提前拉取 K8s 镜像(所有节点执行)⭐ 关键防坑步骤
这是最重要的一步!国内直接拉取 registry.k8s.io 的镜像会失败,我们使用阿里云镜像源提前拉取所有需要的镜像,确保后续初始化不会因为网络问题报错。
6.1 查看需要哪些镜像
kubeadm config images list --kubernetes-version=v1.32.0 --image-repository=registry.aliyuncs.com/google_containers
6.2 一键拉取所有镜像
kubeadm config images pull \
--kubernetes-version=v1.32.0 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket=unix:///run/containerd/containerd.sock
耐心等待拉取完成,看到类似 done 的提示即表示成功。
验证镜像是否拉取成功:
ctr -n k8s.io images list | grep registry.aliyuncs.com
应该能看到 kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、pause、etcd、coredns 等镜像。
七、初始化第一个 Master 节点(仅在 Master-1: 10.10.1.10 执行)
7.1 生成 kubeadm 初始化配置文件
使用配置文件初始化,比命令行参数更清晰、更可控。
cat > /root/kubeadm-config.yaml << 'EOF'
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.32.0
controlPlaneEndpoint: "10.10.1.10:6443"
networking:
podSubnet: "172.16.0.0/16"
serviceSubnet: "10.96.0.0/12"
imageRepository: "registry.aliyuncs.com/google_containers"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF
7.2 执行初始化
kubeadm init --config=/root/kubeadm-config.yaml --upload-certs
参数说明:
controlPlaneEndpoint: 控制平面端点,后续所有节点都通过这个地址加入集群podSubnet: Pod 网段,与后续 Flannel 配置保持一致serviceSubnet: Service 网段imageRepository: 使用阿里云镜像源--upload-certs: 将证书上传到集群中,方便其他 Master 节点加入
初始化过程大约需要 1-3 分钟,请耐心等待。
7.3 初始化成功后的关键输出
如果看到以下信息,表示初始化成功:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
...
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join 10.10.1.10:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx \
--control-plane --certificate-key xxxxxx
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.10.1.10:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx
请务必保存好这些输出! 建议复制粘贴保存到本地文本文件中,后续步骤需要用到。
7.4 配置 kubectl
在 Master-1 上执行:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
7.5 验证 Master-1 状态
kubectl get nodes
此时应该能看到 k8s-master1 节点,状态为 NotReady(因为还没有安装网络插件,这是正常的)。
八、其他 Master 节点加入控制平面(Master-2、Master-3 执行)
8.1 提前拉取镜像
在 Master-2 (10.10.1.11) 和 Master-3 (10.10.1.12) 上执行:
kubeadm config images pull \
--kubernetes-version=v1.32.0 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket=unix:///run/containerd/containerd.sock
8.2 加入控制平面
在 Master-2 和 Master-3 上执行,使用 Master-1 初始化成功时输出的 控制平面加入命令:
kubeadm join 10.10.1.10:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane --certificate-key <certificate-key> \
--cri-socket=unix:///run/containerd/containerd.sock
将
<token>、<hash>、<certificate-key>替换为你在 Master-1 初始化成功后保存的实际值。
加入成功后,在每个新 Master 上执行:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
8.3 验证 Master 节点
在任意 Master 上执行:
kubectl get nodes
此时应该能看到 3 个 Master 节点,状态都是 NotReady。
九、Node 节点加入集群(Node-1 到 Node-6 执行)
9.1 提前拉取镜像
在所有 Node 节点上执行:
kubeadm config images pull \
--kubernetes-version=v1.32.0 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket=unix:///run/containerd/containerd.sock
Node 节点只需要
kube-proxy和pause镜像,拉取会很快。
9.2 加入集群
在所有 Node 节点上执行,使用 Master-1 初始化成功时输出的 Node 加入命令:
kubeadm join 10.10.1.10:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--cri-socket=unix:///run/containerd/containerd.sock
将
<token>和<hash>替换为实际值。
9.3 验证所有节点
在任意 Master 上执行:
kubectl get nodes
此时应该能看到 9 个节点(3 个 Master + 6 个 Node),状态都是 NotReady。接下来安装网络插件。
十、安装 Flannel 网络插件(在任意 Master 执行)
10.1 下载 Flannel 配置文件
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml -O /root/kube-flannel.yml
如果下载失败(国内访问 GitHub 不稳定),可以使用以下备用命令从国内镜像站下载:
wget https://ghproxy.com/https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml -O /root/kube-flannel.yml
10.2 修改 Pod 网段(如果与你规划的不一致)
打开文件检查 net-conf.json 部分的 Network 字段:
grep -A 5 'net-conf.json' /root/kube-flannel.yml
确保它是 "Network": "172.16.0.0/16"(与你初始化时配置的 podSubnet 一致)。如果不一致,修改它:
sed -i 's|"Network": ".*"|"Network": "172.16.0.0/16"|' /root/kube-flannel.yml
10.3 修改 Flannel 镜像为国内源(关键!)
Flannel 默认使用 docker.io/flannel/flannel 镜像,国内拉取可能失败。我们替换为阿里云镜像:
sed -i 's|docker.io/flannel/flannel|registry.cn-hangzhou.aliyuncs.com/google_containers/flannel|g' /root/kube-flannel.yml
sed -i 's|docker.io/flannel/flannel-cni-plugin|registry.cn-hangzhou.aliyuncs.com/google_containers/flannel-cni-plugin|g' /root/kube-flannel.yml
如果阿里云没有该镜像,也可以尝试
docker.mirrors.sjtug.sjtu.edu.cn或docker.m.daocloud.io等国内镜像加速。
10.4 应用 Flannel 配置
kubectl apply -f /root/kube-flannel.yml
10.5 验证 Flannel 是否正常运行
kubectl get pods -n kube-flannel
等待所有 Pod 状态变为 Running,这可能需要 1-2 分钟。
十一、验证集群状态(在任意 Master 执行)
11.1 查看节点状态
kubectl get nodes
所有 9 个节点状态应该都变为 Ready。如果还有 NotReady,请等待 1-2 分钟后再次查看。
11.2 查看核心组件状态
kubectl get pods -n kube-system
你应该能看到以下 Pod 全部处于 Running 状态:
kube-apiserver-*(3 个,分别在 3 个 Master)kube-controller-manager-*(3 个)kube-scheduler-*(3 个)etcd-*(3 个)kube-proxy-*(9 个,每个节点一个)coredns-*(2 个)
11.3 查看集群信息
kubectl cluster-info
输出示例:
Kubernetes control plane is running at https://10.10.1.10:6443
CoreDNS is running at https://10.10.1.10:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
11.4 测试 DNS 解析
kubectl run test-dns --image=busybox:1.36 --restart=Never --rm -it -- nslookup kubernetes.default
如果能解析出 kubernetes.default.svc.cluster.local 的 IP(如 10.96.0.1),说明 CoreDNS 正常工作。
11.5 测试 Pod 网络互通
创建一个测试 Pod:
kubectl run test-pod --image=busybox:1.36 --restart=Never --rm -it -- /bin/sh
在 Pod 内部 ping 另一个节点的 Pod IP,确保跨节点网络互通。
十二、配置 kubectl 自动补全(可选,推荐)
在 Master 节点执行:
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
配置完成后,输入 kubectl get no 后按 Tab 键可以自动补全。
十三、常见问题排查(收藏备用)
13.1 节点一直处于 NotReady 状态
排查步骤:
# 查看节点详细事件
kubectl describe node <节点名>
# 查看 kubelet 日志
journalctl -u kubelet -f
# 查看节点上 kubelet 状态
systemctl status kubelet
常见原因:
- 网络插件未安装或安装失败
- containerd 未正常运行
- kubelet 配置错误
13.2 Pod 一直处于 Pending 状态
kubectl describe pod <pod-name> -n <namespace>
常见原因:节点资源不足、镜像拉取失败、没有合适的节点调度。
13.3 镜像拉取失败(ImagePullBackOff)
# 查看具体错误
kubectl describe pod <pod-name> -n <namespace>
# 手动在节点上拉取镜像测试
ctr -n k8s.io images pull <镜像地址>
解决方案:
- 检查镜像地址是否正确
- 替换为国内镜像源
- 检查节点是否能访问外网
13.4 kubeadm join 失败,token 过期
Token 默认有效期为 24 小时。如果过期了,在 Master 上重新生成:
# 生成新的 join 命令
kubeadm token create --print-join-command
13.5 重置节点(如果初始化失败需要重来)
在需要重置的节点上执行:
kubeadm reset -f
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
systemctl restart kubelet
重置后,该节点可以重新执行
kubeadm join加入集群。
13.6 containerd 镜像拉取失败
检查 containerd 配置:
cat /etc/containerd/config.toml | grep sandbox_image
确保 sandbox_image 指向的是国内镜像地址。
重启 containerd:
systemctl restart containerd
十四、集群维护常用命令
# 查看所有节点
kubectl get nodes -o wide
# 查看所有命名空间下的 Pod
kubectl get pods -A -o wide
# 查看集群事件
kubectl get events --sort-by='.lastTimestamp'
# 查看节点资源使用情况
kubectl top nodes
# 查看 Pod 资源使用情况
kubectl top pods -n kube-system
# 查看集群组件状态
kubectl get cs
# 查看集群版本
kubectl version
# 查看集群节点标签
kubectl get nodes --show-labels
# 给节点打标签
kubectl label nodes k8s-node1 disktype=ssd
# 驱逐节点上的 Pod(维护时使用)
kubectl drain k8s-node1 --ignore-daemonsets --delete-emptydir-data
# 恢复节点调度
kubectl uncordon k8s-node1
十五、总结
恭喜你!如果你一步一步跟着做到了这里,你的 Kubernetes v1.32 高可用集群 已经成功运行在 Rocky Linux 10 上了!
本文核心要点回顾
| 步骤 | 关键操作 |
|---|---|
| 环境准备 | 关闭防火墙、SELinux、Swap,配置内核参数 |
| 容器运行时 | 安装 containerd,配置 systemd cgroup,替换 pause 镜像为国内源 |
| K8s 组件 | 使用阿里云 yum 源安装 kubelet、kubeadm、kubectl |
| 镜像预拉 | 使用 registry.aliyuncs.com/google_containers 提前拉取所有镜像,避免网络问题 |
| 初始化 | 使用 kubeadm 配置文件初始化,指定国内镜像源和 Pod/Service 网段 |
| 网络插件 | 安装 Flannel,修改镜像为国内源,确保跨节点网络互通 |
| 排查 | 遇到问题先看 kubectl describe 和 journalctl -u kubelet |
后续学习建议
-
部署一个 Nginx 应用测试:
kubectl create deployment nginx --image=nginx:alpine --replicas=3 kubectl expose deployment nginx --port=80 --type=NodePort kubectl get svc nginx然后通过
http://<任意节点IP>:<NodePort>访问。 -
学习 Helm 包管理器,简化应用部署。
-
配置 Metrics Server,实现
kubectl top资源监控。 -
学习 Ingress,替代 NodePort 暴露服务。
如果本文对你有帮助,欢迎点赞、收藏、转发!有问题欢迎在评论区留言,我会第一时间回复。
更多推荐

所有评论(0)