Схемы и шаблоны упрощают развертывание объектов K8s
Мы все слышали кошмарные страшилки о неудачных развертываниях Kubernetes. Попытка развернуть новую услугу или развертывание заканчивается катастрофой, поскольку поды начинают падать, а запросы начинают отбрасываться. Избежать хаоса в Kubernetes легче на словах, чем на деле.
Kubernetes — невероятно сложный и мощный зверь. Есть тонны и тонны уровней абстракции, каждый со своим собственным словарем терминов. Понимание каждой движущейся части K8s — огромная задача. Не только это, но и держать все в чистоте и порядке — это совершенно отдельная рутина.
Kubernetes работает на YAML. Вы развертываете сервисы и модули с помощью YAML, и источник истины для большинства развертываний сводится к YAML, работающему за кулисами. Управление гигантскими файлами YAML, заполненными различными объектами и повторяющимися операторами, — головная боль. К сожалению, нет хорошего способа сделать это нативно для Kubernetes. Вы не можете шаблонировать повторяющийся YAML, используя только kubectl
. Вот тут-то и пригодится Ansible.
В этой статье мы рассмотрим, как вы можете использовать Ansible для управления развертываниями K8s. Вы можете использовать мощный механизм шаблонов Ansible, чтобы держать вещи в порядке, имея при этом возможность использовать существующий инвентарь, групповые переменные и многое другое для максимальной гибкости.
Давайте посмотрим, как это работает.
Зависимости
Чтобы использовать модуль k8s
в Ansible, вам нужно сначала убедиться, что у вас есть несколько настроек:
- Установите Модуль Kubernetes Python
- Установите Kubectl и настройте его для подключения к желаемому кластеру (предполагается, что у вас уже есть работающий кластер Kubernetes с надлежащими учетными данными)
После того, как у вас есть эти настройки и kubectl
работает нормально, вы можете начать использовать модуль.
Создание базовой пьесы
Прежде чем мы начнем со спецификой K8s, нам нужно создать простую пьесу. Теперь давайте создадим новую базовую книгу игр:
# playbook.yml --- - name: deploy kubernetes objects hosts: localhost tasks: - debug: msg: "first task"
Это довольно стандартная игровая книга. Единственный важный момент, который следует помнить, это то, что мы нацелились на localhost
, потому что модуль будет использовать конфигурацию вашего локального компьютера для подключения к кластеру.
Это очень похоже на то, как вы развертываете объекты через kubectl
, за исключением того, что мы оборачиваем все в Ansible.
Запуск модуля
Теперь, когда у нас есть базовый план плейбука, мы можем начать добавлять дополнительные модули. Давайте заменим наш оператор отладки фактическим использованием модуля k8s
:
# playbook.yml --- - name: deploy kubernetes objects hosts: localhost tasks: - name: deploy services k8s: state: present definition: "{{ lookup('template', item) | from_yaml }}" with_fileglob: - ./*_service.j2
Давайте разберем, что именно происходит в этой новой задаче:
- Эта задача использует модуль
k8s
и позволяет вам выполнять действия с любым кластером, настроенным в данный момент на вашем локальном компьютере. - Мы говорим модулю
k8s
использовать определение YAML и развернуть все, что есть в этом определении, в кластере. - Мы перебираем все файлы шаблонов, оканчивающиеся на
_service.j2
, и развертываем их. Каждый цикл выполняет поиск шаблона с модулемfileglob
, нацеленным на определенные файлы. - Шаблон преобразуется в YAML для определения. Мы делаем это, чтобы использовать шаблоны и делать забавные вещи, такие как подстановка переменных, но переводить их обратно в необработанный YAML для окончательного применения.
Плейбук настроен, давайте перейдем к собственно шаблонам.
Создание шаблона определения службы
Давайте посмотрим, как мы можем создать шаблон для развертывания новой службы в нашем кластере. Ниже приведен пример того, что вы можете найти внутри test_service.j2
для нашего развертывания:
--- apiVersion: v1 kind: Service metadata: name: {{ test_service_name }}-svc namespace: {{ test_namespace }} spec: type: ClusterIP ports: - name: example-port protocol: TCP port: 12345
Кажется довольно простым, не так ли? Оно выглядит как обычное определение сервиса, за исключением того факта, что его можно шаблонировать. По умолчанию вы не можете сделать это с обычным K8s YAML, но когда это в шаблоне Ansible, вы можете.
Для простоты мы добавили только две переменные, но вы можете использовать любую форму логики шаблона Jinja2, как и другие шаблоны Ansible.
Добавление некоторых переменных
Прекрасным использованием переменных является служба name
и namespace
в нашем шаблоне. В шаблоне мы заменяем их переменными, которые введем из нашего плейбука. Давайте сделаем это сейчас:
# playbook.yml --- - name: deploy kubernetes objects hosts: localhost vars: test_service_name: test_service test_namespace: test_namespace tasks: - name: deploy services k8s: state: present definition: "{{ lookup('template', item) | from_yaml }}" with_fileglob: - ./*_service.j2
В разделе vars
нашей пьесы мы добавили две новые переменные. Ради этого примера все это самодостаточно в playbook. Если у вас уже есть обширная конфигурация Ansible, вы можете ссылаться на любые переменные, какие захотите. Это может быть host_vars
, group_vars
и т. д.
Собираем все вместе
Чтобы развернуть это, все, что вам нужно сделать, это запустить playbook:
ansible-playbook -i <inventory> ./playbook.yml
Определение службы должно быть применено, и с помощью kubectl
вы сможете увидеть новую службу в соответствующем пространстве имен:
kubectl get svc -n test_namespace
Если вы хотите удалить что-либо, что вы развернули с помощью этой пьесы, просто измените состояние задачи с present
на absent
. После повторного запуска playbook эти объекты должны быть удалены.
Кроме того, имейте в виду, что, поскольку мы нацелены только на localhost
в playbook, инвентарь на самом деле не используется для какой-либо информации о хосте или группе. Однако, если в вашем файле инвентаря определены глобальные переменные, это может повлиять на игру.
Последние мысли
В этом руководстве представлены две мощные идеи по развертыванию объектов Kubernetes с помощью Ansible:
- Во-первых, теперь вы можете СУШИТЬ YAML, питающие K8. Вы можете шаблонировать повторяющиеся части, использовать переменные и выполнять циклы. Все, что вы не могли легко сделать по умолчанию раньше.
- Следующая идея заключается в том, чтобы иметь возможность использовать процедурный сборник сценариев при развертывании. Больше никаких эфемерных команд
kubectl
. Теперь у вас есть пошаговая инструкция, показывающая, что именно произойдет и что уже произошло. Самое приятное то, что в плейбуке все будет упоминаться, и вы сможете откатить его еще проще, если возникнет проблема.
Теперь вы можете воспользоваться этими знаниями и сделать свои процессы Kubernetes чище, эффективнее и стабильнее, чем когда-либо.
Спасибо за прочтение! А пока вот еще несколько статей: