16.2.2 集群初始化与节点加入流程

集群初始化与节点加入是Kubernetes安装流程的核心环节。本节以 kubeadm 为主线,给出原理流程图、完整命令示例、验证与排错步骤,并提供练习任务,便于形成标准化操作。

文章图片

初始化前检查清单与示例(以 Ubuntu 为例):

# 1) 基础信息检查
hostnamectl
timedatectl status
free -h
df -h

# 2) 关闭交换分区(K8s要求)
swapoff -a
sed -i '/swap/d' /etc/fstab

# 3) 内核模块与参数(CNI/iptables需要)
cat <<'EOF' >/etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

cat <<'EOF' >/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
sysctl --system

# 4) 安装容器运行时(containerd)
apt-get update
apt-get install -y containerd
containerd config default >/etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd && systemctl enable containerd

# 5) 安装kubeadm/kubelet/kubectl(示例为1.28)
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/k8s.gpg
echo "deb [signed-by=/etc/apt/keyrings/k8s.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" >/etc/apt/sources.list.d/k8s.list
apt-get update
apt-get install -y kubeadm kubelet kubectl
apt-mark hold kubeadm kubelet kubectl

控制平面初始化(示例配置与命令):

# /root/kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
imageRepository: registry.aliyuncs.com/google_containers
controlPlaneEndpoint: "10.0.0.10:6443"
networking:
  podSubnet: "10.244.0.0/16"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
  criSocket: "unix:///run/containerd/containerd.sock"
# 初始化控制平面
kubeadm init --config /root/kubeadm-init.yaml --upload-certs

# 配置kubectl访问
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 部署网络插件(以Flannel为例)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

初始化成功后会输出 join 命令。示例解释:
- --token:节点加入集群的认证令牌
- --discovery-token-ca-cert-hash:校验控制平面CA证书,防止中间人攻击
- --control-plane --certificate-key:控制平面节点加入时需要

# 工作节点加入示例(在工作节点执行)
kubeadm join 10.0.0.10:6443 \
  --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:9a0b...c1de

# 若要加入为控制平面节点(HA)
kubeadm join 10.0.0.10:6443 \
  --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:9a0b...c1de \
  --control-plane --certificate-key 1234567890abcdef1234567890abcdef

节点加入后的验证与预期效果:

# 查看节点状态,期望所有节点为 Ready
kubectl get nodes -o wide

# 查看核心组件
kubectl -n kube-system get pods -o wide

# 验证DNS
kubectl run dns-test --image=busybox:1.36 -it --rm --restart=Never \
  -- nslookup kubernetes.default

# 验证跨节点通信(创建两个Pod并互ping)
kubectl run p1 --image=busybox:1.36 -it --rm --restart=Never -- sh
# 在Pod内执行:ping <另一Pod的IP>

常见排错思路与命令(针对 join 失败或 NotReady):

# 1) kubelet日志
journalctl -u kubelet -f

# 2) 容器运行时状态
crictl info
crictl ps -a

# 3) 证书与token
kubeadm token list
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -dates

# 4) 节点网络与CNI
ls /etc/cni/net.d/
kubectl -n kube-system get pods -l app=flannel -o wide

典型问题与处理示例:
- token过期:重新生成并在工作节点重试

kubeadm token create --print-join-command
  • kubelet无法启动:检查 cgroup 与 containerd 配置是否启用 SystemdCgroup
grep SystemdCgroup /etc/containerd/config.toml
systemctl restart containerd kubelet
  • CNI未就绪导致NotReady:重新应用网络插件或检查PodCIDR是否一致
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

离线镜像与版本固定建议(示例):

# 查看需要的镜像列表
kubeadm config images list --config /root/kubeadm-init.yaml

# 预拉取镜像(指定仓库)
kubeadm config images pull --config /root/kubeadm-init.yaml

练习与巩固:
1. 使用 kubeadm 初始化单控制平面集群,并加入2个工作节点,确保所有节点 Ready。
2. 人为删除 CNI 配置文件,观察节点 NotReady 的表现并恢复。
3. 手动让 token 过期后重新生成 join 命令并完成节点加入。
4. 输出一份标准化初始化文档(含版本、镜像源、命令与检查项)。