Kubespray(由 Kubernetes SIGs 维护)是一个功能强大的开源项目,它结合了 Ansible 剧本(Playbooks)和 kubeadm,用于部署、配置和管理生产级别的 Kubernetes 集群。
介绍
简单来说,如果需要在一堆裸机(Bare Metal)、虚拟机或公有云上自动化部署一个稳定、可定制的 Kubernetes 集群,Kubespray 是最主流的选择之一。
核心定位
Kubespray 的前身是 Kargo。它的目标是提供一种多云、跨发行版的部署方式,不绑定于特定的云服务商。它不仅负责安装 Kubernetes 组件,还负责配置操作系统环境、网络插件、存储插件以及各种附加组件。
核心技术栈
- Ansible: 整个项目的核心引擎,负责所有节点的自动化配置。
- kubeadm: Kubespray 内部调用 kubeadm 来执行集群的初始化和节点加入。
- Container Runtime: 支持 Docker, containerd, CRI-O。
- Python: 运行 Ansible 所需的环境。
适用场景
- 私有云/数据中心: 在物理服务器或 OpenStack/VMware 上构建 K8s。
- 混合云: 需要在不同环境下保持部署逻辑一致。
- 深度定制化: 需要对 K8s 参数、网络、插件进行精细化调整的生产环境。
主要特点
- 高度可定制: 你可以自由选择 CNI 网络插件(Calico, Flannel, Cilium, Weave 等)、CRI 运行时、日志收集方案等。
- 多操作系统支持: 支持 Ubuntu, Debian, CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, CoreOS 等。
- 多云平台支持: 可以在 AWS, GCE, Azure, OpenStack, vSphere 以及物理机上运行。
- 高可用性 (HA): 默认支持多 Master 节点的高可用架构。
- 幂等性: 基于 Ansible 的特性,多次运行剧本可以确保系统达到预定状态,方便进行扩容(Add nodes)或升级。
- 生命周期管理: 不仅支持安装,还支持集群的平滑升级、节点扩缩容和重置(清理)。
常见的网络插件支持
Kubespray 几乎涵盖了市面上所有的主流 CNI:
- Calico: 性能优秀,支持强大的网络策略(默认推荐)。
- Cilium: 基于 eBPF,适合高性能和安全需求。
- Flannel: 简单易用,适合初学者或简单场景。
- Canal/Weave/Kube-ovn 等。
Kubespray vs 其他工具
| 工具 |
优势 |
劣势 |
| kubeadm |
官方工具,轻量,适合基础安装。 |
仅负责集群初始化,不负责 OS 配置、HA 配置和网络插件安装。 |
| Kops |
对 AWS 支持极佳,自动化程度极高。 |
深度绑定云平台,对裸机支持较差。 |
| K3s/RKE |
安装速度快,资源消耗低,轻量化。 |
某些高级定制化场景不如 Kubespray 灵活。 |
| Kubespray |
极度灵活,支持物理机和多操作系统,适合复杂生产环境。 |
部署速度较慢(Ansible 慢),对 Ansible 有一定的学习门槛。 |
部署流程
使用 Kubespray 部署集群通常分为以下几步:
- 准备环境: 准备若干台 Linux 主机,配置 SSH 免密登录。
kubespray/contrib/offline 提供离线准备相关资源
- 克隆代码:
git clone https://github.com/kubernetes-sigs/kubespray.git。
- 配置 Inventory: 编写
inventory.ini 文件,定义哪些机器是 Master,哪些是 Worker,哪些是 Etcd。
- 修改变量: 根据需求修改
group_vars 下的配置文件(例如设置 K8s 版本、网络插件类型、代理服务器等)。
- 执行 Playbook: 运行
ansible-playbook -i inventory/mycluster/hosts.yml cluster.yml。
docker run --rm -it --mount type=bind,source="$(pwd)"/inventory/sample,dst=/inventory \
--mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa \
quay.io/kubespray/kubespray:v2.29.0 bash
# Inside the container you may now run the kubespray playbooks:
ansible-playbook -i /inventory/inventory.ini --private-key /root/.ssh/id_rsa cluster.yml
ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml \
-e kube_version=v1.31.0
ansible-playbook -i inventory/mycluster/hosts.yaml upgrade-cluster.yml \
-e kube_version=v1.31.0