本篇介绍三台服务器组织成一个集群。在 Master 节点上运行 kubeadm init 来创建集群的控制平面,然后在 两个 Worker 节点上运行 kubeadm join,把它们加入进来。
关于“控制平面”和“工作节点”
“控制平面”(Master)就是集群的“大脑”,负责指挥和调度;而“工作节点”(Worker)是“执行者”,负责实际运行应用。
网络插件(CNI)必须先于节点加入安装,Kubernetes 集群需要一个网络插件才能让不同节点上的容器互相通信。
先初始化 Master,然后安装网络插件,最后再将 Worker 节点加入集群。如果在网络插件安装好之前就加入了 Worker 节点,可能会一直处于 NotReady 状态,带来不必要的困惑。
初始化控制平面节点 (Master)
请在 Master 节点上执行以下操作。
kubeadm init 是创建集群的核心指令。为了适配 Calico,需要给它指定一个 IP 地址范围 (CIDR),让 Pod 能获得独立 IP。
将 Master 内网IP 替换为 Master 服务器的实际内网 IP(如 162.211.180.113)
sudo kubeadm init \
--apiserver-advertise-address=162.211.180.113 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.34.2 \
--pod-network-cidr=192.168.0.0/16
面命令中,--pod-network-cidr=192.168.0.0/16 是给 Pod 预留的 IP 段,这是 Calico 的默认工作模式,所以设置为 192.168.0.0/16 即可
这里我们遇到了一个报错:

WARNING: Couldn't create the interface... unknown service runtime.v1.RuntimeService
意思是 kubeadm 无法通过 CRI(容器运行时接口)与 containerd 正常通信。
常见原因:containerd 配置中 未启用 CRI 插件 或 配置未生效。
ERROR: /proc/sys/net/ipv4/ip_forward contents are not set to 1
内核 IP 转发未开启,Kubernetes 必须开启。虽然上篇配置过 net.ipv4.ip_forward = 1,可能没生效,或者配置文件有误。
开启 IP 转发(请在 Master 节点执行)
# 检查当前值,如果返回 0 说明未开启
cat /proc/sys/net/ipv4/ip_forward
# 如果为 0,执行以下命令立即开启
echo 1 > /proc/sys/net/ipv4/ip_forward
# 同时写入 sysctl 配置文件,保证重启后依然生效
cat <<EOF | tee /etc/sysctl.d/99-ipforward.conf
net.ipv4.ip_forward = 1
EOF
# 重新加载所有 sysctl 配置
sysctl --system
修复 containerd 的 CRI 配置
一些教程里 containerd config default 生成的配置默认是启用了 CRI 插件的,但遇到的报错提示 unknown service runtime.v1.RuntimeService,很可能是因为 containerd 没有加载 CRI 插件。
检查并强制让 containerd 启用 CRI:
# 1. 检查 containerd 是否正在运行
systemctl status containerd
# 2. 重新生成一份干净的配置文件(确保包含 CRI 插件)
containerd config default > /etc/containerd/config.toml
# 3. 启用 SystemdCgroup(K8s 推荐)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 4. (可选)如果国内服务器,可以添加镜像加速,但不是解决 CRI 问题的关键
# 5. 重启 containerd
systemctl restart containerd
# 6. 确认 containerd 的 CRI 插件已加载(检查日志)
journalctl -u containerd -n 50 | grep -i "cri"

国内服务器特别优化:使用镜像仓库
--image-repository=registry.aliyuncs.com/google_containers 参数使用阿里云的镜像仓库来拉取 Kubernetes 核心组件所需的镜像。
初始化成功后,终端会输出类似下面的成功信息以及一个kubeadm join命令:
Your Kubernetes control-plane has been 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
You can now join any number of worker nodes by running the following on each as root:
kubeadm join <MASTER内网IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

务必将这段 kubeadm join 命令完整地保存,因为后面需要使用。
配置 kubectl 命令行工具
为了使 kubectl 能正常与集群通信,需要配置一下它的认证信息。在 Master 节点上,以普通用户身份或者root执行上一步输出的前三条命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置完成后,用 kubectl get nodes 查看节点状态。此时 Master 状态可能是 NotReady,这是正常的,因为网络插件还没装。
安装 Calico 网络插件 (CNI)
现在,在 Master 节点上,用 kubectl 安装 Calico 网络插件。
#直接安装 Calico 整合文件
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml
#观察状态
watch kubectl get pods -n kube-system
#如果有问题可以进行卸载:
kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml
Calico 的 Pod 和 DaemonSet 会被创建到 kube-system 命名空间下,为网络功能做好准备。用下面的命令观察它们的状态,直到所有 Pod 都变成 Running:

当 calico-node 和 calico-kube-controllers 等 Pod 都显示为 Running 后(大约需要一两分钟),可以按 Ctrl+C 退出监控。
再次使用 kubectl get nodes 检查 Master 节点状态,此时会变成 Ready。这标志着控制平面已准备就绪。
加入 Worker 节点
分别在两台 Worker 节点上,以 root 用户执行之前保存的那条 kubeadm join 命令。
在 Worker 节点上执行开启 IP 转发:
# 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启(重启后也生效)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 确认 containerd 的 SystemdCgroup 已启用
grep SystemdCgroup /etc/containerd/config.toml
#如果返回的不是SystemdCgroup = true,执行:
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
# 再次执行执行 join 命令,就是之前kubeadm输出的内容
sysctl -p
kubeadm join <MASTER内网IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# 如果忘记了 token,可以用以下命令在 Master 节点重新生成
kubeadm token create --print-join-command
这里如果遇到报错:
[preflight] Running pre-flight checks
error: error execution phase preflight: couldn't validate the identity of the API Server: failed to request the cluster-info ConfigMap: Get "https://162.211.180.113:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
To see the stack trace of this error execute with --v=5 or higher
检查master节点的端口是否有开放,如没有开放,请在防火墙添加相应的规则或者在master服务器控制台安全组或防火墙添加开放端口
telnet 162.211.180.112 6443
或者尝试22端口是否通
telnet 162.211.180.112 22

成功后返回 Master 节点,再次运行 kubectl get nodes,此时所有三台服务器的状态都是 Ready,至此完成了集群搭建。

常见问题和解决方法:
节点状态持续为 NotReady:常见原因是网络插件未就绪或未安装。确保 在加入 Worker 节点之前已安装 Calico。可以检查 kubectl get pods -n kube-system 下所有 Pod 的状态。
kubeadm init 命令报错:检查命令中的 --apiserver-advertise-address 参数是否填写为正确的内网 IP。如果某一步操作出错,可以先执行 kubeadm reset 清理当前状态,再重新尝试。
kubeadm join 失败:常见原因是 token 已过期(默认24小时时效)。在 Master 上生成新 token 并重新尝试。确保 Worker 节点能通过内网 IP 和端口(6443)与 Master 通信,并且 containerd 服务正在运行。
Pod 无法启动或网络不通:检查 calico-node Pod 是否正常。如果状态异常,可以尝试重启节点或重新应用 Calico 配置。
本章总结:
初始化:在 Master 节点运行 kubeadm init,初始化集群的控制平面,并配置了 kubectl。
部署网络:安装了 Calico 网络插件,打通了 Pod 间的网络通信。
加入节点:在 Worker 节点上运行 kubeadm join 命令,将工作节点成功加入集群。
在下篇,正式进入这个集群的“使用”环节。创建一个应用示例,将其打包成镜像并部署到集群里运行。
本文最后更新时间 2026-06-02
文章链接地址:https://yrajsh.cn/index.php/archives/85/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处