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 |
[节点配置]
三、加载内核模块和配置内核参数
所有节点执行:
bash
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
配置网络参数:
bash
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
验证:
bash
sysctl net.ipv4.ip_forward
lsmod | egrep 'overlay|br_netfilter'
应返回:
net.ipv4.ip_forward = 1
四、安装基础软件
bash
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源
bash
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装containerd
bash
yum install -y containerd.io
生成 containerd 配置
bash
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改配置:
bash
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' \
/etc/containerd/config.toml
确认 CRI 插件没有被禁用:
bash
grep disabled_plugins /etc/containerd/config.toml
启动 containerd:
bash
systemctl daemon-reload
systemctl enable --now containerd
systemctl status containerd --no-pager
六、安装最新 kubeadm/kubelet/kubectl(所有节点)
配置 Kubernetes RPM 源,使用国内清华镜像加速下载:
bash
# 先删掉旧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
查看可用版本:
bash
# 清理锁
yum versionlock clear
# 查看版本列表
yum --disableexcludes=kubernetes \
--showduplicates list kubeadm kubelet kubectl
七、安装 Kubernetes 1.26.15(所有节点)
bash
yum install -y kubelet-1.26.15 kubeadm-1.26.15 kubectl-1.26.15 \
--disableexcludes=kubernetes
设置开机启动:
bash
systemctl enable kubelet
验证版本:
bash
kubeadm version
kubelet --version
kubectl version --client
锁定版本,避免自动升级:
bash
# 锁定版本,需要安装versionlock插件
yum versionlock add kubeadm kubelet kubectl
八、初始化控制平面(仅 master 节点执行)
创建 kubeadm 配置文件:
bash
mkdir -p /root/kubeadm
vi /root/kubeadm/kubeadm-config.yaml
内容如下, 使用国内镜像源:
XML
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不要与现有物理网络冲突。
查看需要拉取的镜像
bash
[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
执行初始化:
bash
kubeadm init \
--config=/root/kubeadm/kubeadm-config.yaml \
--upload-certs
初始化成功后,终端会输出类似下面的 Worker 加入命令:
bash
kubeadm join 192.168.5.10:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
需要保存下命令。
九、安装 Calico 网络插件
在控制平面执行:
bash
# 先下载
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 状态:
bash
[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 节点执行初始化时输出的命令,例如:
bash
kubeadm join 192.168.5.10:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
回到控制平面查看:
bash
[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:
bash
kubectl create deployment nginx --image=docker.m.daocloud.io/library/nginx:1.25
kubectl expose deployment nginx --port=80 --type=NodePort
查看服务:
bash
kubectl get pods -o wide
kubectl get svc nginx
访问服务:
bash
http://任意节点IP:NodePort
笔者浏览器访问显示如下:
