集群搭建:初始化master、安装Calico网络插件、加入worker节点、验证集群(K8S中篇)

本篇介绍三台服务器组织成一个集群。在 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 即可

这里我们遇到了一个报错:

image.png

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.png

国内服务器特别优化:使用镜像仓库

--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>

image.png

务必将这段 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:

image.png

当 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

image.png

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

image.png

常见问题和解决方法:

节点状态持续为 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/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处

文章附件
  • 暂无附件
希望可以帮助到你

留言