Схемы и шаблоны упрощают развертывание объектов K8s

Мы все слышали кошмарные страшилки о неудачных развертываниях Kubernetes. Попытка развернуть новую услугу или развертывание заканчивается катастрофой, поскольку поды начинают падать, а запросы начинают отбрасываться. Избежать хаоса в Kubernetes легче на словах, чем на деле.

Kubernetes — невероятно сложный и мощный зверь. Есть тонны и тонны уровней абстракции, каждый со своим собственным словарем терминов. Понимание каждой движущейся части K8s — огромная задача. Не только это, но и держать все в чистоте и порядке — это совершенно отдельная рутина.

Kubernetes работает на YAML. Вы развертываете сервисы и модули с помощью YAML, и источник истины для большинства развертываний сводится к YAML, работающему за кулисами. Управление гигантскими файлами YAML, заполненными различными объектами и повторяющимися операторами, — головная боль. К сожалению, нет хорошего способа сделать это нативно для Kubernetes. Вы не можете шаблонировать повторяющийся YAML, используя только kubectl. Вот тут-то и пригодится Ansible.

В этой статье мы рассмотрим, как вы можете использовать Ansible для управления развертываниями K8s. Вы можете использовать мощный механизм шаблонов Ansible, чтобы держать вещи в порядке, имея при этом возможность использовать существующий инвентарь, групповые переменные и многое другое для максимальной гибкости.

Давайте посмотрим, как это работает.

Зависимости

Чтобы использовать модуль k8s в Ansible, вам нужно сначала убедиться, что у вас есть несколько настроек:

После того, как у вас есть эти настройки и 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 чище, эффективнее и стабильнее, чем когда-либо.

Спасибо за прочтение! А пока вот еще несколько статей: