在RockyLinux 9.6上部署Kubernetes 1.29集群:基于Docker与Calico BGP模式的全流程实践
一、准备工作
在vmware中安装,创建三台rockylinux9.6服务器
| 主机 | ip | 配置 |
| k8s-master01 | 192.168.175.11 | 4核,4g内存,40g硬盘 |
| k8s-node01 | 192.168.175.12 | 2核,2g内存,40g硬盘 |
| k8s-node02 | 192.168.175.13 | 2核,2g内存,40g硬盘 |
二、环境配置
3台虚拟机设置静态ip,关闭firewalld,开启iptables,关闭SELinux,更换rockylinux9.6的yum源(这里看我其他文章)
配置ikuai(软路由)
目的:模拟真实的企业级网络架构

选择32位的,32位的内存要求>=1G就可以安装了,64位的内存要求>=4G才可以安装,实验环境32位够了,生成环境选64位
创建ikuai的虚拟机(除了图示其余都是默认)

版本的选择会导致虚拟机使用的虚拟硬件不一样,选其他,其他,可以识别更多复杂的一些硬件



4台虚拟机(3个lirockynux9.6,一个ikuai)都是一个仅主机模式,一个nat模式,这里ikuai设置仅主机模式,后续再添加一个nat模式

这里一定要默认为IDE,32的ikuai路由器只能识别IDE,其他几种硬盘格式它不能识别

点击开启ikuai虚拟机,选1.将系统安装到硬盘1 sda,然后设置LAN/WAN地址,设置LAN1地址:192.168.175.200/255.255.255.0,浏览器输入192.168.175.200进入ikuai页面

进入ikuai页面后,设置wan1,将另外一张网卡进行绑定,

lan1和wan1都变了绿就是可以了,这样ikuai就可以当另外的几台rockylinux虚拟机提供网络的访问能力,到这里配置ikuai就完成了
修改三台rockylinux虚拟机的网络设置,让改三台rockylinux虚拟机通过ikuai拥有上网功能
三台rockylinux虚拟机这里都是一样的设置,ens160(第一块网卡)设置192.168.175.200的网关
ens192(第二块网卡)关闭自动连接


关闭swap分区(所有节点执行)
对于Kubernetes,主流做法是强烈建议并默认要求关闭Swap,主要是为了保证资源调度、性能预测和集群稳定性
swapoff -a --临时关闭
sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab --永久关闭

永久关闭的逻辑,就是把分区挂载选项给注释掉,这样开机自启的时候,就不会挂载

修改主机名
kubeadm在装kubernetes集群的时候,会把当前的主机名抓取作为节点名称,默认是localhost,但是所有机器都是localhost,这里多台机器要全部修改主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
配置/etc/hosts文件,为即将搭建的Kubernetes集群进行静态的主机名解析。它是确保集群中所有节点(一个Master和两个Node)能够通过主机名相互识别和通信的基础网络配置。(三台机器全要设置)
192.168.175.11 k8s-master01 m1 :让系统知道:IP地址 192.168.175.11 对应主节点,可以通过正式主机名 k8s-master01 或您自定义的简短别名 m1 来访问它。

安装ipvs
“安装IPVS”这个操作,目的是让你在部署集群后,可以将Kubernetes服务负载均衡的工作模式从默认的iptables模式切换为IPVS模式,但这完全是一个可选的高级配置。
yum install -y ipvsadm
开启每个节点的路由转发
永久开启Linux系统的IP转发功能,这是Kubernetes集群和Docker等容器网络能够正常工作的基础前提,/etc/sysctl.conf 文件在系统启动时会自动加载,所以这里是为IP转发做永久性设置
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p -刷新生效
三、安装docker
加载 bridge(在安装docker之前做;每一个节点都要做) -可以方便我们后期做一些网络调试
在安装Kubernetes时,脚本中的内核模块和参数配置(br_netfilter和bridge-nf-call-iptables)是必须做的,而安装bridge-utils只是可选的网络调试工具。
yum install -y epel-release
yum install -y bridge-utils
modprobe br_netfilter -所有经过网桥的流量,必须要通过防火墙处理,这就是这模块的作用
echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf --把这个模块(br_netfilter)放在开机自启的文件中
echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf --永久启用设置,让所有IPv4流量经过网桥时,也必须经过 iptables 规则链的检查和处理。
echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf --永久启用设置,让所有IPv6流量经过网桥时,也必须经过 ip6tables 规则链的检查和处理。
sysctl -p --刷新
正式开始安装docker
1、若您安装过docker,需要先删掉,之后再安装依赖:
sudo yum remove docker docker-common docker-selinux docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、下载repo文件。
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
软件仓库地址替换为:
sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
3、更新索引文件并安装
sudo yum makecache fast
sudo yum install docker-ce
4、启动& 开机启动docker
systemctl enable docker --now
docker ps命令验证一下

