一、准备工作

在vmware中安装,创建三台rockylinux9.6服务器

主机ip配置
k8s-master01192.168.175.114核,4g内存,40g硬盘
k8s-node01192.168.175.122核,2g内存,40g硬盘
k8s-node02192.168.175.132核,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_netfilterbridge-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详解

  1. 命令分解

    • curl:一个在命令行下工作的文件传输工具。

    • https://raw.githubusercontent.com...:这是要下载的文件的网络地址。

    • -O:这是curl的一个参数,意思是“保留远程文件的文件名进行保存”。执行后,会在当前目录生成一个名为 calico.yaml 的文件。

  2. 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是否安装成功

部署应用测试

安装完成!

更多推荐