Найти в Дзене

Использование kubespray как ansible collection

Использование 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, это часть с реа

Использование 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