k8s如何添加物理机?

将物理机加入Kubernetes集群需确保其满足节点要求(如OS、容器运行时),通常使用kubeadm join命令或类似工具进行初始化,将其注册为工作节点,kubelet服务运行在物理机上并与控制平面通信,使其纳入集群管理范围,最后需验证节点状态为Ready

Kubernetes 无缝整合物理机:扩展集群的强大指南

当您的 Kubernetes 集群需要突破虚拟化的限制,拥抱更强大的裸金属计算能力时,将物理服务器(裸金属节点)纳入集群是至关重要的步骤,这为高性能计算、数据库负载、GPU密集型任务或追求极致性能的场景提供了理想的解决方案,以下是将物理机安全、高效加入K8s集群的完整流程与关键考量:

k8s如何添加物理机?

为何需要物理机加入K8s集群?

  • 极致性能: 消除虚拟化层开销,CPU、内存、磁盘I/O和网络性能直达硬件极限。
  • 硬件直通: 直接访问GPU、FPGA、高性能NVMe SSD、特殊网卡等物理设备。
  • 资源利用率: 针对特定重型负载,避免虚拟化资源分割的浪费。
  • 特殊许可/合规: 部分传统应用或授权要求部署在物理硬件上。
  • 成本优化: 对长期稳定运行的重负载,物理机总体拥有成本可能更低。

核心前提准备

  1. 操作系统一致性:

    • 物理机操作系统需与K8s集群现有节点兼容(推荐相同发行版和主要版本,如Ubuntu 20.04/22.04 LTS, CentOS 7/Stream 8/9, Flatcar Container Linux等)。
    • 保持内核版本接近,避免兼容性问题。
  2. 网络基础:

    • IP连通性: 物理机必须能与K8s Control Plane节点(API Server)双向通信,通常在同一二层网络或通过路由可达。
    • 主机名解析: 确保集群内节点(包括新物理机)能通过DNS或/etc/hosts正确解析彼此主机名。
    • 唯一主机名: 为物理机设置唯一且可解析的主机名。
    • 端口开放: 开放必要的K8s端口(如API Server 6443, etcd 2379/2380, kubelet 10250, kube-proxy 端口等),并配置防火墙规则(firewalld, ufw, iptables)。
  3. 容器运行时安装:

    • 在物理机上安装与集群一致的容器运行时:
      • containerd (推荐): sudo apt-get install containerdsudo yum install containerd
      • Docker Engine: 遵循Docker官方文档安装,并配置cgroupdriver=systemd(通常需修改/etc/docker/daemon.json)。
    • 启用并启动运行时服务:sudo systemctl enable --now containerdsudo systemctl enable --now docker
  4. 禁用Swap:

    • Kubernetes 强制要求禁用Swap以保证调度可靠性:
      sudo swapoff -a  # 临时禁用
      sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab  # 永久注释掉fstab中的swap行
  5. 内核模块与参数:

    • 加载必要模块(通常已包含):
      sudo modprobe overlay
      sudo modprobe br_netfilter
    • 配置sysctl参数(通常需写入/etc/sysctl.d/99-kubernetes-cri.confsysctl --system):
      cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
      net.bridge.bridge-nf-call-iptables  = 1
      net.bridge.bridge-nf-call-ip6tables = 1
      net.ipv4.ip_forward                 = 1
      EOF
      sudo sysctl --system

