文章目录
- [1 先在主机上安装 VirtaulBox 并创建一个 RockyLinux10 的虚拟机](#1 先在主机上安装 VirtaulBox 并创建一个 RockyLinux10 的虚拟机)
- [2 虚拟机 rockylinux10-1 上的准备------第一部分](#2 虚拟机 rockylinux10-1 上的准备——第一部分)
-
- [2.1 设置 /etc/hosts](#2.1 设置 /etc/hosts)
- [2.2 设置 hotstname 主机名](#2.2 设置 hotstname 主机名)
- [2.3 关闭防火墙](#2.3 关闭防火墙)
- [2.4 关闭 selinux](#2.4 关闭 selinux)
- [2.5 关闭 swap](#2.5 关闭 swap)
- [2.6 VirtualBox 生成个快照 rockylinux10-init](#2.6 VirtualBox 生成个快照 rockylinux10-init)
- [3 虚拟机 rockylinux10-1 上的准备------第二部分](#3 虚拟机 rockylinux10-1 上的准备——第二部分)
-
- [3.1 安装 docker](#3.1 安装 docker)
- [3.2 设置时间同步](#3.2 设置时间同步)
- [3.3 VirtualBox 生成个快照 rockylinux10-installed-docker](#3.3 VirtualBox 生成个快照 rockylinux10-installed-docker)
- [4 虚拟机 rockylinux10-1 上安装 k8s](#4 虚拟机 rockylinux10-1 上安装 k8s)
-
- [4.1 设置 k8s 的 repo 源](#4.1 设置 k8s 的 repo 源)
- [4.2 安装 kubelet, kubeadm 和 kubectl](#4.2 安装 kubelet, kubeadm 和 kubectl)
- [4.3 设置 docker 安装后 自带的 containerd](#4.3 设置 docker 安装后 自带的 containerd)
-
- [4.3.1 编辑配置文件](#4.3.1 编辑配置文件)
- [4.3.2 重启 containerd 服务](#4.3.2 重启 containerd 服务)
- [4.3.3 与 containerd 相关一些命令](#4.3.3 与 containerd 相关一些命令)
- [4.4 初始化 rockylinux10-1 节点](#4.4 初始化 rockylinux10-1 节点)
-
- [4.4.1 先创建 /root/kubeadm-config.yaml 文件](#4.4.1 先创建 /root/kubeadm-config.yaml 文件)
- [4.4.2 手动拉取阿里云的 pause 镜像并打上官方标签](#4.4.2 手动拉取阿里云的 pause 镜像并打上官方标签)
- [4.4.3 执行初始化命令](#4.4.3 执行初始化命令)
- [4.4.4 k8s 初始化失败❗️,如何清理现场,方便再次尝试❓](#4.4.4 k8s 初始化失败❗️,如何清理现场,方便再次尝试❓)
- [4.4.5 k8s 初始化成功✌️👏👏👏](#4.4.5 k8s 初始化成功✌️👏👏👏)
- [4.5 初始化成功后的检查](#4.5 初始化成功后的检查)
-
- [4.5.1 kubectl get nodes 不要报错](#4.5.1 kubectl get nodes 不要报错)
- [4.5.2 把 kubectl get nodes 的 STATUS NotReady 变成 Ready](#4.5.2 把 kubectl get nodes 的 STATUS NotReady 变成 Ready)
- [4.6 VirtualBox 生成个快照 rockylinux10-k8s-init-success](#4.6 VirtualBox 生成个快照 rockylinux10-k8s-init-success)
- [5 虚拟机 rockylinux10-2 上配置 k8s](#5 虚拟机 rockylinux10-2 上配置 k8s)
-
- [5.1 从 rockylinux10-1 的快照 rockylinux10-k8s-init-success 复制出虚拟机 rockylinux10-2](#5.1 从 rockylinux10-1 的快照 rockylinux10-k8s-init-success 复制出虚拟机 rockylinux10-2)
- [5.2 启动 rockylinux10-2 并配置IP地址](#5.2 启动 rockylinux10-2 并配置IP地址)
- [5.3 设置 hostname](#5.3 设置 hostname)
- [5.4 清理 k8s 现场](#5.4 清理 k8s 现场)
- [5.5 检查](#5.5 检查)
- [5.6 rockylinux10-2 加入 rockylinux10-1](#5.6 rockylinux10-2 加入 rockylinux10-1)
- 未完待续。。。
- 🙏感谢阅读
1 先在主机上安装 VirtaulBox 并创建一个 RockyLinux10 的虚拟机
可以参考我的另一篇文章 《VirtualBox安装RockyLinux并使用ssh访问》。😁这篇文章虽然是 Windows 10 上的 VirtualBox,但是 Win11、Linux 和 Mac 上的 VirtualBox 同理;另外,它虽然是安装 RockyLinux 9.2 的 dvd iso,但是 RockyLinux 10 也同理。
⚠️需要注意的是《VirtualBox安装RockyLinux并使用ssh访问》里面,我给虚拟机分了 8G 内存、4核CPU、60GB磁盘,但是本文,我们不得不分得少一些😂。因为我们需要3个虚拟机,但主机资源有限,不能给每个虚拟机太高的配置。所以我们创建虚拟机的时候,分 4GB 内存、2核CPU、50GB磁盘就行。
✅我们可以参考《VirtualBox安装RockyLinux并使用ssh访问》操作,只要确保做到如下几点:
- 在主机上安装好了 VirtualBox 最新版
- 下载好了 RockyLinux 10 最新版本(目前最新是 10.2) 的 dvd.iso
- 给新建的虚拟机命名为 rockylinux-10-1
- 给新建的虚拟机配置好了 4GB 内存、2核CPU、50GB磁盘(不预先分配全部空间)
- 给虚拟机配置双网卡:
- 网络地址转换(NAT)
- 仅主机(Host-Only)网络:⚠️注意‼️不要勾选 它的DHCP服务,因为后面我们要设置静态IP)
- 启动虚拟机,安装好 RockyLinux 10
- 给虚拟机设置好端口转发 ssh 22
- Rocky Linux 防火墙放行 22 端口
- Rocky Linux 安装 ssh
- ip addr 查看虚拟机有没有 192.168.56.xxx 这样的 ip,如果没有的话,就 使用
nmtui配置网卡,记得设置静态 IP 如下图。设置好之后,尝试在主机上,ping 192.168.56.101,要保证能 ping 通

- 在虚拟机中,尝试ping www.baidu.com,要保证能 ping 通。期间有什么问题,可以问 DeepSeek
- 用阿里的源替换 RockyLinux 的默认源
2 虚拟机 rockylinux10-1 上的准备------第一部分
2.1 设置 /etc/hosts
bash
vim /etc/hosts
# 在文件末尾,添加如下配置
192.168.56.101 rockylinux10-1
192.168.56.102 rockylinux10-2
192.168.56.103 rockylinux10-3
2.2 设置 hotstname 主机名
bash
hostnamectl set-hostname rockylinux10-1
2.3 关闭防火墙
bash
systemctl stop firewalld
systemctl disable firewalld
做了这一步,其实,前面安装 RockyLinux 时,做的防火墙放行 22 端口,VirtualBox 做端口映射就没什么用了,可以去除掉。
2.4 关闭 selinux
bash
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
2.5 关闭 swap
bash
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
vim /etc/fstab
#注释与 swap 有关的一行,比如:
#UUID=b154ad02-c85b-4301-a28a-7074e24c39e6 none swap defaults 0 0
2.6 VirtualBox 生成个快照 rockylinux10-init
快照的名称是:rockylinux10-init
描述如下:
text
rockylinux 10
内存4G CPU2个 50GB磁盘
配置好了阿里的repo源
配置好了双网卡:hostOnly 和 NAT
设置好了静态ip 192.168.56.101/24
设置好了网关 192.168.56.1
主机可以访问虚拟机
虚拟机可以访问外网
设置好了 /etc/hosts
设置好了 hotstname 主机名为 rockylinux10-1
关闭了防火墙 firewalld
关闭了 selinux
关闭了 swap
3 虚拟机 rockylinux10-1 上的准备------第二部分
3.1 安装 docker
按照 https://docs.docker.com/engine/install/rhel/ 官网的说明,分别执行以下命令
bash
# 1 Set up the repository
dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
# 2 Install Docker Engine
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 3 Start Docker Engine
systemctl enable --now docker
然后设置 /etc/docker/daemon.json,设置 cgroup 的 driver 是 systemd,设置 dockerhub 的国内镜像 https://docker.m.daocloud.io
bash
{
"exec-opts": [
"native.cgroupdriver=systemd"
],
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
3.2 设置时间同步
bash
# 查看服务状态,应该是 active 的状态,并且开机自启
systemctl status chronyd
# 一般 chronyd 是已安装的,并且是开机自动启动的,如果没有安装,则安装它
dnf install chrony
# 安装之后设置开机自动启动
systemctl enable --now chronyd
# 查看详细的同步信息,关注 System time 和 Last offset 等字段
chronyc tracking
# 查看当前可用的NTP时间源
chronyc sources -v
#### 使用国内的 ntp 服务器
vim /etc/chrony.conf
#### 在文件中找到 pool 或 server 开头的行,这些是当前使用的 NTP 源。注释掉(在行首加 #)它们,然后添加国内常用的 NTP 服务器。如下:
# pool 2.rocky.pool.ntp.org iburst
# 使用国内 NTP 服务器
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
server ntp.ntsc.ac.cn iburst
#### 其他配置不变
#### 重启 chronyd 服务并检查状态
systemctl restart chronyd
chronyc tracking
chronyc sources -v
#### 验证时间同步,确保输出 System clock synchronized: yes
timedatectl
3.3 VirtualBox 生成个快照 rockylinux10-installed-docker
快照的名称是:rockylinux10-installed-docker
描述如下:
text
rockylinux 10
安装了 docker 并且自启动
配置了 /etc/docker/daemon.json
设置了时间同步 chronyd 用国内 ntp
4 虚拟机 rockylinux10-1 上安装 k8s
4.1 设置 k8s 的 repo 源
使用华为的源,注意,我这里的 k8s 版本是 v1.36
bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.huaweicloud.com/kubernetes-new/core:/stable:/v1.36/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.huaweicloud.com/kubernetes-new/core:/stable:/v1.36/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
😁为什么不用阿里的源?原因是👉阿里的 k8s repo 源 https://mirrors.aliyun.com/kubernetes-new/,内容没有华为的全。
当然,RockyLinux 的 repo 源,也可以用华为的,命令如下(也可以还继续用阿里的):
bash
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.huaweicloud.com/rockylinux/|g' \
-i.bak \
/etc/yum.repos.d/rocky*.repo
# 然后执行
dnf makecache
4.2 安装 kubelet, kubeadm 和 kubectl
通过 dnf --version 命令,来看自己的 linux 是用的 DNF 还是 DNF5,如下,很明显,是 DNF 4的版本,也就是 DNF。
bash
[root@rockylinux10-1 ~]# dnf --version
4.20.0
Installed: dnf-0:4.20.0-22.el10_2.rocky.0.1.noarch at Mon 27 Jul 2026 09:54:53 AM GMT
Built : Rocky Linux Build System <releng@rockylinux.org> at Tue 19 May 2026 02:06:23 PM GMT
Installed: rpm-0:4.19.1.1-23.el10.aarch64 at Mon 27 Jul 2026 09:54:53 AM GMT
Built : Rocky Linux Build System <releng@rockylinux.org> at Sat 07 Feb 2026 02:50:24 PM GMT
根据 k8s 官方文档 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ ,开始安装,命令如下:
bash
# For systems with DNF:
# 我们是 DNF4 也就是 DNF,所以执行下面的命令
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# For systems with DNF5:
# 我们是 DNF4 不是5,所以不用下面的命令
dnf install -y kubelet kubeadm kubectl --setopt=disable_excludes=kubernetes
4.3 设置 docker 安装后 自带的 containerd
4.3.1 编辑配置文件
bash
vim /etc/containerd/config.toml
找到 disabled_plugins = ["cri"] 这一行,修改成下面的样子(也就是把 cri 删除掉):
bash
# disabled_plugins = ["cri"]
disabled_plugins = []
然后在文件末尾添加以下完整内容:
bash
# 启用 CRI 插件(如果存在 disabled_plugins,确保没有 "cri")
[plugins."io.containerd.grpc.v1.cri"]
# 启用 CRI 服务
[plugins."io.containerd.grpc.v1.cri".containerd]
# 默认使用 runc
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 关键:与 kubelet 的 cgroup 驱动保持一致
4.3.2 重启 containerd 服务
bash
systemctl restart containerd
# 查看版本号,验证重启是否成功
ctr -n k8s.io version
4.3.3 与 containerd 相关一些命令
bash
# 查看 containerd 版本号
ctr -n k8s.io version
# 查看 k8s 里面有哪些镜像
ctr -n k8s.io images list
# k8s 拉取镜像
ctr -n k8s.io images pull xxx-image:xxx-tag
# k8s 给镜像打 tag
ctr -n k8s.io images tag source-image:aaa-tag target-image:bbb-tag
# 查看 k8s 里面有哪些正在运行的容器
ctr -n k8s.io containers list
4.4 初始化 rockylinux10-1 节点
4.4.1 先创建 /root/kubeadm-config.yaml 文件
内容如下:
yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: "192.168.56.101"
bindPort: 6443
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.36.3
# 用阿里云的镜像
imageRepository: registry.aliyuncs.com/google_containers
# 对应 --service-cidr
serviceSubnet: "10.1.0.0/16"
# 对应 --pod-network-cidr
podSubnet: "10.244.0.0/16"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# 统一 cgroup 驱动(与 containerd 的 systemd 保持一致)
cgroupDriver: systemd
# 关键:指定 pause 镜像地址(阿里云镜像源中 pause 的版本可能为 3.10)
podSandboxImage: registry.aliyuncs.com/google_containers/pause:3.10
4.4.2 手动拉取阿里云的 pause 镜像并打上官方标签
为什么要手动拉取?因为👉上面的 kubeadm 一直要从 k8s 官方源 registry.k8s.io 拉取镜像 pause:3.10.1,即便是配置了上面的 kubeadm-config.yaml,还是要访问 registry.k8s.io。但是国内访问不了 registry.k8s.io,所以只能手动拉取,然后打 tag,命令如下:
bash
# 拉取阿里云上的 pause(版本 3.10,与 3.10.1 基本一致)
sudo ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.10
# 给这个镜像打上 kubelet 期望的标签(这样 kubelet 拉取时会直接命中本地镜像)
sudo ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.10 registry.k8s.io/pause:3.10.1
# 验证镜像已存在
ctr -n k8s.io images list | grep pause
# 应该有一行是 registry.k8s.io/pause:3.10.1
4.4.3 执行初始化命令
bash
kubeadm init --config=kubeadm-config.yaml
4.4.4 k8s 初始化失败❗️,如何清理现场,方便再次尝试❓
bash
kubeadm reset -f \
&& rm -rf /etc/kubernetes/ \
&& rm -rf /var/lib/kubelet/ \
&& systemctl restart containerd \
&& systemctl restart kubelet
4.4.5 k8s 初始化成功✌️👏👏👏
可以看到如下结果:
bash
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.56.101:6443 --token sa8kol.9i8mk2zjxkxlwhnr \
--discovery-token-ca-cert-hash sha256:3ea305e20b3bbabe2bccf3a0de7ce4b56a9aabb5150051a9631821614a9fad9f
4.5 初始化成功后的检查
4.5.1 kubectl get nodes 不要报错
bash
# 执行如下命令
kubectl get nodes
# 第一种情况:输出结果可能是一堆报错信息,如下:
E0730 09:42:53.796351 2645 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0730 09:42:53.796568 2645 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0730 09:42:53.797997 2645 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0730 09:42:53.798197 2645 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0730 09:42:53.799655 2645 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 第二种情况:输出结果比较正常,如下:
NAME STATUS ROLES AGE VERSION
rockylinux10-1 NotReady control-plane 15h v1.36.3
如果是第一种情况的错误信息的话,那么接下来,我们按如下步骤解决它。此问题产生的原因是:kubectl 没有找到正确的 kubeconfig 配置文件,kubeadm init 成功后,会在 /etc/kubernetes/admin.conf 生成管理员 kubeconfig 文件,但你需要将它配置到 kubectl 的默认路径或设置环境变量。
- 确认集群是否已成功初始化:执行命令
ls -l /etc/kubernetes/admin.conf如果该文件存在,说明kubeadm init已成功生成集群凭证,只是kubectl没有正确读取; - 配置 kubectl 使用该 kubeconfig:最好选方法一
bash
# 方法一(推荐):复制到默认路径
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 方法二:设置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
- 验证 kubectl 是否正常工作:执行命令
kubectl get nodes这回应该会输出比较正常的结果
4.5.2 把 kubectl get nodes 的 STATUS NotReady 变成 Ready
上面输出的 STATUS NotReady 表明集群已启动,其中 NotReady 是因为尚未安装 CNI 网络插件。CNI 网络插件有2种 Calico 和 Flannel,它们的异同如下:
| 特性 | Calico | Flannel |
|---|---|---|
| 网络模型 | 基于BGP协议的路由网络,数据包直接路由,性能接近物理网络。 | Overlay(覆盖网络),通过VXLAN等技术封装数据包,有一定性能损耗。 |
| NetworkPolicy | 原生支持,可实现Pod间微隔离。 | 不支持,无法实现Pod级网络策略。 |
| 性能 | 高(BGP模式无封装)。 | 中等(VXLAN模式有封装开销)。 |
| 复杂度 | 较复杂,组件多,有学习成本。 | 简单,轻量,部署即用。 |
| 适用场景 | 中大规模集群,对性能、安全、策略有高要求的场景。 | 中小规模集群,对功能和性能要求不高,追求简单快速的场景。 |
这里随便选一个,就选 Calico,反正是学习用😄。Calico 的 github 官网是 https://github.com/projectcalico/calico 。为了方便访问,我们可以把 https://github.com/projectcalico/calico.git 导入到 gitee 仓库中。
在导入好的 gitee 仓库中,选择最新的 release 了的分支,比如现在最新是 v3.32.1,然后下载代码仓库的 zip 包。解压 zip 包后,进入到解压后的目录,可以找到 manifests/calico.yaml 文件。
然后把此 calico.yaml 文件上传到 rockylinux10-1 虚拟机中,执行如下命令:
bash
cat calico.yaml |grep image
# 可以看到,都使用了 quay.io 的镜像
image: quay.io/calico/cni:v3.32.1
imagePullPolicy: IfNotPresent
image: quay.io/calico/cni:v3.32.1
imagePullPolicy: IfNotPresent
image: quay.io/calico/node:v3.32.1
imagePullPolicy: IfNotPresent
image: quay.io/calico/node:v3.32.1
imagePullPolicy: IfNotPresent
image: quay.io/calico/kube-controllers:v3.32.1
imagePullPolicy: IfNotPresent
根据 DaoCloud 在 gitee 上的官方仓库 https://gitee.com/daocloud/public-image-mirror 上所说,我们可以把 quay.io 替换成 quay.m.daocloud.io 相关命令如下:
bash
sed -i 's?quay.io?quay.m.daocloud.io?g' calico.yaml
# 替换好之后,再 cat calico.yaml |grep image 就可以看到,都是 quay.m.daocloud.io 了
然后执行如下命令,
bash
kubectl apply -f calico.yaml
# 执行完成后,再次 kubectl get node 应该是如下结果,STATUS 是 Ready 了,如下:
[root@rockylinux10-1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
rockylinux10-1 Ready control-plane 15h v1.36.3
# 执行 kubectl get pod -n kube-system 命令,得到的 STATUS 应该都是 Running,如下:
[root@rockylinux10-1 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-f5d69fdff-zwqn7 1/1 Running 1 (31s ago) 41m
calico-node-4vnlr 1/1 Running 1 (31s ago) 41m
coredns-6b5f954497-fqqlc 1/1 Running 1 (31s ago) 15h
coredns-6b5f954497-tktwp 1/1 Running 1 (31s ago) 15h
etcd-rockylinux10-1 1/1 Running 3 (31s ago) 15h
kube-apiserver-rockylinux10-1 1/1 Running 3 (31s ago) 15h
kube-controller-manager-rockylinux10-1 1/1 Running 3 (31s ago) 15h
kube-proxy-nsg8t 1/1 Running 2 (31s ago) 15h
kube-scheduler-rockylinux10-1 1/1 Running 3 (31s ago) 15h
4.6 VirtualBox 生成个快照 rockylinux10-k8s-init-success
快照的名称是:rockylinux10-k8s-init-success
描述如下:
text
rockylinux 10
设置了 k8s 华为 repo 源
安装了 kubelet, kubeadm 和 kubectl
设置了 containerd 的 /etc/containerd/config.toml
使用 kubeadm 初始化成功
kubectl get nodes 的状态是 Ready 并且 pod 都是 Running
5 虚拟机 rockylinux10-2 上配置 k8s
5.1 从 rockylinux10-1 的快照 rockylinux10-k8s-init-success 复制出虚拟机 rockylinux10-2
把 rockylinux10-1 虚拟机先 shutdown,然后如下图操作:

5.2 启动 rockylinux10-2 并配置IP地址
执行命令 nmtui 做如下图的配置:

修改完成后,可以直接 reboot 虚拟机,使其生效。reboot 后,ssh root@192.168.56.102 连接到命令行。
5.3 设置 hostname
bash
hostnamectl set-hostname rockylinux10-2
5.4 清理 k8s 现场
bash
kubeadm reset -f \
&& rm -rf /etc/kubernetes/ \
&& rm -rf /var/lib/kubelet/ \
&& systemctl restart containerd \
&& systemctl restart kubelet
5.5 检查
先启动虚拟机 rockylinux10-1,然后执行命令 kubectl get nodes 应该不会报错,并且状态是 Ready。另外执行 kubectl get pod -n kube-system 应该也全是 Running
5.6 rockylinux10-2 加入 rockylinux10-1
执行前面 rockylinux10-1 kubeadm init 成功后,输出的 join 命令,如下:
bash
kubeadm join 192.168.56.101:6443 --token sa8kol.9i8mk2zjxkxlwhnr \
--discovery-token-ca-cert-hash sha256:3ea305e20b3bbabe2bccf3a0de7ce4b56a9aabb5150051a9631821614a9fad9f
如果当时忘了记录这行命令了,那么可以使用下面的命令重新生成:
bash
kubeadm token create --print-join-command