一、介绍

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. 设置主机名 (分别在各节点执行)
1
2
3
hostnamectl set-hostname k8s231
hostnamectl set-hostname k8s232
hostnamectl set-hostname k8s233
  1. 设置主机名解析
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
  1. 关闭防火墙和 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
  1. 关闭 Swap 分区

    临时关闭

1
swapoff -a && sysctl -w vm.swappiness=0

​ 基于配置文件的关闭

1
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

​ 验证

1
free -h
  1. 确保各个节点MAC地址或product_uuid唯一
1
2
ip address show ens160 |grep ether |awk '{print $2}'
cat /sys/class/dmi/id/product_uuid

2.3 内核模块与网络优化

  1. 加载基础内核模块
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
  1. 加载 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
  1. 设置 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. 配置仓库,安装最新版
1
2
dnf install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 显示所有的版本
1
dnf list containerd.io --showduplicates
  1. 安装指定版本(2026年3月1日最新版)
1
dnf install containerd.io-2.2.3 -y

​ 安装最新版本

1
dnf install containerd.io -y
  1. 配置 containerd
1
2
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
  1. 开启 SystemdCgroup (必须,否则 Kubelet 无法启动)
1
2
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
grep SystemdCgroup /etc/containerd/config.toml
  1. 修改沙箱镜像源 (国内加速,否则 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. 设置开机自启
1
systemctl enable --now containerd
  1. 验证安装 成功
1
ctr version

3.2 安装 kubeadmkubectlkubelet

  1. 配置 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. 查看所有版本
1
dnf list kubelet kubeadm kubectl --showduplicates
  1. 安装指定版本(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. 验证
1
kubelet --version
  1. 开机自启
1
systemctl enable --now kubelet

3.3 安装 nerdctl

官方仓库

  1. 下载
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. 解压
1
tar xf nerdctl-2.2.2-linux-amd64.tar.gz -C /usr/local/bin
  1. 命令补全
1
source <(nerdctl completion bash)
  1. 设置别名
1
2
3
vim ~/.bashrc
alias docker='nerdctl -n k8s.io'
source ~/.bashrc

3.4 获取镜像

  1. 获取镜像列表
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
  1. 获取镜像,要注意命名空间 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
  1. 获取 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
  1. 获取 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.yamlcidr,确保它与执行 kubeadm init 时定义的 --pod-network-cidr 完全一致。

1
cidr: 10.244.0.0/16

​ 筛选镜像

1
grep image tigera-operator.yaml

四、正式安装

4.1 初始化配置文件

  1. 生成配置文件
1
kubeadm config print init-defaults > kubeadm.yml
  1. 修改关键配置项
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. 启动
1
kubeadm init --config=kubeadm.yml
  1. 添加kubectl的自动补全功能
1
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
  1. 让当前用户可以直接使用 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. 加入集群
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

五、验证

1
kubectl get node

六、文档资料