加入Kubernetes集群 (使用kubeadm)

  1. 安装kubeadm, kubelet, kubectl:

    k8s如何添加物理机?

    • 添加K8s官方源并安装:

      # 对于基于Debian的系统 (如Ubuntu)
      sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
      curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
      echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | 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  # 防止自动升级
      # 对于基于RPM的系统 (如CentOS/RHEL/Rocky)
      cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
      enabled=1
      gpgcheck=1
      gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
      EOF
      sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
      sudo systemctl enable --now kubelet
      sudo yum versionlock kubelet kubeadm kubectl  # 防止自动升级 (yum-plugin-versionlock)
  2. 获取加入命令 (在Control Plane节点执行):

    • 已有的Control Plane节点上,生成新的加入令牌(默认24小时有效):
      kubeadm token create --print-join-command
    • 输出类似于:kubeadm join :6443 --token --discovery-token-ca-cert-hash sha256:
  3. 在物理机上执行加入命令:

    • 将上一步生成的完整kubeadm join ...命令复制到物理机终端,以root或sudo权限执行。
    • 关键参数 (常需显式指定):
      • --node-name: 显式设置节点在K8s中的名称(强烈推荐)。
      • --apiserver-advertise-address: 如果物理机有多个IP,指定用于连接API Server的IP。
      • --cri-socket: 如果使用非默认路径的容器运行时(如unix:///run/containerd/containerd.sock)。
  4. 验证节点状态:

    • Control Plane节点或配置好kubectl的客户端执行:
      kubectl get nodes -o wide
    • 观察新物理机节点的状态,应很快变为 Ready,若为 NotReady,检查kubelet日志排查:
      sudo journalctl -xeu kubelet

关键注意事项与高级配置

  1. 节点标签与污点:

    • 物理机通常承载特殊负载,务必打上标签以便调度:
      kubectl label node  disktype=ssd gpu=true  # 示例
    • 如需独占节点,可添加污点防止普通Pod调度:
      kubectl taint node  dedicated=special:NoSchedule
  2. 存储配置:

    • 本地存储 (Local PV): 物理机本地SSD/HDD非常适合高性能本地存储卷。
    • 网络存储集成: 确保物理机能访问集群使用的NFS、Ceph RBD/CephFS、iSCSI、FC等存储后端。
  3. 硬件设备管理:

    • 设备插件 (Device Plugins): 对于GPU、FPGA、高性能网卡(如SR-IOV)等,需部署对应的K8s设备插件(如NVIDIA GPU Operator、Intel Device Plugins)使K8s能感知和调度这些资源。
  4. 安全加固:

    k8s如何添加物理机?

    • RBAC: 严格控制对物理机节点上敏感操作的访问权限。
    • Pod安全策略/PSA: 使用PodSecurity准入控制器限制节点上Pod的权限。
    • kubelet配置: 启用RotateKubeletClientCertificateRotateKubeletServerCertificate实现证书自动轮换。
  5. 网络插件兼容性:

    确保物理机满足所选CNI插件的要求(如Calico BGP对等、Flannel的vxlan后端网络可达性等)。

  6. 监控与日志:

    • 将物理机节点纳入集群监控体系(如Prometheus+Grafana),确保node-exporter等Agent正常运行。
    • 配置集中日志收集(如EFK/ELK Stack)收集物理机上的kubelet和容器运行时日志。

常见问题排查

  • 节点状态 NotReady
    • 检查kubelet服务状态与日志 (journalctl -xeu kubelet)。
    • 验证网络:物理机能否ping通API Server IP?能否解析API Server域名?端口是否开放?
    • 检查容器运行时状态 (systemctl status containerd/docker)。
    • 确认kubelet配置(/var/lib/kubelet/config.yaml)是否正确,特别是cgroupDriver是否与运行时一致(通常应为systemd)。
  • 加入令牌过期/无效: 在Control Plane节点使用kubeadm token create --print-join-command生成新令牌。
  • 证书问题: 检查/var/log/messageskubelet日志中是否有证书相关错误,可能需要清理/etc/kubernetes/pki(谨慎操作)或重新加入。
  • cgroup驱动不一致: 确保kubelet/var/lib/kubelet/config.yaml)和容器运行时(如/etc/containerd/config.toml中的SystemdCgroup = true,或Docker的"exec-opts": ["native.cgroupdriver=systemd"])都配置为systemd

将物理机整合进Kubernetes集群,解锁了裸金属的性能潜力,为关键业务和高性能应用提供了坚实基础,遵循上述步骤仔细准备、谨慎操作并关注安全与标签管理,您就能成功扩展集群的疆界,物理节点的加入,标志着您的K8s基础设施具备了处理最苛刻工作负载的能力。

参考文献与资源

  1. Kubernetes 官方文档 – 安装 kubeadm: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
  2. Kubernetes 官方文档 – 使用 kubeadm 创建集群: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
  3. Kubernetes 官方文档 – 管理节点: https://kubernetes.io/docs/concepts/architecture/nodes/
  4. containerd 安装文档: https://containerd.io/docs/getting-started/
  5. Kubernetes 设备插件框架: https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/17489.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月10日 01:10
下一篇 2025年6月10日 01:14

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN