上一篇                     
               
			  k8s如何添加物理机?
- 物理机
- 2025-06-10
- 4795
 将物理机加入Kubernetes集群需确保其满足节点要求(如OS、容器运行时),通常使用
 
 
kubeadm join命令或类似工具进行初始化,将其注册为工作节点,kubelet服务运行在物理机上并与控制平面通信,使其纳入集群管理范围,最后需验证节点状态为
 Ready。
Kubernetes 无缝整合物理机:扩展集群的强大指南
当您的 Kubernetes 集群需要突破虚拟化的限制,拥抱更强大的裸金属计算能力时,将物理服务器(裸金属节点)纳入集群是至关重要的步骤,这为高性能计算、数据库负载、GPU密集型任务或追求极致性能的场景提供了理想的解决方案,以下是将物理机安全、高效加入K8s集群的完整流程与关键考量:
为何需要物理机加入K8s集群?
- 极致性能: 消除虚拟化层开销,CPU、内存、磁盘I/O和网络性能直达硬件极限。
- 硬件直通: 直接访问GPU、FPGA、高性能NVMe SSD、特殊网卡等物理设备。
- 资源利用率: 针对特定重型负载,避免虚拟化资源分割的浪费。
- 特殊许可/合规: 部分传统应用或授权要求部署在物理硬件上。
- 成本优化: 对长期稳定运行的重负载,物理机总体拥有成本可能更低。
核心前提准备
-  操作系统一致性: - 物理机操作系统需与K8s集群现有节点兼容(推荐相同发行版和主要版本,如Ubuntu 20.04/22.04 LTS, CentOS 7/Stream 8/9, Flatcar Container Linux等)。
- 保持内核版本接近,避免兼容性问题。
 
-  网络基础: - IP连通性: 物理机必须能与K8s Control Plane节点(API Server)双向通信,通常在同一二层网络或通过路由可达。
- 主机名解析: 确保集群内节点(包括新物理机)能通过DNS或/etc/hosts正确解析彼此主机名。
- 唯一主机名: 为物理机设置唯一且可解析的主机名。
- 端口开放: 开放必要的K8s端口(如API Server 6443, etcd 2379/2380, kubelet 10250, kube-proxy 端口等),并配置防火墙规则(firewalld,ufw,iptables)。
 
-  容器运行时安装: - 在物理机上安装与集群一致的容器运行时: 
    - containerd (推荐): sudo apt-get install containerd或sudo yum install containerd
- Docker Engine: 遵循Docker官方文档安装,并配置cgroupdriver=systemd(通常需修改/etc/docker/daemon.json)。
 
- containerd (推荐): 
- 启用并启动运行时服务:sudo systemctl enable --now containerd或sudo systemctl enable --now docker
 
- 在物理机上安装与集群一致的容器运行时: 
    
-  禁用Swap: - Kubernetes 强制要求禁用Swap以保证调度可靠性: sudo swapoff -a # 临时禁用 sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab # 永久注释掉fstab中的swap行 
 
- Kubernetes 强制要求禁用Swap以保证调度可靠性: 
-  内核模块与参数:  - 加载必要模块(通常已包含): sudo modprobe overlay sudo modprobe br_netfilter 
- 配置sysctl参数(通常需写入/etc/sysctl.d/99-kubernetes-cri.conf并sysctl --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)
-  安装kubeadm, kubelet, kubectl: -  添加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) 
 
-  
-  获取加入命令 (在Control Plane节点执行): - 在已有的Control Plane节点上,生成新的加入令牌(默认24小时有效): kubeadm token create --print-join-command 
- 输出类似于:kubeadm join :6443 --token --discovery-token-ca-cert-hash sha256:
 
- 在已有的Control Plane节点上,生成新的加入令牌(默认24小时有效): 
-  在物理机上执行加入命令: - 将上一步生成的完整kubeadm join ...命令复制到物理机终端,以root或sudo权限执行。
- 关键参数 (常需显式指定): 
    - --node-name: 显式设置节点在K8s中的名称(强烈推荐)。
- --apiserver-advertise-address: 如果物理机有多个IP,指定用于连接API Server的IP。
- --cri-socket: 如果使用非默认路径的容器运行时(如- unix:///run/containerd/containerd.sock)。
 
 
- 将上一步生成的完整
-  验证节点状态:  - 在Control Plane节点或配置好kubectl的客户端执行:kubectl get nodes -o wide 
- 观察新物理机节点的状态,应很快变为 Ready,若为NotReady,检查kubelet日志排查:sudo journalctl -xeu kubelet 
 
- 在Control Plane节点或配置好
关键注意事项与高级配置
-  节点标签与污点: - 物理机通常承载特殊负载,务必打上标签以便调度: kubectl label node disktype=ssd gpu=true # 示例 
- 如需独占节点,可添加污点防止普通Pod调度: kubectl taint node dedicated=special:NoSchedule 
 
- 物理机通常承载特殊负载,务必打上标签以便调度: 
-  存储配置: - 本地存储 (Local PV): 物理机本地SSD/HDD非常适合高性能本地存储卷。
- 网络存储集成: 确保物理机能访问集群使用的NFS、Ceph RBD/CephFS、iSCSI、FC等存储后端。
 
-  硬件设备管理: - 设备插件 (Device Plugins): 对于GPU、FPGA、高性能网卡(如SR-IOV)等,需部署对应的K8s设备插件(如NVIDIA GPU Operator、Intel Device Plugins)使K8s能感知和调度这些资源。
 
-  安全加固: - RBAC: 严格控制对物理机节点上敏感操作的访问权限。
- Pod安全策略/PSA: 使用PodSecurity准入控制器限制节点上Pod的权限。
- kubelet配置: 启用RotateKubeletClientCertificate和RotateKubeletServerCertificate实现证书自动轮换。
 
-  网络插件兼容性:  确保物理机满足所选CNI插件的要求(如Calico BGP对等、Flannel的vxlan后端网络可达性等)。 
-  监控与日志: - 将物理机节点纳入集群监控体系(如Prometheus+Grafana),确保node-exporter等Agent正常运行。
- 配置集中日志收集(如EFK/ELK Stack)收集物理机上的kubelet和容器运行时日志。
 
- 将物理机节点纳入集群监控体系(如Prometheus+Grafana),确保
常见问题排查
- 节点状态 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/messages或kubelet日志中是否有证书相关错误,可能需要清理/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基础设施具备了处理最苛刻工作负载的能力。
参考文献与资源
- Kubernetes 官方文档 – 安装 kubeadm: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- Kubernetes 官方文档 – 使用 kubeadm 创建集群: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
- Kubernetes 官方文档 – 管理节点: https://kubernetes.io/docs/concepts/architecture/nodes/
- containerd 安装文档: https://containerd.io/docs/getting-started/
- Kubernetes 设备插件框架: https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/
 
  
			