虚拟机配置:

Vmware 版本:

一、准备工作

1、关闭防火墙

关闭防火墙的原因:

Kubernetes 集群内部组件之间需要大量端口通信,涉及控制平面、数据平面、Pod 网络、服务代理等。如果防火墙规则未正确放行这些端口,会导致:

  • 节点无法加入集群(kubeadm join 失败)
  • Pod 无法跨节点通信
  • CoreDNS 无法解析
  • kubelet 无法与 apiserver 通信
  • 网络插件(如 Calico、Flannel)异常
  • 服务(Service)无法访问

我们可以通过 ufw 来管理防火墙,ufw 介绍:

  • UFW(Uncomplicated Firewall)是 Ubuntu/Debian 系统上对 iptables 的一个简化封装工具
  • 它的目标是让普通用户也能轻松管理防火墙规则,而无需直接编写复杂的 iptables 命令。

查看 UFW 的状态,如果显示 inactive 或者状态:不活动说明是未激活

sudo ufw status

开机不启动防火墙,重启即可生效

sudo ufw disable

2、关于 swap 是否需要关闭

首先,从上面的官方文档可以得出如下结论:

1.22 版本之前:不提供对 swap 的支持,需要关闭 swap

1.22 版本到 1.28 版本:提供了 alpha support for using swap memory

1.28 版本开始:提供了 Beta support for using swap memory,但不再支持将交换内存与 cgroup v1 一起使用。

从上图的官方文档可以总结:

1.30 版本进一步改进,但还是属于 Beta 版本

我选择安装的版本是 1.23.5 > 1.22,但是我本人用不到 swap,所以选择关闭该项功能:

(1)临时关闭(重启后失效)

sudo swapoff -a

(2)永久关闭

编辑 /etc/fstab注释掉所有包含 swap 的行

vim /etc/fstab

(3)验证

free -h

输出中 Swap 的 total 和 used 必须为 0B

              total        used        free
Mem:           7.7G        1.2G        6.5G
Swap:            0B          0B          0B

3、安装容器运行时

首先需要知道:

所以检查自己需要的 k8s 版本:

  • v1.24+:不能直接使用 docker 作为容器运行时,必须通过 containerdCRI-O
  • v1.23 及更早:仍支持 Docker,但需使用 经过验证的版本

Kubernetes 与 Docker 版本兼容对照表(适用于 v1.23 及以下)

Kubernetes 版本 推荐 Docker 版本 说明
v1.23.x 20.10.x 最后一个支持 Docker 的 K8s 主版本
v1.22.x 20.10.x
v1.21.x 20.10.x
v1.20.x 19.03.x
v1.19.x 18.09.x

**我这里安装 1.23.5 版本的 k8s,所以仍选择 docker 作为容器运行时。**如果需要安装其他容器运行时,请参考官方文档

docker 官网可以看到各个系统版本的安装教程:

查看 Ubuntu 下的安装方法,可以看到有多种方式:

我这里选择使用 apt 安装:

官方提示:在新主机上首次安装 Docker Engine 之前,你需要先配置 Docker 的 apt 软件源。配置完成后,你就可以通过该软件源安装和更新 Docker。

1、配置 Docker 的 apt 软件源

官方(可能存在网络问题,建议使用下面阿里的):

# 添加 Docker 的官方 GPG 密钥:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 配置 Docker 的 apt 软件源:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

阿里:

# step 1: 安装必要的一些系统工具
sudo apt update
sudo apt install ca-certificates curl gnupg

# step 2: 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Step 3: 写入软件源信息
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新
sudo apt update

关于 GPG:

  • GPG(GNU Privacy Guard)密钥用于对软件包进行数字签名。
  • 当你从 Docker 官方 APT 仓库安装软件时,系统会使用这个 GPG 公钥来验证:这个 .deb 包确实是 Docker 官方发布的,而不是第三方伪造的。
  • 如果没有这个密钥,APT 会报错(如 NO_PUBKEY)或拒绝安装,以防止潜在风险。

2、执行安装命令

安装最新的版本:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 上述安装的最后两个组件可以选择安装:
# docker-buildx-plugin:高级镜像构建工具
# docker-compose-plugin:容器编排工具

推荐安装指定版本,避免后面安装过程有告警信息:

# 列出仓库中所有的可用版本
$ apt-cache madison docker-ce | awk '{ print $3 }'
5:20.10.20~3-0~ubuntu-jammy
5:20.10.19~3-0~ubuntu-jammy
5:20.10.18~3-0~ubuntu-jammy
5:20.10.17~3-0~ubuntu-jammy
5:20.10.16~3-0~ubuntu-jammy
5:20.10.15~3-0~ubuntu-jammy
5:20.10.14~3-0~ubuntu-jammy
5:20.10.13~3-0~ubuntu-jammy
...


# 从上面的结果中选择需要的版本,修改如下命令进行安装
# 下面第一行是 Shell 变量赋值语句,不要忘记执行
$ VERSION_STRING=5:20.10.20~3-0~ubuntu-jammy
$ sudo apt install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

3、确认 docker 是否正常运行

# 查看 docker 运行状态
sudo systemctl status docker

# 手动启动命令
sudo systemctl start docker

4、修改配置文件

# 修改 daemon.json 文件
vim /etc/docker/daemon.json

# 在文件里添加 docker 镜像源配置
{
  "registry-mirrors": ["https://docker.xuanyuan.me"]
}

# 重新加载配置并重启 docker 确保配置生效
systemctl daemon-reload
systemctl restart docker

如果 docker 镜像源失效,需要自行百度并修改

5、镜像源无法生效问题

两种情况:

  • docker info 的输出中看不到配置的镜像源地址

  • docker info 的输出中有配置的镜像源地址,但是 docker pull 的时候,无法拉取并报错:

  • Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection 
    

可能的解决方法

# 1、按照下述命令执行
sudo systemctl stop docker.service
sudo systemctl stop docker.socket
sudo systemctl daemon-reload
sudo systemctl restart docker

# 2、执行完后如果还不行,就重启
# 3、直接用临时方法拉取,例如 docker pull docker.xuanyuan.me/mysql:5.7

二、正式安装

使用 kubeadm 安装 Kubernetes 的标准安装流程是:

  1. 安装 kubelet/kubeadm/kubectl;
  2. 运行 kubeadm init(主节点)或 kubeadm join(工作节点);
  3. kubeadm 会自动生成 kubelet 所需的配置,并自动启动和启用 kubelet 服务

1、安装 kubeadm、kubelet 和 kubectl

你需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

注意:kubeadm 不能帮你安装或者管理 kubeletkubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。即这三者的版本要一致。

安装步骤:

如下图所示,我们可以把 v1.24 及之后的版本叫做新版本。而 v1.24 之前的版本作为旧版本。从阿里的镜像网站上,可以看到新版和旧版的安装方式有很大差别。我这里安装的版本是 v1.23.5,属于旧版本。如果需要新版本的安装命令,请自行去阿里镜像网站查看(阿里镜像网站见参考)。

1、更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

sudo apt update

sudo apt install -y apt-transport-https ca-certificates curl gpg

2、下载用于 Kubernetes 软件包仓库的公共签名密钥:

  • 注意:
  • 如果 /etc/apt/keyrings 目录不存在,则应在 curl 命令之前创建它。
  • 因为:在低于 Debian 12 和 Ubuntu 22.04 的发行版本中,/etc/apt/keyrings 默认不存在。应在 curl 命令之前创建它。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

3、添加 Kubernetes apt 仓库:我这里使用的是阿里镜像源。我这里安装的由于版本过低,所以使用了如下命令;如果是新版本,请看好镜像网站的提示,一定检查 URL 中的版本号,将其修改为自己需要的版本。

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

# 添加镜像源后,记得更新
apt update

上述 update 的输出可能告警:

W: https://mirrors.aliyun.com/kubernetes/apt/dists/kubernetes-xenial/InRelease: 密钥存储在过时的 trusted.gpg 密钥环中(/etc/apt/trusted.gpg),请参见 apt-key(8) 的 DEPRECATION 一节以了解详情。

原因:

apt_key 模块的弃用:apt_key 模块使用的 apt-key 命令已被弃用,特别是在 Ubuntu 22.04 及更高版本中。将密钥添加到全局密钥环(如 /etc/apt/trusted.gpg)的方法已不再推荐。新的方法是将密钥存储在 /etc/apt/keyrings/ 目录中,并在存储库配置中指定密钥的位置。

解决:

将 /etc/apt/trusted.gpg 文件中的密钥依次导出到 /etc/apt/trusted.gpg.d/ 目录下即可。

# 查看 /etc/apt/trusted.gpg 文件的秘钥
apt-key list
# 使用如下秘钥导出
apt-key export DC6315A3 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/Artifact.gpg
apt-key export 13EDEF05 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/cloud-rapture.gpg
# 导出完毕后,删除 /etc/apt/trusted.gpg
rm /etc/apt/trusted.gpg
# 重新 update,发现警告消失了
apt update

4、安装:

# 查看可用版本是否存在
apt-cache madison kubelet kubectl kubeadm |grep '1.23.5-00' 
# 指定版本安装
apt install -y kubelet=1.23.5-00 kubectl=1.23.5-00 kubeadm=1.23.5-00

检查是否安装成功:

systemctl status kubelet

通常会显示 kubelet 服务处于 inactive (dead)activating (auto-restart) 状态,原因如下:

kubelet 默认不会自动启动

  • 安装 kubelet 包时,systemd 服务会被创建(/etc/systemd/system/kubelet.service),但默认不会启用(enable)也不会启动(start)
  • kubelet 需要有效的配置(如 /var/lib/kubelet/config.yaml 或通过命令行参数指定)才能正常运行。
  • kubeadm initkubeadm join 之前,通常没有生成这些配置,因此即使手动启动 kubelet,它也可能因缺少配置而崩溃或退出。
  • 所以这里显示 inactive (dead)activating (auto-restart) 状态是正常的

2、检查 cgroup 驱动

关于为什么要检查这部分可以参考我的另一篇博文:k8s 和容器运行时(Docker)、cgroup

我们需要检查:

  • 系统的 cgroup 版本

    • 检查命令:

      stat -fc %T /sys/fs/cgroup/
      
      • 输出 cgroup2fscgroup v2
      • 输出 tmpfscgroup v1
    • 是 cgroup v1 版本:推荐 k8s 和 docker 都使用 cgroupfs 驱动

    • 是 cgroup v2 版本:推荐 k8s 和 docker 都使用 systemd 驱动

  • k8s 的 cgroup 驱动

     # 查看 k8s 使用的 cgroup 驱动
     $ grep -i cgroup /var/lib/kubelet/config.yaml
     # 显示 systemd
     $ cgroupDriver: systemd
    
  • 容器运行时(docker)的 cgroup 驱动

      # 查看 docker 的 cgroup 驱动
      $ docker info | grep -i "cgroup driver"
      # 显示 systemd
      $ Cgroup Driver: systemd
    

不过,从如下两张图的官方文档来看,如果你的安装满足如下条件:

  • k8s:使用 kubeadm 安装且安装的版本高于 v1.22,并且没有特殊设置
  • docker:版本大于 20.10,且没有特殊设置

我觉得不需要检查了

k8s 关于容器运行时的文档
docker 20.10 版本更新文档

3、master 节点执行 init 命令

1、执行如下命令

kubeadm init \
  --kubernetes-version=v1.23.5 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.244.0.0/16 \

命令选项的说明:

–kubernetes-version:指定自己需要的版本

–image-repository:由于会下载镜像,所以指定阿里镜像仓库

–pod-network-cidr:由后面安装的网络插件决定

关于 CIDR:

在 Kubernetes 中,每个 Pod 都会被分配一个唯一的 IP 地址。这些 IP 不是从你主机的物理网络来的,而是来自一个虚拟的、集群内部专用的 IP 段 —— 这就是 --pod-network-cidr 指定的范围。

CIDR(Classless Inter-Domain Routing,无类别域间路由)是一种用于描述 IP 地址范围的表示方法。

格式为:

IP地址/前缀长度

例如:

  • 10.244.0.0/16
  • 192.168.0.0/24

含义解释:

  • /16 表示前 16 位是网络部分,剩下的 16 位用于主机(Pod)。
  • 所以 10.244.0.0/16 表示从 10.244.0.010.244.255.255 的所有 IP(共 65536 个地址)。
  • /24 表示前 24 位是网络部分,剩下 8 位用于主机,即 256 个 IP(如 192.168.1.0192.168.1.255)。

执行后报错:

root@r7000p-2025:/etc/default# kubeadm init \
  --kubernetes-version=v1.23.5 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.244.0.0/16 \
> 
[init] Using Kubernetes version: v1.23.5
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 28.5.1. Latest validated version: 20.10
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

错误1:[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist

上述错误信息表示/proc/sys/net/bridge/bridge-nf-call-iptables 这个文件不存在。

解决方案

步骤 1:加载 br_netfilter 内核模块

# 临时加载
sudo modprobe br_netfilter

# 永久生效(避免重启后失效)
echo "br_netfilter" | sudo tee /etc/modules-load.d/k8s.conf

modprobe br_netfilter 会创建 /proc/sys/net/bridge/... 相关文件。


步骤 2:启用必要的内核参数

# 创建配置文件
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 应用配置
sudo sysctl --system

这会确保:

  • bridge 流量经过 iptables(CNI 需要)
  • IP 转发开启(Pod 跨节点通信需要)

步骤 3:验证文件是否存在

ls /proc/sys/net/bridge/bridge-nf-call-iptables
# 应该输出:/proc/sys/net/bridge/bridge-nf-call-iptables

cat /proc/sys/net/bridge/bridge-nf-call-iptables
# 应该输出:1

如果输出是 1,说明已正确启用。

警告1:[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 28.5.1. Latest validated version: 20.10

警告表示虽然当前的错误与 Docker 版本无关,但 Kubernetes v1.23 是最后一个支持 Docker Engine(dockershim)的版本

  • v1.24+ 已彻底移除 dockershim,必须使用 containerd 或 CRI-O。
  • Docker 28.5.1 是新版,虽然 v1.23 理论上还能用,但存在潜在兼容性风险。

长期建议:

  • 学习/生产环境改用 containerd(更轻量、官方推荐)。
  • 或至少 不要升级 Docker 到 25+,如果坚持用 Docker,建议锁定在 20.10.x

解决方案:

参考官网的文档,我回退 docker 版本到 20.10.20 了

Uninstall Docker Engine

  1. Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:

     sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
  2. Images, containers, volumes, or custom configuration files on your host aren’t automatically removed. To delete all images, containers, and volumes:

     sudo rm -rf /var/lib/docker
     sudo rm -rf /var/lib/containerd
    
  3. Remove source list and keyrings

     sudo rm /etc/apt/sources.list.d/docker.list
     sudo rm /etc/apt/keyrings/docker.asc
    

You have to delete any edited configuration files manually.

init 命令成功后,记录如下信息用于后续安装:

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.243.129:6443 --token qho400.m2qeu1m0ek8spb8x \
	--discovery-token-ca-cert-hash sha256:8b79908d0f52e2b1b4bafff3812ab84c37f46ea25e8b3a61c87b388a24ea8179

2、配置用户的访问权限

上面保存的内容中有如下三条命令需要执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

解释:

可以看到后两条命令有 sudo,说明该命令是针对非 root 用户使用的。

大致作用:让当前非 root 用户能够使用 kubectl 以管理员身份操作 Kubernetes 集群。不过如果你此时的登录用户就是 root,那么它就是在配置 root 用户的权限了。

  • mkdir -p $HOME/.kube
    • .kubekubectl 默认查找配置文件的目录。
    • 在当前用户的家目录下创建 .kube 目录(用于存放 kubectl 的配置文件)
  • sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    • 将 Kubernetes 集群的管理员配置文件(由 kubeadm init 生成)复制为当前用户的 kubectl 配置文件。
    • 这一步让普通用户也能像管理员一样操作集群。
  • sudo chown $(id -u):$(id -g) $HOME/.kube/config
    • 将刚复制的 config 文件的所有者改为当前用户,避免权限问题。
    • 不修改的话,该用户登录下是无法读取上述由 sudo 复制来的配置文件(因为 sudo 命令下,其所有者是 root)
    • 改为当前用户后,kubectl 才能正常读取配置。

4、安装网络插件

如上图所示,有很多网络插件可以选择。

我这里选择安装 flannel

# 官网提供的 Kubernetes v1.17+ 的安装命令
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

两个问题:

1、可能会有网络问题导致这个yml文件下载不下来,可以提前下载好,传过去

2、这个命令会拉取镜像,可以使用如下命令查看安装进度:

# 查看命名空间是否有 kube-flannel
kubectl get ns
# 查看命名空间下是否有 pod 正在创建或者运行
kubectl get pod -n kube-flannel
# 查看 pod 的详细信息,kube-flannel-ds-5lp5v 是上面命令输出的 pod 名字
# 这个命令的输出最后应该是 events,可以在这里看到安装是在了哪一步
# 大多时候是拉取镜像的问题,百度一下应该能解决
kubectl describe pod kube-flannel-ds-5lp5v -n kube-flannel


# 安装好之后,重新查看 node 的状态
# 此时,应该只有一个 control-plane,master 节点,且为 ready
kubectl get node

小问题:

问1:为什么 Kubernetes(k8s)不自己开发一个官方的、内置的网络插件,而是依赖 CNI(Container Network Interface)和第三方插件(如 Flannel、Calico、Cilium 等)

1、Kubernetes 的核心设计哲学:“关注点分离”(Separation of Concerns)

Kubernetes 的目标是成为一个 通用的容器编排平台,而不是“包办一切”的系统。

  • 它专注于 调度、生命周期管理、服务发现、存储编排 等核心功能。
  • 网络、存储、运行时等底层能力,通过 标准化接口(如 CNI、CSI、CRI)交给社区或厂商实现

类比:Linux 内核不自己写所有硬件驱动,而是提供驱动框架,让硬件厂商自己实现。K8s 同理。

2、网络需求极其多样化

不同用户对网络的要求差异巨大:

场景 网络需求
开发测试 简单、轻量(如 Flannel)
企业生产 网络策略、安全隔离(如 Calico)
高性能/低延迟 eBPF 加速、绕过内核(如 Cilium)
多租户/公有云 与 VPC 集成、IPAM 管理(如 AWS VPC CNI)
服务网格集成 与 Istio 深度协同(Cilium 支持 L7 策略)

如果 Kubernetes 自己开发一个“万能”网络插件:

  • 要么功能臃肿,满足不了所有场景;
  • 要么功能简单,无法满足企业级需求。

ps:还有很多原因,可以问问 AI(这里就不水字数了)

问2:为什么先执行 kubeadm init 初始化控制平面,再安装网络插件(CNI)?

kubeadm init 会创建核心组件,但不会自动配置 Pod 网络

  • 它会启动 kube-apiserveretcdkube-controller-managerkube-scheduler
  • 它也会部署 kube-proxy 和 CoreDNS(作为 Pod 运行)。
  • 但 Pod 之间的网络通信依赖 CNI 插件,而 CNI 不是 kubeadm 自带的。

CNI 插件本身也是以 Pod 形式运行的

  • 比如 Flannel、Calico 都是通过 kubectl apply -f xxx.yaml 部署的 DaemonSet。
  • 这些 YAML 文件需要和已存在的 Kubernetes API 通信,所以 集群必须先初始化好。

5、添加 worker 节点

准备好另一台虚拟机,在其上面执行本文中如下的操作:

  • 一、准备工作
  • 二、正式安装
    • 1、安装 kubeadm、kubelet 和 kubectl
    • 2、检查 cgroup 驱动

在工作节点上执行如下命令,这个命令在 master 节点 init 成功后的输出内容中,请执行自己的命令

kubeadm join 192.168.243.129:6443 --token qho400.m2qeu1m0ek8spb8x \
	--discovery-token-ca-cert-hash sha256:8b79908d0f52e2b1b4bafff3812ab84c37f46ea25e8b3a61c87b388a24ea8179

执行成功的输出:

[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W1015 14:08:13.272692   65244 utils.go:69] The recommended value for "resolvConf" in "KubeletConfiguration" is: /run/systemd/resolve/resolv.conf; the provided value is: /run/systemd/resolve/resolv.conf
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

如下图所示。此时去 master 节点输入 kubectl get node,可能会看到刚加入的 worker 节点是 notReady,这是因为 k8s 在给新加入的节点创建一个用于通信的 pod,也就是需要拉取镜像,所以需要一定的时间。当该 pod 运行后,可以看到 worker 节点变为 ready 了。

至此,安装完毕

参考

[1] docker配置了daemon镜像源但未生效仍然走https://registry-1.docker.io/v2/解决方案

[2] 2025 最新 Docker 国内镜像源加速列表(10月13日更新)

[3] docker 官网

[4] k8s 文档官网

[5] 【k8s】手把手教学 — Ubuntu 一次成功安装 k8s集群

[6] Kubernetes 阿里镜像

[7] ubuntu apt 命令报错 Key is stored in legacy trusted.gpg keyring

[8] Docker CE 阿里镜像

[9] flannel

[10] 通义千问

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