TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #153 129
Использование kubespray как ansible collection

kubespray огромен и тащить его весь к себе в репозиторий смысла нет. Достаточно использовать его как ansible collection и переопределить в inventory только то, что нужно.

Пример структуры inventory:
├── k8s.cluster.1
│   ├── group_vars
│   │   ├── all
│   │   │   ├── all.yml
│   │   │   └── containerd.yml
│   │   ├── k8s_cluster
│   │   │   ├── addons.yml
│   │   │   ├── k8s-cluster.yml
│   │   │   └── kube_control_plane.yml
│   │   └── k8s_load_balancers.yml
│   └── hosts.yml
├── k8s.cluster.2
│   ├── group_vars
│   │   ├── all
│   │   │   ├── all.yml
│   │   │   └── containerd.yml
│   │   ├── k8s_cluster
│   │   │   ├── addons.yml
│   │   │   ├── k8s-cluster.yml
│   │   │   └── kube_control_plane.yml
│   │   └── k8s_load_balancers.yml
│   └── hosts.yml
├── README.md
├── requirements.txt
└── requirements.yml


По похожей схеме описываем любые кластера. Имена файлов такие же как и у kubespray, не считая k8s_load_balancers, это часть с реального проекта, но в данном посте можно не обращать на нее внимания.

В requirements.yml:
collections:
- name: https://github.com/kubernetes-sigs/kubespray
type: git
version: v2.27.0


Устанавливаем коллекцию:
ansible-galaxy install -r inventory/kubernetes/requirements.yml


В requirements.txt оригинальные python зависимости из kubespray:
ansible==9.13.0
# Needed for community.crypto module
cryptography==44.0.2
# Needed for jinja2 json_query templating
jmespath==1.0.1
# Needed for ansible.utils.ipaddr
netaddr==1.3.0


Далее дефолтный флоу из доки, для сетапа окружения:
python3 -m venv .kubespray
source .kubespray/bin/activate
pip install -U -r inventory/kubernetes/requirements.txt
pip install ruamel.yaml


Если у вас установлен ansible через пакетный менеджер дистрибутива, то могут возникнуть проблемы с путями до модулей. Пофиксить можно так:
export ANSIBLE_LIBRARY=./.kubespray/lib/python3.11/site-packages/ansible/modules
export ANSIBLE_MODULE_UTILS=./.kubespray/lib/python3.11/site-packages/ansible/module_utils
export PYTHONPATH=./.kubespray/lib/python3.11/site-packages:$PYTHONPATH


Версия питона само собой может отличаться.

Заполняем hosts.yml. Вообще в доке старый ini формат. Но я предпочитаю yml. Пример:
all:
hosts:
master-1:
ansible_host: <dns_name>
ip: <ip_address>
access_ip: <access_ip>
worker-1:
ansible_host: <dns_name>
ip: <ip_address>
access_ip: <access_ip>
node_labels:
node-role.kubernetes.io/worker: ""
ingress-1:
ansible_host: <dns_name>
ip: <ip_address>
access_ip: <access_ip>
node_labels:
node-role.kubernetes.io/ingress: ""
node_taints:
- "node-role.kubernetes.io/ingress=:NoSchedule"
children:
kube_control_plane:
hosts:
master-1:
kube_node:
hosts:
worker-1:
ingress-1:
etcd:
hosts:
master-1:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}


Установить кластер:
ansible-playbook -i inventory/kubernetes/<cluster>/hosts.yml --become --become-user=root playbooks/kubernetes.yml


Мой playbook:
- name: Install Kubernetes
ansible.builtin.import_playbook: kubernetes_sigs.kubespray.cluster


Чтобы добавить новую ноду, сначала добавить вот такой playbook:
- name: Gathering facts
ansible.builtin.import_playbook: kubernetes_sigs.kubespray.facts
tags: facts
when: "'facts' in ansible_run_tags"

- name: Scale the kubernetes cluster
ansible.builtin.import_playbook: kubernetes_sigs.kubespray.scale


Перед установкой рекомендуют собрать факты:
ansible-playbook -i inventory/kubernetes/<cluster>/hosts.yml --become --become-user=root playbooks/kuberentes_scale.yml --tags="facts"


И затем добавить ноду:
ansible-playbook -i inventory/kubernetes/<cluster>/hosts.yml --become --become-user=root playbooks/kuberentes_scale.yml --limit=<node_name>


Перед этим не забыв добавить ее по аналогии в hosts.yml

#kubernetes
  • 🔥 1
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →