当前位置: 首页 > news >正文

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 地址主机名备注
Master192.168.66.11k8s-master01 (m1)集群控制平面
Worker 1192.168.66.12k8s-node01 (n1)集群工作节点
Worker 2192.168.66.13k8s-node02 (n2)集群工作节点
Harbor(可选)192.168.66.14harbor私有镜像仓库(后面要用)

在这里插入图片描述

二、基础环境准备(所有节点执行)

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

这部分不执行作为资料参考end

http://www.dtcms.com/a/409829.html

相关文章:

  • 深入理解 Docker:从入门到实践
  • 实战排查:Java 解析 Excel 大型 导致内存溢出问题的完整解决过程
  • 【实录】使用 Verdaccio 从零搭建私有 npm 仓库(含完整步骤及避坑指南)
  • 物联网人体红外检测系统详解
  • 关于Unix Domain Socket的使用入门
  • 机器视觉系统中工业相机的常见类型及其特点、应用
  • RTT操作系统(4)
  • 基于卷积神经网络的 CIFAR-10 图像分类实验报告
  • 微服务项目->在线oj系统(Java-Spring)----[前端]
  • 做网站撘框架小米手机如何做游戏视频网站
  • 如何建自己网站做淘宝客黄骅港吧
  • 交叉口内CAV调度:轨迹优化与目标速度规划,助力智能交通无缝运行!
  • Navicat 技术指引 | KingbaseES 专用 AI 助手
  • 如何优化Android app耗电量
  • 面试复习题---Flutter 资深专家
  • 在 C# 中将邮件转换为 PDF | MSG 转 PDF | EML 转 PDF
  • 【LangChain4j+Redis】会话记忆功能实现
  • Android Handler的runWithScissors方法
  • 180课时吃透Go语言游戏后端开发3:Go语言中其他常用的数据类型
  • 在 Android 11 上实现 WiFi 热点并发支持(同时开启 STA + AP 模式)
  • 济南高新区网站建设wordpress举报插件
  • html 占位符
  • GPT-5 Codex正式上线 Azure AI Foundry(国际版)
  • C++设计模式之结构型模式:享元模式(Flyweight)
  • STM32 智能垃圾桶项目笔记(一):超声波模块(HC-SR04)原理与驱动实现
  • 全文 -- Vortex: Extending the RISC-V ISA for GPGPU and 3D-Graphics Research
  • 设计网站推荐理由公司网站备案电话
  • 事件驱动与CDS:基于FHIR R5 Subscriptions与Bulk Data的再考察(下)
  • Tigshop开源商城系统 Java v5.2.2 / PHP v5.1.6版本正式发布(ES搜索上新)
  • 仙游县住房和城乡建设局网站1元涨1000粉丝网站