5、配置国内镜像加速器
# 创建 Docker 配置目录
sudo mkdir -p /etc/docker
# 配置镜像加速器(使用国内多个镜像源)
sudo cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10"
},
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io",
"https://docker.xuanyuan.me"
]
}
EOF
# 重新加载配置,重启 Docker 服务,设置docker的开机自启
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
到这里重启一下,让brnetfilter等模块能正常启动
reboot
四、安装cri-dockerd
“CRI-Dockerd” 是一个桥接服务,它的核心作用是让 Kubernetes 能够继续使用 Docker 作为其容器运行时。
CRI 是Kubernetes项目定义的一个标准接口规范。
Docker不直接实现 CRI。它使用自己的API。在K8s中,需要通过 cri-dockerd 这个“适配器”来转换CRI指令。简单来说,如果你想用docker的容器管理引擎安装kubernetes的话,我们需要先把cri-docker给它部署出来(每个节点都需要装)
下载cri-dockerd包并初步配置cri-dockerd
这里版本要对应,我一开始docker版本是29.1.1,和cri-dockerd-0.3.9.amd64.tgz版本不兼容,原因是Docker API版本过高而cri-dockerd版本过低的兼容性问题,需要升级cri-dockerd。我后来换成cri-dockerd-0.3.16.amd64.tgz,问题就解决了,直接覆盖升级就可以,解压新包,用同名新文件直接覆盖 /usr/bin/cri-dockerd。
cri-docker包的安装地址:Releases · Mirantis/cri-dockerd,图示如下:

在 GitHub 上,Releases(发布)是指项目的稳定版本发布页。
| 特性 | 从 Releases 下载 .tgz 文件 | 从 GitHub 下载 master 源码 |
|---|---|---|
| 内容 | 预编译的二进制可执行文件,解压即用。 | 需要Go环境的源代码,必须自行编译。 |
| 复杂度 | 非常简单,只需下载、解压、配置即可。 | 步骤繁琐,需要安装Go环境、处理依赖、编译,容易出错。 |
| 稳定性 | 是经过测试的稳定发布版本。 | 是开发中的最新代码,可能包含未经验证的改动。 |
| 目的 | 推荐给绝大多数用户,用于快速安装部署。 | 适合开发者参与项目开发或测试最新特性。 |
把cri-dockerd-0.3.9.amd64.tgz传到k8s-master01,k8s-node01,k8s-node02的根路径,三个都要传


tar -zxvf cri-dockerd-0.3.16.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/bin/
chmod a+x /usr/bin/cri-dockerd --为系统中的所有用户添加对 /usr/bin/cri-dockerd 这个文件的执行权限
编写cri-docker的服务管理脚本(即systemd的.service和.socket文件)


