RHEL9部署Kubernetes 1.32集群

RHEL9部署Kubernetes 1.32集群

_

由于部分文件需要访问外网才能够下载,这里我将部分比较难下载的软件包都上传至百度云,各位可以按需下载。

链接: https://pan.baidu.com/s/1vc29TpB6XTEl4Tk6_G72Zg?pwd=w8rb

提取码: w8rb

一、Master节点安装Kubernetes

1. 节点设置

主机名

网络信息

系统信息

k8s-master

192.168.8.10/24

Red Hat Enterprise Linux 9.2 (Plow)

k8s-worker

192.168.8.11/24

Red Hat Enterprise Linux 9.2 (Plow)

2. 安装容器运行时

[Step1] 执行命令,卸载可能会引起冲突的软件包。

[root@k8s-master ~]# dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc

[Step2] 首次在新主机上安装Docker Engine之前,需要搭建Docker仓库。从配置的软件源中下载最新的包列表,更新本地缓存,安装相应组件。

[root@k8s-master ~]# dnf -y install dnf-plugins-core
[root@k8s-master ~]# dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

[Step3] 安装Docker包,安装途中会提示接受GPG密钥,接收即可。

[root@k8s-master ~]# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

[Step4] 启动Docker引擎。

[root@k8s-master ~]# systemctl enable --now docker.service

[Step5] 因为特殊原因,我们可能无法拉取容器镜像,需要通过设置镜像加速器的方式去拉取镜像。编辑Docker守护进程配置文件,配置镜像加速器。首次安装Docker时该文件可能不存在,新建即可。

[root@k8s-master ~]# vim /etc/docker/daemon.json
​
# 写入下列内容
{
    "registry-mirrors": [
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://a0f4d5484dea442caf5d1193f09abdd4.mirror.swr.myhuaweicloud.com"
    ]
}

[Step6] 添加镜像加速器后,需要重新加载systemd的配置,并重启Docker服务。

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker.service

[Step7] 验证:通过运行镜像来确认Docker安装成功。

[root@k8s-master ~]# docker run hello-world

3. 安装CRI-Docker

[Step1] 部署完Docker-CE后还需要cri-docker shim才能够与Kubernetes通信。Kubernetes使用CRI(容器运行时接口)与容器运行时进行通信,但是Docker不支持CRI,需要借助cri-dockerd作为中间层协助。GitHub上目前只提供Fedora、Debian、Ubuntu、Windows、二进制压缩包以及源码包,这里我们下载二进制包。【如果无法正常下载,可以访问我提供的百度云链接下载cri-dockerd】

