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'.
常见现象说明
- worker刚join出现日志
cni config load failed: no network config found in /etc/cni/net.d>
属于正常,calico‑node pod运行成功后自动写入cni配置,告警消失。
- ImagePullBackOff:VMware外网不稳定,优先使用离线镜像tar包导入
crictl load -i xxx.tar,设置imagePullPolicy: IfNotPresent。 - 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。