С появлением в продуктивной среде Kubernetes, автоматизация расширяется с уровня хостов, кластеров и виртуальных машин, включая в себя объекты K8S: namespace, ingress, service, pod… Нужно ли создавать ещё одну систему автоматизации специально для Kubernetes или можно использовать vRealize Orchestrator, который уже интегрирован с Вашими информационными системами?
Рассмотрим совместную работу K8S и vRO на примере одной распространённой задачи: автоматизация создания DNS-записей для объектов namespace, ingress, service.
Решение в лоб – опрос кластеров по расписанию: подключиться к кластеру, собрать нужные данные об объектах, запустить процессы изменения DNS-записей. В небольшой инфраструктуре с редкими изменениями такой вариант вполне приемлем. Но этот подход имеет свои недостатки: с одной стороны, слишком частые опросы кластеров создают постоянную нагрузку на оркестраторе, с другой стороны, при более редких опросах, увеличивается время между изменением в кластере и обновлением DNS-записи.
Более правильно – отслеживать изменения изнутри кластера и, при наступлении определённых событий, вызывать процессы vRO.
VMware Watch-Proxy
Контейнер Watch-Proxy – часовой, который, находясь в кластере, будет внимательно следить за интересующими Вас ресурсами. При любом изменении (создание, модификация или удаление) Watch-Proxy отправит POST-запрос на указанный сервер. Тело запроса включает полный манифест, спецификацию и статус ресурса. Настройка работы Watch-Proxy делается через ConfigMap, в котором определяется какие типы ресурсов ему мониторить, какие данные и куда отправлять. Настройки в ConfigMap позволяют:
- сократить объём передаваемых данных, исключив ненужные поля;
- добавить произвольные метаданные к каждому запросу;
- задать список пространств имен для мониторинга;
- ограничить количество объектов, передаваемых одним запросом;
- установить частоту передачи данных;
- одновременно отправлять данные на несколько различных серверов и настроить для них разные наборы данных;
- фильтровать события.
Описание проекта: https://tanzu.vmware.com/content/blog/introducing-watch-proxy-a-beacon-to-gather-kubernetes-info-for-it-systems
Код и документация: https://github.com/vmware-tanzu/watch-proxy
Watch-Proxy и vRealize Orchestrator
Watch-Proxy легко собирается, легко настраивается, и сейчас всё работает так, как и должно. Но так было не всегда. Ещё совсем недавно vRealize Orchestrator на запрос от Watch-Proxy возвращал код 400 – Bad Request. Причина была в том, что процессы vRO имеют строго определённый формат входных данных. Например, структура данных для процесса с одним входным параметром input типа string выглядит так:
{
"parameters": [
{
"value": {
"string": {
"value": ""
}
},
"type": "string",
"name": "input"
}
]
}
Чтобы Watch-Proxy начал дружить с vRO, потребовалось поработать с его кодом и привести передаваемые данные в нужный формат. Все изменения в коде выполнены в файле emitter/emitter.go:
- добавлен новый тип vroInput, задающий структуру входных данных процесса vRO;
- описана функция EmitChangesVRO (на основе функции EmitChanges), которая подготавливает данные и отправляет их в оркестратор.
Сделанные мной изменения для работы с vRO, уже включены в основной код проекта Watch-Proxy: https://github.com/vmware-tanzu/watch-proxy. Файл примера конфигурации examples/watch-proxy-config.yaml содержит образец настройки Watch-Proxy для vRO: укажите адрес сервера, ID процесса и настройте учетные данные пользователя vRO.
При сборке контейнера добавьте в него свои сертификаты, если это необходимо. Либо можно (но не рекомендуется) полностью отключить проверку сертификатов. Для этого в emitter/emitter.go нужно добавить импорт модуля “crypto/tls” и перед вызовом http.NewRequest в функции EmitChangesVRO добавить следующую строку:
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
Настройка vRO
Настройка пользователя vRealize Orchestrator для запуска процессов через API для версии 8.1 (модифицированный Watch-Proxy будет работать как с 7й, так и с 8й версией vRO):
- в vIDM добавьте пользователя;
- в vRA в Identity & Access Management сделайте пользователя членом организации (Organization Member, дополнительные роли не требуются);
- в vRO в Administration -> Groups создайте новую группу;
- добавьте в группу Вашего пользователя с правом запуска процессов (Run) и выберите процессы, которые он сможет вызывать.
Процесс оркестратора получит от Watch-Proxy параметр input с JSON-строкой. Что с ней делать дальше – зависит от Ваших задач:
System.log(input); struct = JSON.parse(input); for each (obj in struct.data) { var clusterName = struct.meta.cluster; var objName = obj.data.metadata.name; var event = obj.event; if (obj.asset_type_id == "ns") { System.log("Изменение в namespaces кластера " + clusterName); System.log("Namesepace " + objName + " is (" + event + ")"); } if (obj.asset_type_id == "svc") { var svcIp = obj.data.spec.clusterIP; System.log("Изменение в services кластера " + clusterName); System.log("Service " + objName + " with IP " + svcIp + " (" + event + ")"); } }