CentOS7使用Kubeadm安装部署K8s(Kubernetes)最新稳定版本1.26.x

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

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

相关推荐
倔强的石头1062 小时前
飞牛OS部署Mtab:Docker搭建自托管书签导航并实现远程访问
运维·docker·容器
张忠琳2 小时前
【k3s】AutoK3s v0.9.3 —— Part 7 辅助模块超深度逐行分析
云原生·容器·kubernetes·k3s·autok3s
张忠琳12 小时前
【k3s】AutoK3s v0.9.3 Part 1 入口与 CLI 命令模块 — 超深度逐行分析之三
云原生·容器·kubernetes·k3s·autok3s
m0_5257247215 小时前
AIOps全链路智能运维架构揭秘
云原生·devops
xiaoxiangsiyan19 小时前
企业日常运维高频应用服务全解
运维·网络·云原生·容器·dns
AR_xsy19 小时前
docker--资源配额 配置
运维·docker·容器
国际云,接待19 小时前
Docker 容器突然退出、服务莫名重启:从 OOMKilled 到内存泄漏的生产排查手册
运维·docker·容器
阿里云云原生19 小时前
一次请求只做一次决策:阿里云 AI 网关智能路由如何替大模型应用选模型
云原生
橙-极纪元20 小时前
把docker的镜像文件从一台服务器中,迁移至另一台服务器
服务器·docker·容器