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/
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/17489.html