一、介绍
kubeadm方式可以轻松安装K8s集群。
二、环境准备
2.1 规划
| 主机名 |
IP |
系统版本 |
配置 |
K8S版本 |
CRI版本 |
| k8s231 |
192.168.10.231 |
rocky 9.6 |
2C4G |
1.36.0 |
2.2.3 |
| k8s232 |
192.168.10.232 |
rocky 9.6 |
2C4G |
1.36.0 |
2.2.3 |
| k8s233 |
192.168.10.233 |
rocky 9.6 |
2C4G |
1.36.0 |
2.2.3 |
2.2 基础设置
- 设置主机名 (分别在各节点执行)
1 2 3
| hostnamectl set-hostname k8s231 hostnamectl set-hostname k8s232 hostnamectl set-hostname k8s233
|
- 设置主机名解析
1 2 3 4 5
| cat >> /etc/hosts << EOF 192.168.10.231 k8s231 192.168.10.232 k8s232 192.168.10.233 k8s233 EOF
|
验证
1 2 3
| ping -c2 k8s231 ping -c2 k8s232 ping -c2 k8s233
|
- 关闭防火墙和
SELinux
1 2 3
| systemctl disable --now firewalld setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
|
验证
1 2
| getenforce systemctl status firewalld
|
关闭 Swap 分区
临时关闭
1
| swapoff -a && sysctl -w vm.swappiness=0
|
基于配置文件的关闭
1
| sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
|
验证
- 确保各个节点MAC地址或product_uuid唯一
1 2
| ip address show ens160 |grep ether |awk '{print $2}' cat /sys/class/dmi/id/product_uuid
|
2.3 内核模块与网络优化
- 加载基础内核模块
1 2 3 4 5 6 7
| cat <<EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF
modprobe overlay modprobe br_netfilter
|
- 加载 IPVS 模块 (用于 Service 高性能转发)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| cat <<EOF | tee /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack ip_tables ip_set xt_set ipt_set ipip EOF
for kernel_module in $(cat /etc/modules-load.d/ipvs.conf); do /sbin/modprobe $kernel_module done
|
- 设置 Sysctl 网络参数
1 2 3 4 5 6 7 8
| cat <<EOF | 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 vm.swappiness = 0 EOF
sysctl --system
|
三、依赖软件
新版本kubenetes底层是containerd。
3.1 安装 CRI
- 配置仓库,安装最新版
1 2
| dnf install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
|
- 显示所有的版本
1
| dnf list containerd.io --showduplicates
|
- 安装指定版本(2026年3月1日最新版)
1
| dnf install containerd.io-2.2.3 -y
|
安装最新版本
1
| dnf install containerd.io -y
|
- 配置
containerd
1 2
| mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml
|
- 开启 SystemdCgroup (必须,否则 Kubelet 无法启动)
1 2
| sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml grep SystemdCgroup /etc/containerd/config.toml
|
- 修改沙箱镜像源 (国内加速,否则 init 会卡死)(按需替换)
1
| sed -i 's|registry.k8s.io/pause:3.10.1|registry.aliyuncs.com/google_containers/pause:3.10.1|g' /etc/containerd/config.toml
|
验证
1
| grep registry.k8s.io /etc/containerd/config.toml
|
- 设置开机自启
1
| systemctl enable --now containerd
|
- 验证安装 成功
3.2 安装 kubeadm、kubectl、kubelet
- 配置
yum 源
1 2 3 4 5 6 7 8
| cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/repodata/repomd.xml.key EOF
|
- 查看所有版本
1
| dnf list kubelet kubeadm kubectl --showduplicates
|
- 安装指定版本(2026年5月5日最新版)
1 2
| KUBE_VERSION=1.36.0 dnf -y install kubeadm-${KUBE_VERSION} kubelet-${KUBE_VERSION} kubectl-${KUBE_VERSION}
|
安装最新版
1
| dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
|
- 验证
- 开机自启
1
| systemctl enable --now kubelet
|
3.3 安装 nerdctl
官方仓库
- 下载
1
| wget https://github.com/containerd/nerdctl/releases/download/v2.2.2/nerdctl-2.2.2-linux-amd64.tar.gz
|
加速下载
1
| wget https://g.bravexist.cn/https://github.com/containerd/nerdctl/releases/download/v2.2.2/nerdctl-2.2.2-linux-amd64.tar.gz
|
- 解压
1
| tar xf nerdctl-2.2.2-linux-amd64.tar.gz -C /usr/local/bin
|
- 命令补全
1
| source <(nerdctl completion bash)
|
- 设置别名
1 2 3
| vim ~/.bashrc alias docker='nerdctl -n k8s.io' source ~/.bashrc
|
3.4 获取镜像
- 获取镜像列表
1
| kubeadm config images list --kubernetes-version 1.36.0
|
国内地址的镜像
1
| kubeadm config images list --kubernetes-version 1.36.0 --image-repository registry.aliyuncs.com/google_containers
|
获取镜像,要注意命名空间 k8s.io,而不是默认的 default。
master需要全部镜像,
1 2 3 4 5 6 7
| registry.k8s.io/kube-apiserver:v1.36.0 registry.k8s.io/kube-controller-manager:v1.36.0 registry.k8s.io/kube-scheduler:v1.36.0 registry.k8s.io/kube-proxy:v1.36.0 registry.k8s.io/coredns/coredns:v1.14.2 registry.k8s.io/pause:3.10.2 registry.k8s.io/etcd:3.6.8-0
|
国内地址镜像
1 2 3 4 5 6 7
| docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.36.0 docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.36.0 docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.36.0 docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.36.0 docker pull registry.aliyuncs.com/google_containers/coredns/coredns:v1.14.2 docker pull registry.aliyuncs.com/google_containers/pause:3.10.2 docker pull registry.aliyuncs.com/google_containers/etcd:3.6.8-0
|
获取 flannel 镜像,获取指定版本的 yaml 文件。(2026年5月5日最新版)
官网
1
| wget https://github.com/flannel-io/flannel/releases/download/v0.28.4/kube-flannel.yml
|
加速下载
1
| wget https://g.bravexist.cn/https://github.com/flannel-io/flannel/releases/download/v0.28.4/kube-flannel.yml
|
筛选镜像
1
| grep image kube-flannel.yml
|
拉取镜像
1 2
| docker pull ghcr.io/flannel-io/flannel:v0.28.4 docker pull ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel1
|
获取 calico 镜像,获取指定版本的 yaml 文件。(2026年3月1日最新版)
官网
1 2
| wget https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/tigera-operator.yaml wget https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/custom-resources.yaml
|
加速下载
1 2
| wget https://g.bravexist.cn/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/tigera-operator.yaml wget https://g.bravexist.cn/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/custom-resources.yaml
|
修改 custom-resources.yaml 的 cidr,确保它与执行 kubeadm init 时定义的 --pod-network-cidr 完全一致。
筛选镜像
1
| grep image tigera-operator.yaml
|
四、正式安装
4.1 初始化配置文件
- 生成配置文件
1
| kubeadm config print init-defaults > kubeadm.yml
|
- 修改关键配置项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| vim kubeadm.yml advertiseAddress: 192.168.10.231 bindPort: 6443
name: k8s231
imageRepository: registry.aliyuncs.com/google_containers kubernetesVersion: 1.36.0 serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16
--- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd
|
advertiseAddress
name 主节点的名称
imageRepository,改为阿里云镜像仓库
podSubnet ,追加在 serviceSubnet 的下一行
apiVersion,追加这一部分内容,包括 ---
4.2 启动
- 启动
1
| kubeadm init --config=kubeadm.yml
|
- 添加kubectl的自动补全功能
1
| echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
|
- 让当前用户可以直接使用 kubectl 管理整个 Kubernetes 集群
1 2 3 4
| mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf
|
- 加入集群
1 2
| kubeadm join 192.168.10.231:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:2f55dde305d9df5c21b8d560adffd34dc69810d64788460d4fadb40517d4f561
|
重新获取加入集群的命令
1 2
| token=$(kubeadm token generate) kubeadm token create $token --print-join-command --ttl=0
|
或
1
| kubeadm token create --print-join-command
|
4.3 安装 flannel 插件(二选一)
1
| kubectl apply -f kube-flannel.yml
|
4.4 安装 calico 插件(二选一)
1 2
| kubectl apply -f tigera-operator.yaml kubectl apply -f custom-resources.yaml
|
五、验证
六、文档资料