温馨提示×

Kubernetes 节点如何在 Ubuntu 上扩展

小樊
47
2026-01-07 03:29:21
栏目: 智能运维

在 Ubuntu 上扩展 Kubernetes 节点的实操指南

一 规划与前置检查

  • 准备一台或多台运行 Ubuntu 20.04/22.04 的新机器,确保与现有集群网络互通(同一二层/三层网段或可达的 Pod CIDR/Service CIDR),并具备可用的 SSH 访问与 sudo 权限。
  • 规划节点角色与资源:新增 workercontrol-plane(如需高可用)。
  • 统一 /etc/hosts 或使用 DNS,确保主机名可解析;所有节点时间同步(如 chrony)。
  • 规划安全组/防火墙放通:至少放通 22/TCP(SSH)、6443/TCP(Kube-apiserver)、10250/TCP(Kubelet)、30000–32767/TCP(NodePort)、以及所用 CNI 所需端口(如 Calico:179/TCP、5473/TCP、4789/UDP)。
  • 准备加入命令:在控制平面节点生成一次性 tokenCA 证书哈希,或复用现有有效 bootstrap token
  • 确认现有集群使用的 容器运行时(如 containerdDocker),新节点需保持一致。

二 在新节点上安装与初始化

  • 关闭 Swap(Kubelet 要求):
    • 临时:sudo swapoff -a
    • 永久:sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  • 加载内核模块与网络参数:
    • 模块:sudo modprobe overlay && sudo modprobe br_netfilter
    • Sysctl:sudo tee /etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 net.ipv4.ip_forward=1 EOF && sudo sysctl --system
  • 安装容器运行时(以 containerd 为例):
    • 安装:sudo apt-get update && sudo apt-get install -y containerd
    • 生成默认配置并启用 SystemdCgroup:sudo containerd config default | sudo tee /etc/containerd/config.toml && sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
    • 启动:sudo systemctl enable --now containerd
  • 安装 kubeadm/kubelet/kubectl(版本保持一致):
    • 添加源并安装:sudo apt-get update && sudo apt-get install -y apt-transport-https curl && curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-keyring.gpg && echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl && sudo apt-mark hold kubelet kubeadm kubectl
  • 启动 kubelet:sudo systemctl enable --now kubelet

三 将节点加入集群

  • 在控制平面生成加入命令(示例):
    • kubeadm token create --print-join-command(一次性 token–discovery-token-ca-cert-hash
    • 若使用 控制平面端点(如 –control-plane-endpoint),在命令中加入 --control-plane 参数以新增 master 节点。
  • 在新节点执行输出的 kubeadm join … 命令,等待拉起 kubelet 与容器。
  • 在控制平面验证:kubectl get nodes -o wide,确认新节点状态为 Ready

四 节点就绪后的常用配置

  • 打标签与污点(示例):
    • 角色标签:kubectl label nodes <node-name> node-role.kubernetes.io/worker=
    • 污点与容忍(如需专用节点):kubectl taint nodes <node-name> key=value:NoSchedule;在 Pod 上配置相应 tolerations
  • 调度控制:
    • 节点选择器:nodeSelector
    • 亲和性:nodeAffinity
    • 反亲和性:podAntiAffinity(提升高可用分布)
  • 验证示例:部署 Nginx 并观察是否调度到新节点
    • kubectl create deployment nginx --image=nginx --replicas=2
    • kubectl get pods -o wide

五 批量扩展与常见问题

  • 批量添加:在控制平面生成一次加入命令,使用 Ansible/Shell 将命令分发到多台新节点并行执行,完成后统一 kubectl get nodes 校验。
  • 常见问题排查:
    • 节点 NotReady:检查 containerd/kubelet 状态、镜像拉取、容器网络(如 Calico/Flannel Pod 是否 Running)、以及 CNI 所需端口防火墙 策略。
    • 加入失败:确认 token 未过期、CA 证书哈希 正确、系统时间同步、以及 /etc/hosts/DNS 解析正常。
    • 端口放通:至少确保 22/TCP、6443/TCP、10250/TCP、30000–32767/TCP 与所用 CNI 端口(如 179/TCP、5473/TCP、4789/UDP)已放行。

0