[root@k8s-master ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd-0.3.21.amd64.tgz

[Step2] 将cri-dockerd-0.3.21.amd64.tgz包解压缩,将解压缩后的可执行文件移动到bin目录并赋予执行权限。

[root@k8s-master ~]# tar -zxf cri-dockerd-0.3.21.amd64.tgz
[root@k8s-master ~]# mv cri-dockerd/cri-dockerd /usr/local/bin/
[root@k8s-master ~]# chmod +x /usr/local/bin/cri-dockerd

[Step3] 验证:查看cri-dockerd的版本,能够成功输出则安装成功。

[root@k8s-master ~]# cri-dockerd --version

[Step4] 创建systemd服务文件,在启动参数中加速镜像访问速度。

[root@k8s-master ~]# vim /etc/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=docker.service

[Service]
Type=exec
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint unix:///run/cri-dockerd.sock --network-plugin=cni --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10.1
Restart=always
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

[Step5] 重新加载systemd,启动cri-docker服务并加入开机自启。

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl enable --now cri-docker.service

[Step6] 验证:查看cri-dockerd的服务状态。

[root@k8s-master ~]# systemctl status cri-docker.service

4. 禁用SWAP分区

[Step1] 在Kubernetes1.34版本以前要求禁用swap分区,否则kubelet会拒绝启动。虽然目前版本为1.34以上,但是仍然建议遵守。

[root@k8s-master ~]# swapoff -a  // 临时卸载所有swap分区

// 编辑fstab文件,注释掉swap挂载配置
[root@k8s-master ~]# vim /etc/fstab
#/dev/mapper/rhel-swap   none                    swap    defaults        0 0

5. 允许IPtables桥接流量

[Step1] 编辑配置文件,确保“br_netfilter”内核模块开机自动加载。

[root@k8s-master ~]# vim /etc/modules-load.d/k8s.conf

# 写入下列内容
br_netfilter

[Step2] 手动加载内核模块使其立即生效。

[root@k8s-master ~]# modprobe br_netfilter

[Step3] 验证:查看模块是否加载,有回显结果表示已加载。

root@k8s-master:~# lsmod | grep br_netfilter

[Step4] 编辑sysctl内核参数文件,此配置文件需要重启生效。

[root@k8s-master ~]# vim /etc/sysctl.d/k8s.conf

# 写入下列内容
net.bridge.bridge-nf-call-ip6tables = 1  # 让iptables规则作用于IPv6的桥接流量
net.bridge.bridge-nf-call-iptables = 1   # 让iptables规则作用于IPv4的桥接流量
net.ipv4.ip_forward = 1  # 开启Linux内核的IPv4转发功能

[Step5] 执行命令使得配置立即生效。

root@k8s-master:~# sysctl --system

6. 安装kubeadm

[Step1] 添加阿里云的Kubernetes镜像仓库,也可以通过访问“https://mirrors.aliyun.com/kubernetes-new/core/stable”手动下载,截止目前最新的版本为1.35,这里我们指定安装1.32。

[root@k8s-master ~]# vim /etc/yum.repos.d/kubernetes.repo

# 写入下列内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key

[Step2] 安装kubelet、kubeadm和kubectl。

[root@k8s-master ~]# dnf install -y kubelet kubeadm kubectl

[Step3] 启动kubelet并将其加入开机自启。

[root@k8s-master ~]# systemctl enable --now kubelet.service

[Step4] 为了确保软件包的版本不会自动升级,在仓库文件中添加exclude参数,防止因为误升级导致的问题。

[root@k8s-master ~]# vim /etc/yum.repos.d/kubernetes.repo

# 在文件末尾添加下列内容
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni

7. 添加命令补全

[Step1] 生成kubectl和kubeadm的bash补全脚本,保存到系统补全目录,临时加载补全脚本。

# 生成kubectl和kubeadm的bash补全脚本,保存到系统补全目录
[root@k8s-master ~]# kubectl completion bash > /etc/bash_completion.d/kubectl
[root@k8s-master ~]# kubeadm completion bash > /etc/bash_completion.d/kubeadm

# 立即加载kubectl和kubeadm脚本,仅在当前会话生效
[root@k8s-master ~]# source /etc/bash_completion.d/kubectl
[root@k8s-master ~]# source /etc/bash_completion.d/kubeadm

8. 添加本地解析

[Step1] 在k8s-master修改hosts文件,添加自己和worker的解析。

[root@k8s-master ~]# vim /etc/hosts

# 在文件末尾添加下列内容
192.168.8.10    k8s-master
192.168.8.11    k8s-worker

[Step2] 在k8s-worker修改hosts文件,添加自己和master的解析。

[root@k8s-worker ~]# vim /etc/hosts

# 在文件末尾添加下列内容
192.168.8.10    k8s-master
192.168.8.11    k8s-worker

9. 集成CRI-Docker

[Step1] 配置crictl的默认运行时端点,指定连接的容器运行时套接字。此时会显示“Config "/etc/crictl.yaml" does not exist”,因为是首次配置,所以默认配置文件不存在,属于正常警告。

[root@k8s-master ~]# crictl config runtime-endpoint unix:///run/cri-dockerd.sock

10. 初始化k8s集群

[Step1] 导出kubeadm init的默认配置模版,方便后续自定义集群初始化参数。

[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm.yaml

[Step2]编辑默认配置模版,修改相关参数。

[root@k8s-master ~]# vim kubeadm.yaml

# 修改下列参数
advertiseAddress: 192.168.8.10   # Master节点的IP地址

# 容器运行时的套接字路径
criSocket: unix:///var/run/cri-dockerd.sock

# Master节点的节点名
name: k8s-master

# 系统组件镜像的仓库地址
imageRepository: registry.aliyuncs.com/google_containers

# 在networking块中添加下列内容,指定pod的子网
podSubnet: 172.16.0.0/16

[Step3] 验证:列出当前kubeadm版本所需要下载的所有核心组件镜像。一般情况下,能够正常列出镜像,也就能够正常下载。

[root@k8s-master ~]# kubeadm config images list

[Step4] 初始化集群,此时会自动下载系统组件的镜像。

[root@k8s-master ~]# kubeadm init --config kubeadm.yaml

[Step5] 复制初始化成功后的提示命令,授予执行命令的用户具备操作集群的权限。

[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[Step6] 验证:查看集群中所有节点的状态、角色和版本信息,k8s-master节点的状态为“NotReady“是因为还没有部署网络插件。

[root@k8s-master ~]# kubectl get nodes

11. 部署Calico网络插件

主流的网络插件有Flannel和Calico,以下选用Calico。网络插件只需要在Master节点部署。

如果无法正常下载,可以访问我提供的百度云链接下载Calico镜像。

[Step1] 在部署Calico网络插件前,先查看当前本地的容器镜像,目的是为了与拉取Calico相关镜像后作对比。

[root@k8s-master ~]# docker images

[Step2] 当前Calico的最新稳定版本为v3.31.4,可以通过GitHub仓库的Releases板块查询版本信息。

https://github.com/projectcalico/calico

[Step3] 使用wget下载calico.yaml文件。

[root@k8s-master ~]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.4/manifests/calico.yaml

[Step4] 下载完成后,编辑calico.yaml文件。因为我们在初始化k8s集群的时候,手动指定pod的子网,这里需要修改与其一致。

[root@k8s-master ~]# vim calico.yaml

# 修改下列参数
# 需要和集群部署中的[podSubnet: 172.16.0.0/16]一致
- name: CALICO_IPV4POOL_CIDR
  value: "172.16.0.0/16"

[Step5] 安装Calico。

[root@k8s-master ~]# kubectl apply -f calico.yaml

[Step6] 如果网络没有问题,此时会自动下载所需镜像。因为Calico没有提供进度条,所以无法直观的查看是否正在下载。这里可以打开任务管理器,查看网卡是否有流量波动,以此判断是否正在下载。

[Step7] 等待一段时间后,查看所有命名空间下所有Pod的状态,全部状态为“Running”则安装成功。

[root@k8s-master ~]# kubectl get pods -A

[Step8] 验证:查看当前本地的容器镜像,与未安装Calico之前对比,多出了三个镜像。

[root@k8s-master ~]# docker images

二、worker节点加入master

worker节点加入master的先决条件

  1. 安装容器运行时,如果是Docker,则需要额外安装CRI-Docker

  2. 关闭并禁用SWAP分区

  3. 允许IPtables桥接流量

  4. 安装kubeadm

  5. 集成CRI-Docker

  6. 在节点添加master的解析,在master添加节点的解析

1. 安装容器运行时

[Step1] 执行命令,卸载可能会引起冲突的软件包。

[root@k8s-worker ~]# dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc

[Step2] 首次在新主机上安装Docker Engine之前,需要搭建Docker仓库。从配置的软件源中下载最新的包列表,更新本地缓存,安装相应组件。

[root@k8s-worker ~]# dnf -y install dnf-plugins-core
[root@k8s-worker ~]# dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

[Step3] 安装Docker包,安装途中会提示接受GPG密钥,接收即可。

[root@k8s-worker ~]# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

[Step4] 启动Docker引擎。

[root@k8s-worker ~]# systemctl enable --now docker.service

[Step5] 因为特殊原因,我们可能无法拉取容器镜像,需要通过设置镜像加速器的方式去拉取镜像。编辑Docker守护进程配置文件,配置镜像加速器。首次安装Docker时该文件可能不存在,新建即可。

[root@k8s-worker ~]# vim /etc/docker/daemon.json

# 写入下列内容
{
    "registry-mirrors": [
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://a0f4d5484dea442caf5d1193f09abdd4.mirror.swr.myhuaweicloud.com"
    ]
}

[Step6] 添加镜像加速器后,需要重新加载systemd的配置,并重启Docker服务。

[root@k8s-worker ~]# systemctl daemon-reload
[root@k8s-worker ~]# systemctl restart docker.service

[Step7] 验证:通过运行镜像来确认Docker安装成功。

[root@k8s-worker ~]# docker run hello-world

3. 安装CRI-Docker

[Step1] 部署完Docker-CE后还需要cri-docker shim才能够与Kubernetes通信。Kubernetes使用CRI(容器运行时接口)与容器运行时进行通信,但是Docker不支持CRI,需要借助cri-dockerd作为中间层协助。GitHub上目前只提供Fedora、Debian、Ubuntu、Windows、二进制压缩包以及源码包,这里我们下载二进制包。【如果无法正常下载,可以访问我提供的百度云链接下载cri-dockerd】

[root@k8s-worker ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd-0.3.21.amd64.tgz

[Step2] 将cri-dockerd-0.3.21.amd64.tgz包解压缩,将解压缩后的可执行文件移动到bin目录并赋予执行权限。

[root@k8s-worker ~]# tar -zxf cri-dockerd-0.3.21.amd64.tgz
[root@k8s-worker ~]# mv cri-dockerd/cri-dockerd /usr/local/bin/
[root@k8s-worker ~]# chmod +x /usr/local/bin/cri-dockerd

[Step3] 验证:查看cri-dockerd的版本,能够成功输出则安装成功。

[root@k8s-worker ~]# cri-dockerd --version

[Step4] 创建systemd服务文件,在启动参数中加速镜像访问速度。

[root@k8s-worker ~]# vim /etc/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=docker.service

[Service]
Type=exec
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint unix:///run/cri-dockerd.sock --network-plugin=cni --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10.1
Restart=always
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

[Step5] 重新加载systemd,启动cri-docker服务并加入开机自启。

[root@k8s-worker ~]# systemctl daemon-reload
[root@k8s-worker ~]# systemctl enable --now cri-docker.service

[Step6] 验证:查看cri-dockerd的服务状态。

[root@k8s-worker ~]# systemctl status cri-docker.service

4. 禁用SWAP分区

[Step1] 在Kubernetes1.34版本以前要求禁用swap分区,否则kubelet会拒绝启动。虽然目前版本为1.34以上,但是仍然建议遵守。

[root@k8s-worker ~]# swapoff -a  // 临时卸载所有swap分区

// 编辑fstab文件,注释掉swap挂载配置
[root@k8s-worker ~]# vim /etc/fstab
#/dev/mapper/rhel-swap   none                    swap    defaults        0 0

5. 允许IPtables桥接流量

[Step1] 编辑配置文件,确保“br_netfilter”内核模块开机自动加载。

[root@k8s-worker ~]# vim /etc/modules-load.d/k8s.conf

# 写入下列内容
br_netfilter

[Step2] 手动加载内核模块使其立即生效。

[root@k8s-worker ~]# modprobe br_netfilter

[Step3] 验证:查看模块是否加载,有回显结果表示已加载。

[root@k8s-worker ~]# lsmod | grep br_netfilter

[Step4] 编辑sysctl内核参数文件,此配置文件需要重启生效。

[root@k8s-worker ~]# vim /etc/sysctl.d/k8s.conf

# 写入下列内容
net.bridge.bridge-nf-call-ip6tables = 1  # 让iptables规则作用于IPv6的桥接流量
net.bridge.bridge-nf-call-iptables = 1   # 让iptables规则作用于IPv4的桥接流量
net.ipv4.ip_forward = 1  # 开启Linux内核的IPv4转发功能

[Step5] 执行命令使得配置立即生效。

[root@k8s-worker ~]# sysctl --system

6. 安装kubeadm

[Step1] 添加阿里云的Kubernetes镜像仓库,也可以通过访问“https://mirrors.aliyun.com/kubernetes-new/core/stable”手动下载,截止目前最新的版本为1.35,这里我们指定安装1.32。

[root@k8s-worker ~]# vim /etc/yum.repos.d/kubernetes.repo

# 写入下列内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key

[Step2] 安装kubelet、kubeadm和kubectl。

[root@k8s-worker ~]# dnf install -y kubelet kubeadm kubectl

[Step3] 启动kubelet并将其加入开机自启。

[root@k8s-worker ~]# systemctl enable --now kubelet.service

[Step4] 为了确保软件包的版本不会自动升级,在仓库文件中添加exclude参数,防止因为误升级导致的问题。

[root@k8s-worker ~]# vim /etc/yum.repos.d/kubernetes.repo

# 在文件末尾添加下列内容
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni

7. 添加命令补全

[Step1] 生成kubectl和kubeadm的bash补全脚本,保存到系统补全目录,临时加载补全脚本。

# 生成kubectl和kubeadm的bash补全脚本,保存到系统补全目录
[root@k8s-worker ~]# kubectl completion bash > /etc/bash_completion.d/kubectl
[root@k8s-worker ~]# kubeadm completion bash > /etc/bash_completion.d/kubeadm

# 立即加载kubectl和kubeadm脚本,仅在当前会话生效
[root@k8s-worker ~]# source /etc/bash_completion.d/kubectl
[root@k8s-worker ~]# source /etc/bash_completion.d/kubeadm

8. 检查彼此解析

[Step1] 在k8s-master上验证worker的解析。

[root@k8s-master ~]# ping -c 3 k8s-worker

[Step2] 在k8s-worker1上验证master的解析。

[root@k8s-worker ~]# ping -c 3 k8s-master

9. worker节点加入master

[Step1] 如果长时间忘记了join命令,可以在k8s-master节点上重新生成。

[root@k8s-master ~]# kubeadm token create --print-join-command

[Step2] 在k8s-worker节点上执行join命令加入k8s-master节点。在Kubernetes 1.24+版本中,如果使用cri-dockerd则需要加上“--cri-socket”参数。核心原因是kubeadm的默认CRI套接字指向containerd,而非cri-dockerd,导致自动检测失败或错误。

[root@k8s-worker ~]# kubeadm join 192.168.8.10:6443 --token g12tyr.ugvnoxyvmwmpi1t8 --discovery-token-ca-cert-hash sha256:bef699090305f02f389d8d5ecd5a8e1908c07e9c4ae862f07e8b7760a720e3df --cri-socket=unix:///var/run/cri-dockerd.sock

[Step3] 验证:在k8s-master上查看已经加入节点的状态,能够看到k8s-worker的加入且状态为Ready。

[root@k8s-master ~]# kubectl get nodes

[Step4] 在k8s-master节点上为k8s-worker节点加上角色标签,便于资源调度和管理。

root@k8s-master:~# kubectl label nodes k8s-worker1 node-role.kubernetes.io/worker=worker1
  • kubectl label nodes:对kubernetes的节点资源加上标签

  • k8s-worker:操作的节点名称

  • node-role.kubernetes.io/worker=:设置的标签

  • worker1:设置的标签值


Ubuntu部署Kubernetes 1.32集群 2026-04-25
麒麟服务器操作系统部署Kubernetes 1.32集群 2026-04-25

评论区