CentOS7 最高稳妥支持 K8s 1.26 系列(v1.26.15

原因:CentOS7 内核默认 3.10、systemd 版本偏低 + containerd 新版本对老 systemd 兼容差;1.27 + 开始大幅提高内核 / 依赖门槛,不建议在 CentOS7 上尝试。

一、安装前置要求(所有节点)

  • 控制平面:≥2 核 CPU、≥4G 内存、20G 磁盘

  • Worker 节点:≥1 核 CPU、≥2G 内存
  • 所有节点互通、关闭防火墙 / SELinux、禁用 Swap、主机名唯一、节点时间保持同步

二、集群节点规划

软件环境
操作系统

CentOS Linux release 7.9.2009 x86_64

k8s v1.26.15
kubeadm v1.26.15
containerd 1.6.33
节点配置
主机 角色 IP CPU 内存
node1 控制平面

192.168.5.10

16C 40G
node2 Worker

192.168.5.11

16C 40G
node3 Worker

192.168.5.12

16C 40G

三、加载内核模块和配置内核参数

所有节点执行:

cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

配置网络参数:

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system

验证:

sysctl net.ipv4.ip_forward
lsmod | egrep 'overlay|br_netfilter'

应返回:

net.ipv4.ip_forward = 1

四、安装基础软件

yum install -y epel-release conntrack-tools socat ebtables ethtool ipset ipvsadm \
  yum-utils device-mapper-persistent-data lvm2 curl wget vim net-tools

五、安装 containerd 容器运行时(所有节点)

安装docker rpm源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装containerd

yum install -y containerd.io

生成 containerd 配置

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

修改配置:

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' \
  /etc/containerd/config.toml

确认 CRI 插件没有被禁用:

grep disabled_plugins /etc/containerd/config.toml

启动 containerd:

systemctl daemon-reload
systemctl enable --now containerd
systemctl status containerd --no-pager

六、安装最新 kubeadm/kubelet/kubectl(所有节点)

配置 Kubernetes RPM 源,使用国内清华镜像加速下载:

# 先删掉旧kubernetes.repo
rm -f /etc/yum.repos.d/kubernetes.repo

# 写入【v1.26独立源】清华镜像
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.26/rpm/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.26/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

# 清缓存重建
yum clean all && yum makecache

查看可用版本:

# 清理锁
yum versionlock clear
# 查看版本列表
yum --disableexcludes=kubernetes \
  --showduplicates list kubeadm kubelet kubectl

七、安装 Kubernetes 1.26.15(所有节点)

yum install -y kubelet-1.26.15 kubeadm-1.26.15 kubectl-1.26.15 \
  --disableexcludes=kubernetes

设置开机启动:

systemctl enable kubelet

验证版本:

kubeadm version
kubelet --version
kubectl version --client

锁定版本,避免自动升级:

# 锁定版本,需要安装versionlock插件
yum versionlock add kubeadm kubelet kubectl

八、初始化控制平面(仅 master 节点执行)

创建 kubeadm 配置文件:

mkdir -p /root/kubeadm
vi /root/kubeadm/kubeadm-config.yaml

内容如下, 使用国内镜像源:

apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.5.10
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock
  kubeletExtraArgs:
    cgroup-driver: systemd
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.26.15
imageRepository: registry.aliyuncs.com/google_containers
clusterName: kubernetes
networking:
  podSubnet: 192.168.0.0/16
  serviceSubnet: 10.96.0.0/12

注意:

  • advertiseAddress 改成控制平面的实际 IP。
  • podSubnet 必须与网络插件规划一致。
  • 192.168.0.0/16 不要与现有物理网络冲突。

查看需要拉取的镜像

[root@node1 ~]# kubeadm config images list \
>   --config=/root/kubeadm/kubeadm-config.yaml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.15
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.15
registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.15
registry.aliyuncs.com/google_containers/kube-proxy:v1.26.15
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.10-0
registry.aliyuncs.com/google_containers/coredns:v1.9.3

执行初始化:

kubeadm init \
  --config=/root/kubeadm/kubeadm-config.yaml \
  --upload-certs

初始化成功后,终端会输出类似下面的 Worker 加入命令:

kubeadm join 192.168.5.10:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

需要保存下命令。

九、安装 Calico 网络插件

在控制平面执行:

# 先下载
wget   https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml
# 修改为国内镜像地址
sed -i 's#docker.io/calico#docker.m.daocloud.io/calico#g' /root/calico.yaml
# 创建calico
kubectl apply -f calico.yaml

查看 Calico 状态:

[root@node1 ~]# kubectl get pods -n kube-system -w
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-6cc8c4958b-j7xp8   1/1     Running   0          4m51s
calico-node-ffvlp                          1/1     Running   0          4m51s
coredns-5bbd96d687-7jnfh                   1/1     Running   0          37m
coredns-5bbd96d687-f8pxb                   1/1     Running   0          37m
etcd-node1                                 1/1     Running   0          37m
kube-apiserver-node1                       1/1     Running   0          37m
kube-controller-manager-node1              1/1     Running   0          37m
kube-proxy-47qfn                           1/1     Running   0          37m
kube-scheduler-node1                       1/1     Running   0          37m

十、Worker 节点加入集群

在每个 Worker 节点执行初始化时输出的命令,例如:

kubeadm join 192.168.5.10:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> 

回到控制平面查看:

[root@node1 ~]# kubectl get nodes -w
NAME    STATUS     ROLES           AGE   VERSION
node1   Ready      control-plane   39m   v1.26.15
node2   NotReady   <none>          25s   v1.26.15
node3   NotReady   <none>          22s   v1.26.15
node2   NotReady   <none>          51s   v1.26.15
node3   NotReady   <none>          51s   v1.26.15
node3   NotReady   <none>          82s   v1.26.15
node2   NotReady   <none>          2m23s   v1.26.15
node3   Ready      <none>          2m44s   v1.26.15
node3   Ready      <none>          2m44s   v1.26.15
node3   Ready      <none>          2m48s   v1.26.15
node2   NotReady   <none>          2m53s   v1.26.15

十一、测试集群

创建测试 Deployment:

kubectl create deployment nginx --image=docker.m.daocloud.io/library/nginx:1.25
kubectl expose deployment nginx --port=80 --type=NodePort

查看服务:

kubectl get pods -o wide
kubectl get svc nginx

访问服务:

http://任意节点IP:NodePort

笔者浏览器访问显示如下:

更多推荐