K8s v1.24.17 完整搭建文档(CentOS7 + containerd1.6.33 + Calico)

K8s v1.24.17 完整搭建文档(CentOS7 + containerd1.6.33 + Calico)

集群规划

  • k8s‑01(control‑plane):192.168.6.12
  • k8s‑02(node):192.168.6.13
  • k8s‑03(node):192.168.6.14>

说明:所有节点执行通用脚本;kubeadm init仅master执行;kubeadm join仅worker执行;规避aliyuncs、中科大失效镜像源;适配VMware‑NAT环境;全部脚本可直接复制。


一、全部节点通用前置配置(k8s‑01、k8s‑02、k8s‑03 全部执行)

复制代码
# 1、关闭防火墙、selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

# 2、关闭swap(k8s1.24强制要求)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

# 3、加载内核模块,开启ipvs/ipforward
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

# 4、配置网卡DNS,防止resolv.conf被DHCP覆盖(网卡名ens33,按需修改)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 添加下面三行
# DNS1=223.5.5.5
# DNS2=114.114.114.114
# PEERDNS=no

systemctl restart network
cat > /etc/resolv.conf <<EOF
nameserver 223.5.5.5
nameserver 114.114.114.114
EOF

# 5、设置主机名与hosts解析
hostnamectl set-hostname k8s-01   # k8s‑02机器改为k8s‑02;k8s‑03机器改为k8s‑03

cat >> /etc/hosts <<EOF
192.168.6.12 k8s-01
192.168.6.13 k8s-02
192.168.6.14 k8s-03
EOF

# 6、安装 containerd‑1.6.33
yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.33-3.1.el7.x86_64.rpm

# 生成默认配置文件
containerd config default > /etc/containerd/config.toml

# 修改containerd配置:设置cgroup驱动systemd,替换docker.io镜像加速器(删除失效ustc源)
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

# 修改registry mirror,替换为网易镜像
sed -i '/registry.mirrors/a\    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n      endpoint = ["https://hub-mirror.c.163.com"]' /etc/containerd/config.toml

# 启动 containerd
systemctl daemon-reload
systemctl enable --now containerd
systemctl status containerd

# 7、配置crictl,指定containerd sock,避免找dockershim报错
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

# 8、配置kubernetes yum源(公网源,不要用aliyuncs内网域名)
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

# yum全局优先ipv4
echo "ip_resolve=4" >> /etc/yum.conf

# 9、安装kubeadm kubelet kubectl 指定版本v1.24.17
yum install -y kubeadm-1.24.17-0 kubelet-1.24.17-0 kubectl-1.24.17-0
systemctl enable --now kubelet

# 10、创建cni目录,避免calico启动告警
mkdir -p /etc/cni/net.d
chmod 755 /etc/cni/net.d

全部节点执行完,检查验证:

复制代码
crictl info
free -h     # swap 必须为0

二、仅Master节点(k8s‑01)执行:kubeadm初始化控制平面

复制代码
# kubeadm init 指定apiserver广告地址、pod网段(calico默认pod‑cidr)
kubeadm init --apiserver-advertise-address=192.168.6.12 --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.24.17

# 执行成功后输出类似下面,保存好join命令,用于worker节点接入
# kubeadm join 192.168.6.12:6443 --token xxxxxx.xxxxxxxxxxxx \
#  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 配置kubectl权限
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 开启kubectl命令补全
yum install -y bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

# 部署calico网络插件(v3.24适配k8s1.24)
kubectl apply -f https://docs.projectcalico.org/v3.24/manifests/calico.yaml

# 等待calico pod启动,观察状态
kubectl get pods -n kube-system -w

init失败重置命令(出问题回滚用):

