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