Kubernetes v1.24 高可用集群安装教程(基于 containerd + Flannel)
Kubernetes v1.24 高可用集群安装教程(基于 containerd + Flannel)
前言
Kubernetes v1.24 正式移除了对 Docker Shim 的支持,推荐使用containerd作为容器运行时。本文档将详细介绍如何在 CentOS 7 环境下,从零开始搭建一套完整的 Kubernetes v1.24 集群,包括内核升级、运行时配置、集群初始化、网络插件部署以及常用监控和扩展组件安装。
组件版本
- Kubernetes:v1.24.3(kubeadm/kubelet/kubectl)
- 容器运行时:containerd v1.6.4
- 网络插件:Flannel v0.18.0
- 其他可选组件:Metrics Server v3.8.2,Dashboard v2.5.1,Kong Ingress v2.3.1
整体安装流程图
第一步:环境准备
1.1 硬件与系统要求
| 角色 | CPU | 内存 | 硬盘 | 操作系统 |
|---|---|---|---|---|
| Master | 2核 | 2GB | 20GB | CentOS 7.x (内核≥3.10) |
| Worker | 2核 | 2GB | 20GB | CentOS 7.x (内核≥3.10) |
注意:推荐使用CentOS 7.9或更高版本,且所有节点时间必须同步。
1.2 升级 Linux 内核(CentOS 7 必须)
CentOS 7 默认内核 3.10 存在较多已知问题,建议升级到5.x主线版本。
# 导入 elrepo 公钥并安装源rpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org yuminstallhttps://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm-y# 安装最新主线内核yum--enablerepo=elrepo-kernelinstallkernel-ml-y# 查看已安装内核awk-F\''$1=="menuentry " {print i++ " : " $2}'/etc/grub2.cfg# 设置默认内核(通常第一个为最新内核)grub2-set-default0grub2-mkconfig-o/boot/grub2/grub.cfg# 重启生效reboot重启后验证内核版本:
uname-r# 输出示例:5.18.1-1.el7.elrepo.x86_64第二步:所有节点统一前置配置
创建一个自动化脚本k8s-prepare.sh,所有节点依次执行:
#!/bin/bash# 1. 关闭防火墙systemctl stop firewalld systemctl disable firewalld# 2. 关闭 SELinuxsetenforce0sed-i's/^SELINUX=enforcing$/SELINUX=disabled/'/etc/selinux/config# 3. 关闭 Swap(k8s 强制要求)swapoff-ased-ri's/.*swap.*/#&/'/etc/fstab# 4. 设置主机名(请根据角色修改,示例 master)# hostnamectl set-hostname master# 5. 添加 hosts 解析(可根据实际 IP 修改)cat>>/etc/hosts<<EOF 192.168.65.180 k8s-master 192.168.65.38 k8s-node1 192.168.65.195 k8s-node2 EOF# 6. 加载必要内核模块cat<<EOF|tee/etc/modules-load.d/k8s.confoverlay br_netfilter EOFmodprobe overlay modprobe br_netfilter# 7. 配置 sysctl 参数(持久化)cat<<EOF|tee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOFsysctl--system# 8. 安装 ntpdate 并同步时间yuminstallntpdate-yntpdate time.windows.comecho"前置配置完成,请重启节点以确保所有配置生效"执行:将脚本复制到所有节点,
chmod +x k8s-prepare.sh && ./k8s-prepare.sh,然后执行reboot。
第三步:安装 containerd 容器运行时
3.1 添加 Docker CE 源(containerd 包含其中)
yuminstall-yyum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.2 安装 containerd
yuminstallcontainerd-y3.3 配置 containerd
# 生成默认配置文件containerd config default>/etc/containerd/config.toml# 修改 sandbox 镜像为国内加速地址sed-i's#sandbox_image = ".*"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"#'/etc/containerd/config.toml# 启动并设置开机自启systemctl restart containerd systemctlenablecontainerd验证 containerd 状态:
crictl version# 或systemctl status containerd第四步:安装 kubeadm、kubelet、kubectl
4.1 添加 Kubernetes yum 源
cat<<EOF|tee/etc/yum.repos.d/kubernetes.repo[kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 EOF4.2 安装指定版本
yuminstall-ykubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.34.3 启动 kubelet(暂时会不断重启,等待 master init 后正常)
systemctlenablekubelet systemctl start kubelet第五步:初始化 Master 节点
仅在Master 节点执行。
5.1 预拉取所需镜像(可选,加快后续速度)
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers5.2 执行初始化
kubeadm init\--apiserver-advertise-address=192.168.65.180\# 改为你的 Master 内网 IP--kubernetes-version v1.24.3\--service-cidr=10.96.0.0/12\--pod-network-cidr=10.244.0.0/16\--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers参数说明
--pod-network-cidr=10.244.0.0/16与后面 Flannel 插件默认网段保持一致- 初始化成功后,会输出
kubeadm join命令,请务必复制保存,用于 Worker 节点加入集群。
5.3 配置 kubectl 访问凭证
mkdir-p$HOME/.kubecp-i/etc/kubernetes/admin.conf$HOME/.kube/configchown$(id-u):$(id-g)$HOME/.kube/config5.4 验证控制平面状态
kubectl get nodes# 此时 Master 状态应为 NotReady(因为还没有安装网络插件)第六步:安装 Pod 网络插件(Flannel)
网络插件必须部署,否则节点将保持NotReady状态。以下任选其一:
方案一:Flannel(推荐)
# 下载官方 yamlcurl-Ohttps://raw.githubusercontent.com/flannel-io/flannel/v0.18.0/Documentation/kube-flannel.yml# 若拉取 quay.io 镜像慢,可使用国内镜像站sed-i's#quay.io/coreos/flannel#quay-mirror.qiniu.com/coreos/flannel#g'kube-flannel.yml# 部署kubectl apply-fkube-flannel.yml方案二:Calico(性能更强)
kubectl apply-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.23.1/manifests/calico.yaml等待约 2 分钟,再次查看节点状态:
kubectl get nodes# 应显示 Ready查看所有 Pod 状态:
kubectl get pods-A第七步:Worker 节点加入集群
在每个 Worker 节点上执行Master 初始化输出末尾的kubeadm join命令,例如:
kubeadmjoin192.168.65.180:6443--token98wkpb.mz5qekplhqfbgfo3\--discovery-token-ca-cert-hash sha256:aa426a445ac902c74cf124520571168eb406b19c08ddfdc1bf90fe66918d3fdd如果忘记 token,可在 Master 上重新生成:
# 生成新 token(24小时有效)kubeadm token create --print-join-command在 Master 上验证节点加入:
kubectl get nodes输出示例:
NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 10m v1.24.3 k8s-node1 Ready <none> 2m v1.24.3 k8s-node2 Ready <none> 2m v1.24.3第八步:安装可选组件(增强监控与管理)
8.1 Metrics Server(HPA 核心组件)
# 添加 helm repo(或直接 apply)helm repoaddmetrics-server https://kubernetes-sigs.github.io/metrics-server/ helm upgrade--installmetrics-server metrics-server/metrics-server\--namespacekube-system\--setargs={--kubelet-insecure-tls}验证:
kubectltopnodes8.2 Kubernetes Dashboard
kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml创建访问账号:
cat <<EOF|kubectl apply-f-apiVersion:v1kind:ServiceAccountmetadata:name:admin-usernamespace:kubernetes-dashboard---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:admin-userroleRef:apiGroup:rbac.authorization.k8s.iokind:ClusterRolename:cluster-adminsubjects:-kind:ServiceAccountname:admin-usernamespace:kubernetes-dashboard EOF获取登录 Token:
kubectl-nkubernetes-dashboard create token admin-user访问方式:
kubectl proxy# 浏览器打开 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/8.3 Kong Ingress Controller
kubectl create namespace kong kubectl apply-fhttps://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/v2.3.1/deploy/single/all-in-one-dbless.yaml-nkong常见问题与解决方案
Q1:kubeadm init报错The kubelet is unhealthy due to cgroups
原因:kubelet 的 cgroup 驱动与 containerd 不一致。
解决:编辑/etc/sysconfig/kubelet添加:
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"然后重启 kubelet:
systemctl restart kubeletQ2:Flannel Pod 一直 CrashLoopBackOff
常见原因:内核版本过低或网络配置冲突。
解决:确保已升级到 5.x 内核,并检查是否与已有 overlay 网络冲突。
Q3:Worker 节点 join 时报token expired
解决:在 Master 上重新生成 token:
kubeadm token create --print-join-commandQ4:containerd 运行时拉取镜像慢
解决:修改/etc/containerd/config.toml中[plugins."io.containerd.grpc.v1.cri".registry.mirrors]添加国内镜像加速器(如阿里云、中科大)。
总结
本教程完整覆盖了 Kubernetes v1.24 在 CentOS 7 环境下的手动集群搭建过程,从内核升级到 containerd 配置,再到网络插件与常用附加组件。关键步骤总结如下:
- 内核升级(CentOS 7 必须)
- 系统基础配置(防火墙/SELinux/swap/内核参数)
- containerd 安装与配置
- kubeadm 安装与集群初始化
- 网络插件部署(Flannel 或 Calico)
- Node 加入与验证
- 可选扩展组件
通过以上步骤,你将获得一个生产可用的 K8s v1.24 集群。后续可根据需求部署 Ingress、存储插件、服务网格等。
快捷安装提示:你可以将步骤 2~4 的脚本整合为一个
all-in-one-prep.sh,一次性在所有节点上运行,但内核升级仍需单独重启。
参考资料
- Kubernetes 官方文档
- containerd 官方仓库
- Flannel GitHub