有一个不同,.service文件中的ExecStart 命令要换成阿里的
在 ExecStart 命令中配置的 registry.aliyuncs.com/google_containers/pause:3.8 这个地址,正是阿里云镜像服务提供的、对Google官方Kubernetes基础镜像(Pause)的国内同步副本。
registry.aliyuncs.com/google_containers/pause:3.8,这是阿里云容器镜像服务 (ACR) 建立的公共代理仓库,同步了Google官方的k8s.gcr.io仓库中的镜像。配置中的阿里云地址不是默认,而是一个为了解决国内网络访问问题的优化配置。它来源于阿里云面向开发者社区提供的公共服务。
cri-dockerd的服务管理脚本:
# 配置 cri-dockerd 服务 -- cri-dockerd服务管理脚本
cat > /usr/lib/systemd/system/cri-dockerd.service <<EOF
[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-dockerd.socket
[Service]
Type=notify
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin
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
# 添加 cri-dockerd 套接字
cat > /usr/lib/systemd/system/cri-dockerd.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-dockerd.service
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
启动 cri-docker 对应服务
systemctl daemon-reload
systemctl restart cri-dockerd.socket
systemctl restart cri-dockerd.service
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
状态为active表示cri-docker也部署好了

五、安装Kubernetes
配置 Kubernetes (v1.29) Yum源
RockyLinux Yum源和Kubernetes (k8s) Yum源两者都需要配置,但扮演着完全不同的角色(下面是解释他们两个的区别)
配置 RockyLinux Yum源(如官方BaseOS, AppStream, EPEL)
这是为了给你的操作系统本身提供软件包。维护操作系统本身:提供系统基础软件、安全更新、通用应用。
配置 Kubernetes (k8s) Yum源
这是为了安装特定的、专业的集群编排软件,这些软件不属于操作系统标准仓库。安装特定专业软件:提供容器编排工具kubeadm/kubelet/kubectl。
配置 Kubernetes (k8s) Yum源:
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF
安装三大组件-kubeadm、kubectl、kubelet(所有节点执行)
setenforce 0 --临时将 SELinux 切换到“宽容模式”
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes --这里会自动安装Kubernetes1.29版本
systemctl enable kubelet && systemctl start kubelet
初始化主节点(仅master节点执行)
kubeadm init \
--apiserver-advertise-address=192.168.175.11 \ --指定当前主服务器地址是多少
--image-repository registry.aliyuncs.com/google_containers \ --指定当前的镜像仓库(从哪里去下这些组件所需要的容器镜像)
--kubernetes-version 1.29.15 \ --这里Kubernetes版本要对应
--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 --以docker配合cri-docker实现cri接口,这条命令是要指定的
注意点:
--service-cidr=10.10.0.0/12 和 --pod-network-cidr=10.244.0.0/16 配置来搭配 Calico 是完全可以的。
核心在于,只要 kubeadm init 中指定的 --pod-network-cidr 与后续安装的Calico配置文件里定义的Pod网段完全一致,网络就能正常建立。
这一步完成后根据输出跟着kubernetes输出的提示继续配置
下面三条语句在主节点做一下就可以了

我们可以通过kubectl get node,可以看到当前kubernetes集群已经出现一个节点了,但是目前还是未就绪状态

把另外两个节点加入集群
另外两个work节点执行(k8s-node01,k8s-node02)

现在的cri用的是cri-docker这个项目产生的套接字,这条语句末尾还要加上--cri-socket unix:///var/run/cri-dockerd.sock,我自己是指定了的
kubeadm join 192.168.175.11:6443 --token kz53o0.u06fpmhcnsorasly \
--discovery-token-ca-cert-hash sha256:83610d34f18e21b756e5eda59a3b3b6c7bd1d9a0bf4f7b5f5cf09355a5c415dc --cri-socket unix:///var/run/cri-dockerd.sock
在 kubeadm join 命令末尾是否需要加上 --cri-socket 参数,取决于你工作节点的具体环境。
根据Kubernetes官方文档,--cri-socket 参数主要用于两种情况:系统安装了多个容器运行时,或者使用了非标准的CRI套接字路径
| 情况 | 是否需要指定 --cri-socket | 原因与说明 |
|---|---|---|
| 工作节点上只有 cri-dockerd 一个运行时 | 不需要 | kubeadm 会自动检测并使用 /var/run/cri-dockerd.sock。 |
| 工作节点上除了 cri-dockerd,还有 containerd 等其他运行时 | 需要 | 系统存在多个运行时,必须明确指定使用哪个。 |
| 工作节点的 cri-dockerd 套接字路径不同 | 需要 | 如果路径不是默认的 /var/run/cri-dockerd.sock,就必须指定。 |
这时候执行kubectl get node,kubernetes的三个节点都已经添加完成了,但是状态都是未就绪的,kubernetes想要正常工作的话,所有的容器必须工作在一个扁平的网络空间中,这里还没有做,calico可以实现,Calico 是专门用来为 Kubernetes 实现“扁平网络空间”(即 Pod 网络)的主流方案之一。

六、部署网络插件(calico)
每个开源项目通常都有自己独特的标准URL格式,这些格式是项目维护者约定的,不是随机生成的。这种标准化使得自动化部署和版本管理变得容易。(拉取格式)
基本流程(这里只需要在主节点上执行)
curl下载 → 修改配置 → kubectl apply -f calico.yaml
#calico
curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml -O
命令与URL详解
-
命令分解
-
curl:一个在命令行下工作的文件传输工具。 -
https://raw.githubusercontent.com...:这是要下载的文件的网络地址。 -
-O:这是curl的一个参数,意思是“保留远程文件的文件名进行保存”。执行后,会在当前目录生成一个名为calico.yaml的文件。
-
-
URL的“固定性”
这个URL是固定的格式,但版本号可以变更:-
projectcalico/calico/指向Calico项目在GitHub上的仓库。 -
v3.28.0代表版本号。您可以将其替换为其他需要的版本(如v3.26.1)。 -
manifests/calico.yaml是该版本对应的标准部署清单文件路径。
因此,只要Calico官方维护此仓库结构,这个URL模式就是固定可用的。这是部署Calico最常用、最直接的方法之一。
-
修改ipip为off,这里我们使用bgp模式
pod的网段设置成和init时的一样
为主节点添加容忍
vi calico.yaml
/name: calico-kube-controllers --搜索
在 spec.template.spec 下添加 tolerations
# 在 containers 之前添加
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: calico-kube-controllers
image: docker.io/calico/kube-controllers:v3.28.0
kubectl apply -f calico.yaml 应用这个.yaml文件就可以了
验证calico是否安装成功

部署应用测试

安装完成!
更多推荐



所有评论(0)