Ansible 是一个自动化运维工具,用简单的 YAML 文件(Playbook)来描述任务。以下是 Kubespray 中涉及的 Ansible 核心概念详解:
1. Inventory(清单)
作用:定义你要管理的机器(节点)和分组。
Kubespray 中的例子:
文件路径:inventory/sample/inventory.ini
[all] node1 ansible_host=192.168.1.1 ip=192.168.1.1 node2 ansible_host=192.168.1.2 ip=192.168.1.2 [kube_control_plane] node1 [kube_node] node1 node2 [etcd] node1 [calico_rr] [k8s_cluster:children] kube_control_plane kube_node
[all]
:所有节点列表,包含 IP 和主机名。[kube_control_plane]
:Kubernetes Master 节点组。分组嵌套:
[k8s_cluster:children]
表示合并其他组的节点。
2. Playbook(剧本)
作用:定义在哪些节点上执行哪些任务(Tasks)。
Kubespray 主 Playbook:cluster.yml
- hosts: kube_node # 目标节点组(来自 Inventory) roles: - { role: container-engine, tags: container-engine } # 调用 Role - { role: kubernetes/node, tags: node } - hosts: kube_control_plane roles: - { role: kubernetes/control-plane, tags: master }
hosts
:指定对哪些节点组生效(如kube_node
)。roles
:调用具体功能模块(Role)。tags
:允许运行时选择性执行(如--tags=node
只部署 Node)。
3. Role(角色)
作用:将功能模块化(例如安装 Docker、部署 etcd)。
Kubespray 的 Role 结构(以 roles/etcd
为例):
roles/etcd/ ├── tasks/ # 任务定义 │ └── main.yml # 主任务文件 ├── defaults/ # 默认变量 │ └── main.yml # 如 `etcd_version` ├── templates/ # 配置文件模板 │ └── etcd.conf.j2 # Jinja2 模板 └── handlers/ # 触发动作(如重启服务) └── main.yml
示例任务文件:roles/etcd/tasks/main.yml
- name: Install etcd package apt: name: etcd version: "{{ etcd_version }}" when: ansible_os_family == "Debian" - name: Configure etcd template: src: etcd.conf.j2 dest: /etc/etcd/etcd.conf notify: restart etcd # 触发 handlers
apt
模块:安装指定版本的 etcd。template
模块:用 Jinja2 模板生成配置文件。notify
:任务完成后触发 handler(如重启服务)。
4. 变量(Variables)
作用:动态配置参数,优先级从低到高:
Role 默认值:
roles/xxx/defaults/main.yml
# roles/etcd/defaults/main.yml etcd_version: "3.5.0"
Inventory 变量:
inventory/mycluster/group_vars/all.yml
# 覆盖默认值 etcd_version: "3.5.4"
命令行覆盖:
ansible-playbook -i inventory.ini cluster.yml -e "etcd_version=3.5.6"
5. 关键概念对比
概念 | 作用 | Kubespray 示例 |
---|---|---|
Inventory | 定义节点和分组 | inventory.ini 中的 [kube_node] |
Playbook | 编排任务流程 | cluster.yml 调用多个 Role |
Role | 模块化功能(如安装 Docker) | roles/container-engine/ |
Task | 具体操作(如执行命令) | apt 安装软件包 |
Handler | 由 Task 触发的后续动作(如重启) | handlers/main.yml 重启服务 |
6. 快速实践建议
手动执行一个 Task:
ansible -i inventory.ini kube_node -m apt -a "name=docker-ce state=present"
-m
:指定模块(apt
)。-a
:模块参数(安装 Docker)。
调试 Playbook:
# 只运行 "container-engine" 相关的任务 ansible-playbook -i inventory.ini cluster.yml --tags=container-engine -vvv
-vvv
:输出详细日志。
常见问题
Q:Role 和 Playbook 的区别?
Playbook 是“总剧本”,定义从哪个节点开始执行哪些 Role。
Role 是“功能模块”,封装具体的安装/配置逻辑。
Q:如何自定义 Kubespray 的配置?
复制默认 Inventory:
cp -r inventory/sample inventory/mycluster
修改
inventory/mycluster/group_vars/k8s-cluster.yml
:kube_version: v1.28.0 docker_version: 20.10.0
掌握这些概念后,再读 Kubespray 代码会更清晰。