VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(四)
本文详细介绍了在RockyLinux系统上部署Kubernetes v1.29.2集群的完整流程,采用一主(Master)二从(Worker)架构,使用Docker+CRI-Dockerd+kubeadm方案,并通过Calico网络插件实现集群网络功能。主要内容包括:网络与主机规划(设定IP地址和主机名)、基础环境准备(主机名配置、IP映射同步、ipvs安装等)、Docker安装及配置(指定版本安装、镜像源设置、daemon.json配置)。文档支持离线包安装方式,并提供了详细的命令行操作步骤和验证方法,适合生产环境
🎯 Kubernetes v1.29.2 集群部署指南
一主二从 · Docker + CRI-Dockerd + kubeadm · Calico BGP网络
📋 部署架构
1 Master + 2 Worker Nodes
k8s-master01(192.168.66.11)
⚙️ k8s-node01(192.168.66.12)
🖥️ k8s-node02(192.168.66.13)
🔧 技术栈
- 容器运行时: Docker 28.4.0 + CRI-Dockerd 0.3.9
- 集群管理: kubeadm 1.29.2 | kubelet 1.29.2 | kubectl 1.29.2
- 网络插件: Calico 3.26.3 (BGP模式)
- Pod网络: 10.244.0.0/16 | Service CIDR: 10.10.0.0/12
✅ 部署特性
🔹 离线安装 (生产推荐)
🔹 高可用架构
🔹 BGP网络模式
🔹 完整集群就绪
🏗️ 集群状态
3节点 Ready | Calico Pod正常 | 网络互通
部署时间:2025年9月
Kubernetes版本:v1.29.2
目录:
VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(一)
VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(二)
VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(三)
VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(四)
一、网络与主机规划
1.1 网络拓扑
根据你自己的网络规划ip
角色 | IP 地址 | 主机名 | 备注 |
---|---|---|---|
Master | 192.168.66.11 | k8s-master01 (m1) | 集群控制平面 |
Worker 1 | 192.168.66.12 | k8s-node01 (n1) | 集群工作节点 |
Worker 2 | 192.168.66.13 | k8s-node02 (n2) | 集群工作节点 |
Harbor(可选) | 192.168.66.14 | harbor | 私有镜像仓库(后面要用) |
二、基础环境准备(所有节点执行)
1.修改主机名
Master 节点:
# 修改主机名 k8s-master01
hostnamectl set-hostname k8s-master01
Node1 节点:
# 修改主机名 k8s-node01
hostnamectl set-hostname k8s-node01
Node2 节点:
# 修改主机名 k8s-node02
hostnamectl set-hostname k8s-node02
2 配置主机名与 IP 映射(所有节点保持一致)
在master打开etc hosts文件 把主机名和地址对应的映射一下
仅在 Master 节点编辑 /etc/hosts,然后同步到其他节点:
cat >> /etc/hosts <<EOF
192.168.66.11 k8s-master01 m1
192.168.66.12 k8s-node01 n1
192.168.66.13 k8s-node02 n2
192.168.66.13 harbor
EOF
3. 将 hosts 文件同步到 Node1 和 Node2(在master机子操作)
scp /etc/hosts root@k8s-node01:/etc/hosts
scp /etc/hosts root@k8s-node02:/etc/hosts
4.验证主机名解析:(三台互ping,测试生效)
ping m1
ping n1
ping n2
5.安装并配置 ipvs(所有节点)
yum install -y ipvsadm
6. 开启路由转发(所有节点)
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
7.加载 bridge(所有节点)
yum install -y epel-release
yum install -y bridge-utilsmodprobe br_netfilter
echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf
echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf
echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf
sysctl -p
三、安装 Docker(所有节点)
本文档采用 Docker 作为容器运行时,并通过 CRI-Dockerd 适配 Kubernetes。
1.安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2
2.配置阿里云 Docker CE 镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 替换默认下载地址为阿里云
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
3.验证是否切换成功:可以看到到docker源已经更换为阿里云
cat /etc/yum.repos.d/docker-ce.repo可以查看到docker源已经更换为阿里云的
cat /etc/yum.repos.d/docker-ce.repo
4.查看可用 Docker 版本
yum list docker-ce --showduplicates | sort -r
5.安装docker指定版本25.0.3,或者安装最新版本,我这边安装最新版本
安装指定版本:yum install docker-ce-3:25.0.3-1.el9
# yum install docker-ce-3:25.0.3-1.el9
安装最新版本:yum install docker-ce
yum install docker-ce
Installed: 2025-09-23安装的最新版container-selinux-4:2.237.0-1.el9_6.noarch containerd.io-1.7.27-3.1.el9.x86_64 docker-buildx-plugin-0.28.0-1.el9.x86_64 docker-ce-3:28.4.0-1.el9.x86_64 docker-ce-cli-1:28.4.0-1.el9.x86_64 docker-ce-rootless-extras-28.4.0-1.el9.x86_64 docker-compose-plugin-2.39.4-1.el9.x86_64 fuse-common-3.10.2-9.el9.x86_64 fuse-overlayfs-1.14-1.el9.x86_64 fuse3-3.10.2-9.el9.x86_64 fuse3-libs-3.10.2-9.el9.x86_64 libslirp-4.4.0-8.el9.x86_64 slirp4netns-1.3.2-1.el9.x86_64 tar-2:1.34-7.el9.x86_64
6.验证安装结果:
docker version
7.配置 Docker Daemon.json
这俩根据需要调整,其他一般不动
“insecure-registries”: [“harbor.xxx.com”],
“registry-mirrors”: [“https://docker.xuanyuan.me”]
cat > /etc/docker/daemon.json <<EOF
{"data-root": "/data/docker","exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "100"},"insecure-registries": ["harbor.xxx.com"],"registry-mirrors": ["https://docker.xuanyuan.me"]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
8.启动 Docker 并设置开机自启
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
9.重启服务器(可选,建议重启以应用所有配置)
reboot
四、安装 CRI-Dockerd(所有节点)
由于 Kubernetes 默认不再直接支持 Docker,我们需要通过 CRI-Dockerd 作为适配层。
1.下载并解压 CRI-Dockerd
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz
tar -xf cri-dockerd-0.3.9.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd
2.配置 cri-docker 服务
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
3.创建 CRI-Docker Socket 套接字
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
4.启动 CRI-Docker 服务
systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
五、安装 Kubernetes 组件(所有节点)
本文档采用 离线安装方式(推荐),若采用在线方式请参考注释部分。
1.(可选)配置 Kubernetes YUM 源(在线方式,未执行)
#添加 kubeadm yum 源
#cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
2.(可选)安装 Kubernetes(在线方式,未执行)
这个我看视频不是这行这个,而是改为离线包1.29.2版本kubernetes-1.29.2-150500.1.1.tar.gz
#安装 kubeadm 1.29 版本
#yum install -y kubelet-1.29.0 kubectl-1.29.0 kubeadm-1.29.0
#systemctl enable kubelet.service
3.上传并安装离线 Kubernetes 包(所有节点)
上传 kubernetes-1.29.2-150500.1.1.tar.gz 到所有节点
4.解压缩
tar -zxvf kubernetes-1.29.2-150500.1.1.tar.gz
5.进入安装包文件夹
cd kubernetes-1.29.2-150500.1.1
6.安装kubernetes
yum install -y *
#Installed: 安装完成的组件版本conntrack-tools-1.4.7-2.el9.x86_64 cri-tools-1.29.0-150500.1.1.x86_64 kubeadm-1.29.2-150500.1.1.x86_64 kubectl-1.29.2-150500.1.1.x86_64 kubelet-1.29.2-150500.1.1.x86_64 kubernetes-cni-1.3.0-150500.1.1.x86_64 libnetfilter_cthelper-1.0.0-22.el9.x86_64 libnetfilter_cttimeout-1.0.0-19.el9.x86_64 libnetfilter_queue-1.0.5-1.el9.x86_64 socat-1.7.4.1-5.el9.x86_64
Complete!
#验证安装组件:
#kubelet-1.29.2
#kubeadm-1.29.2
#kubectl-1.29.2
#cri-tools 等
7.设置 kubelet 开机自启:(所有节点都执行)
systemctl enable kubelet.service
六、初始化 Kubernetes Master 节点(仅在 Master 执行)
1.使用 kubeadm 初始化集群(CRI-Docker 模式)
这边用的是cri-docker运行时,所以需要加–cri-socket unix:///var/run/cri-dockerd.sock
kubeadm init --apiserver-advertise-address=192.168.66.11 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.29.2 --service-cidr=10.10.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all --cri-socket unix:///var/run/cri-dockerd.sock
2.配置 kubectl 访问权限,主节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 查看k8s集群节点状态,初始为 NotReady,待网络插件部署后正常
kubectl get nodes
七、Worker 节点加入集群(在 Node1 / Node2 执行)
1.获取 Join 命令(在 Master 执行,若 Token 过期则重新生成)(可选)
kubeadm token create --print-join-command
输出类似如下,复制并在 Node 节点执行:
worker 加入 因为我们是cri-docker,所以要加–cri-socket unix:///var/run/cri-dockerd.sock
注意:请将 IP、Token、Hash 替换为 master 节点生成的最新信息。
kubeadm join 192.168.66.11:6443 --token 3p3ztx.t55gimgt2sjzzev8 --discovery-token-ca-cert-hash sha256:50f8956145d7fe362748bca6a5a04f3d4dc73f2bbe5bfd3235575fba53d71b9a --cri-socket unix:///var/run/cri-dockerd.sock
2.再次查看节点状态(在 Master 执行)
此时节点应该仍处于 NotReady状态,需部署网络插件后才会变为 Ready。
kubectl get nodes
八、部署 Calico 网络插件,我用离线方式部署(推荐 BGP 模式,所有节点)
本文档介绍采用 离线方式部署 Calico v3.26.3,并已预先修改好配置(禁用 IPIP,启用 BGP,Pod CIDR 为 10.244.0.0/16)。
在线方式,不执行
#这个在线安装的不执行
#https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-more-than-50-nodes#curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/calico-typha.yaml -o calico.yaml
1.上传并解压 Calico 离线包(Master 操作)
我们离线操作 文件名是calico.zip,上面的文件是原版需要手动改,离线版本这个是改好的配置文件calico-typha.yaml
上传calico.zip到master节点
zip解压后有calico-images.tar.gz镜像包,继续解压
# 上传 calico.zip 到 Master,然后解压
unzip calico.zip
cd calico
tar -zxvf calico-images.tar.gz
2.加载镜像到本地 Docker:
cd calico-images
docker load -i calico-cni-v3.26.3.tar
docker load -i calico-kube-controllers-v3.26.3.tar
docker load -i calico-node-v3.26.3.tar
docker load -i calico-typha-v3.26.3.tar
3.将镜像包同步到 所有Node 节点
在master操作
cd /root/calico
scp -r calico-images root@n1:/root
scp -r calico-images root@n2:/root
4.加载镜像到本地 Docker:
在node操作
cd calico-images
docker load -i calico-cni-v3.26.3.tar
docker load -i calico-kube-controllers-v3.26.3.tar
docker load -i calico-node-v3.26.3.tar
docker load -i calico-typha-v3.26.3.tar
5.部署 Calico 网络插件(Master 执行)
master节点 执行 calico-typha.yaml 把这个部署文件应用在当前集群上,这个文件已经改过了,禁用ipip
✅ 该 YAML 已预先修改:
禁用 IPIP(CALICO_IPV4POOL_IPIP=Off)
指定 Pod CIDR(CALICO_IPV4POOL_CIDR=10.244.0.0/16)
# 修改为 BGP 模式
# Enable IPIP
- name: CALICO_IPV4POOL_IPIPvalue: "Always" #改成Off
#CALICO_IPV4POOL_CIDR 指定为 pod 地址
- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"
kubectl apply -f calico-typha.yaml
6.查看节点状态(应全部为 Ready)
稍等会,kubectl get node 就是节点就是就绪状态了
kubectl get nodes
7.看所有 Pod 是否正常(特别是 Calico 相关 Pod):
获取所有pod 可以看到calico在集群中已经正常部署
kubectl get pod -A
九、到此k8s v1.29.2 集群搭建完成 ✅,赶紧在三个节点拍快照
🎉 恭喜!您的 Kubernetes 1.29.2 一主两从集群 已搭建完成,包含:
1 个 Master 节点
2 个 Worker 节点
Docker 容器运行时 + CRI-Dockerd 适配
Calico 网络插件(BGP 模式,Pod 网段 10.244.0.0/16)
所有节点状态为 Ready
这部分不执行作为资料参考start
🔒 可选优化(仅供参考,未实际执行)
固定网卡自动检测(Calico IP 自动发现)
修改 kube-proxy 为 ipvs 模式
固定网卡(可选)
目标 IP 或域名可达
- name: calico-nodeimage: registry.geoway.com/calico/node:v3.19.1env:# Auto-detect the BGP IP address.- name: IPvalue: "autodetect"- name: IP_AUTODETECTION_METHODvalue: "can-reach=www.google.com"
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=can-reach=www.google.com
匹配目标网卡
- name: calico-nodeimage: registry.geoway.com/calico/node:v3.19.1env:# Auto-detect the BGP IP address.- name: IPvalue: "autodetect"- name: IP_AUTODETECTION_METHODvalue: "interface=eth.*"
排除匹配网卡
- name: calico-nodeimage: registry.geoway.com/calico/node:v3.19.1env:# Auto-detect the BGP IP address.- name: IPvalue: "autodetect"- name: IP_AUTODETECTION_METHODvalue: "skip-interface=eth.*"
CIDR
- name: calico-nodeimage: registry.geoway.com/calico/node:v3.19.1env:# Auto-detect the BGP IP address.- name: IPvalue: "autodetect"- name: IP_AUTODETECTION_METHODvalue: "cidr=192.168.200.0/24,172.15.0.0/24"
修改kube-proxy 模式为 ipvs
kubectl edit configmap kube-proxy -n kube-system
mode: ipvskubectl delete pod -n kube-system -l k8s-app=kube-proxy