复制代码
kubeadm reset -f
rm -rf /etc/cni/net.d/*
systemctl restart containerd

三、Worker节点(k8s‑02、k8s‑03)执行:加入集群

master执行获取join命令:

复制代码
kubeadm token create --print-join-command

复制输出完整kubeadm join命令,分别在k8s‑02、k8s‑03 root执行

复制代码
# 示例(替换成你实际输出的,不要直接复制这条)
kubeadm join 192.168.6.12:6443 --token xxxxx.xxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxx

worker不要执行kubeadm init。

刚加入节点状态为NotReady,等待calico‑node DaemonSet调度启动后变为Ready。


四、集群状态校验(master执行)

复制代码
# 查看节点状态,三台全部Ready为正常
kubectl get nodes -o wide

# 查看系统组件全部pod状态,全部Running
kubectl get pods -n kube-system -o wide

# 查看service,确认apiserver service‑ip为10.96.0.1
kubectl get svc

# 集群信息
kubectl cluster-info
bash 复制代码
[root@k8s-01 ~]# # 查看节点状态,三台全部Ready为正常
[root@k8s-01 ~]# kubectl get nodes -o wide
¡息
kubectl cluster-infoNAME     STATUS   ROLES           AGE     VERSION    INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
k8s-01   Ready    control-plane   4h38m   v1.24.17   192.168.6.12   <none>        CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   containerd://1.6.33
k8s-02   Ready    <none>          48m     v1.24.17   192.168.6.13   <none>        CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   containerd://1.6.33
k8s-03   Ready    <none>          48m     v1.24.17   192.168.6.14   <none>        CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   containerd://1.6.33
[root@k8s-01 ~]# 
[root@k8s-01 ~]# # 查看系统组件全部pod状态,全部Running
[root@k8s-01 ~]# kubectl get pods -n kube-system -o wide
NAME                                     READY   STATUS    RESTARTS       AGE     IP               NODE     NOMINATED NODE   READINESS GATES
calico-kube-controllers-594d6fdf-xhzdm   1/1     Running   1 (177m ago)   3h27m   192.168.61.196   k8s-01   <none>           <none>
calico-node-47t2z                        1/1     Running   0              48m     192.168.6.14     k8s-03   <none>           <none>
calico-node-6xkxm                        1/1     Running   1 (177m ago)   3h27m   192.168.6.12     k8s-01   <none>           <none>
calico-node-z4dsn                        1/1     Running   0              48m     192.168.6.13     k8s-02   <none>           <none>
coredns-74586cf9b6-2fksr                 1/1     Running   1 (177m ago)   4h37m   192.168.61.198   k8s-01   <none>           <none>
coredns-74586cf9b6-jq8fb                 1/1     Running   1 (177m ago)   4h37m   192.168.61.197   k8s-01   <none>           <none>
etcd-k8s-01                              1/1     Running   4 (177m ago)   4h38m   192.168.6.12     k8s-01   <none>           <none>
kube-apiserver-k8s-01                    1/1     Running   4 (177m ago)   4h38m   192.168.6.12     k8s-01   <none>           <none>
kube-controller-manager-k8s-01           1/1     Running   1 (177m ago)   4h38m   192.168.6.12     k8s-01   <none>           <none>
kube-proxy-b4x7k                         1/1     Running   1 (177m ago)   4h37m   192.168.6.12     k8s-01   <none>           <none>
kube-proxy-nddjp                         1/1     Running   0              48m     192.168.6.14     k8s-03   <none>           <none>
kube-proxy-w9npt                         1/1     Running   0              48m     192.168.6.13     k8s-02   <none>           <none>
kube-scheduler-k8s-01                    1/1     Running   4 (177m ago)   4h38m   192.168.6.12     k8s-01   <none>           <none>
[root@k8s-01 ~]# 
[root@k8s-01 ~]# # 查看service,确认apiserver service‑ip为10.96.0.1
[root@k8s-01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   4h38m
[root@k8s-01 ~]# 
[root@k8s-01 ~]# # 集群信息
[root@k8s-01 ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.6.12:6443
CoreDNS is running at https://192.168.6.12:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

常见现象说明

  1. worker刚join出现日志 cni config load failed: no network config found in /etc/cni/net.d>

属于正常,calico‑node pod运行成功后自动写入cni配置,告警消失。

  1. ImagePullBackOff:VMware外网不稳定,优先使用离线镜像tar包导入 crictl load -i xxx.tar,设置 imagePullPolicy: IfNotPresent
  2. coredns容器无nslookup命令,新版镜像裁剪工具,属于正常现象。

五、集群测试yaml示例(不依赖外网镜像就本地load镜像)

test‑pod.yaml

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: ["sleep","3600"]
  restartPolicy: Never

kubectl apply -f test-pod.yaml
kubectl get pod test-pod
kubectl exec -it test-pod -- /bin/sh
kubectl delete -f test-pod.yaml

六、集群回滚清理全套(实验环境重置集群用)

master

复制代码
kubeadm reset -f
rm -rf $HOME/.kube/config
rm -rf /etc/cni/net.d/*
systemctl restart containerd

worker节点

复制代码
kubeadm reset -f
rm -rf /etc/cni/net.d/*
systemctl restart containerd

环境总结备忘

  • k8s版本:v1.24.17
  • runtime:containerd‑1.6.33
  • CNI:Calico v3.24
  • service网段:10.96.0.0/12
  • pod‑cidr:192.168.0.0/16
  • 适配:CentOS7 3.10内核,VMware NAT虚拟机;生产建议搭建Harbor私有镜像仓库,完全规避外网镜像拉取风险

重要提示:VMware NAT环境外网不稳定,不要依赖直接pull外网镜像,业务镜像优先离线tar导入或者内网harbor

相关推荐
TechLee31 分钟前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
FoldWinCard34 分钟前
K8s -- 控制器管理
云原生·容器·kubernetes
LINgZone236 分钟前
系统架构与分支规范
java·数据库·架构
AC赳赳老秦43 分钟前
企业级合规审计体系:用 OpenClaw 落地采集全链路留痕,自动生成合规审计报告
java·python·django·beautifulsoup·php·deepseek·openclaw
吃杠碰小鸡1 小时前
VsCode中开发Java项目
java·vscode
容器魔方2 小时前
云容器引擎 CCE 2026-Q2 优化升级:AI 推理负载、备份中心、Gateway API能力全新上线!
人工智能·云原生·容器·开源
无望__wsk2 小时前
k8s的pod管理
云原生·容器·kubernetes
悠然南风2 小时前
【云原生学习】Prometheus监控、GitLab与Jenkins部署实战
kubernetes·gitlab
菜鸟界的菜鸟2 小时前
k8s-Service详解(七)
云原生·容器·kubernetes