Несколько месяцев назад я рассказывал вам о выходе новой службы экземпляров контейнеров Azure (Azure Container Instances, ACI), которая максимально упрощает развёртывание контейнеров. Сегодня речь пойдёт о коннекторе Azure Container Instances для Kubernetes, который позволяет развертывать экземпляры службы контейнеров Azure в кластерах Kubernetes.
Этот коннектор является экспериментальным и его не следует использовать для реальных проектов.
Такой подход позволяет практически мгновенно выделять кластеру необходимые ресурсы, избавляя администратора от необходимости управлять инфраструктурой ВМ и позволяя ему продолжать использовать Kubernetes API. В кластере Kubernetes можно одновременно использовать виртуальные машины и экземпляры контейнеров, тем самым получая преимущества обеих технологий.
Принципы работы
Грубо говоря, коннектор ACI Connector имитирует интерфейс Kubelet следующим образом:
- регистрируется в Kubernetes как узел (node) с неограниченными ресурсами;
- отправляет поды (pod) на исполнение в службу экземпляров контейнеров Azure вместо нод на виртуальных машин.
После того как коннектор регистрируется в качестве узла с именем aci-connector, можно указать nodeName: aci-connector в конфигурации пода, чтобы запустить его через службу экземпляров контейнеров Azure. Поды, в конфигурации которых этот узел не указан, запускаются по расписанию в обычном режиме. Ниже даны инструкции по использованию соединителя ACI Connector и планировщика Kubernetes с помощью ограничений и допусков(taints и tolerations).
Требования
- Работающий клиент командной строки az — установить Azure CLI 2.0.
- Кластер Kubernetes с рабочим kubectl — настроить кластер Kubernetes в Azure.
Текущие возможности
В дополнении к примерам на текущий момент поддерживаются следующие функции Kubernetes, если они определены в манифесте пода. По мере расширения возможностей коннектора aci-connector этот список будет изменяться.
- Переменные среды
- Команды
- ImagePullSecret
- Azure Files Shared в качестве томов
Текущие ограничения
Следующие функции Kubernetes в настоящее время не поддерживаются коннектором aci-connector:
- ConfigMaps
- Secrets
- ServiceAccounts
- Volumes
- kubectl logs
- kubectl exec
Как быстро попробовать
- Отредактируйте файл examples/aci-connector.yaml и укажите переменные среды.
- Запустите коннектор ACI Connector командой kubectl create -f examples/aci-connector.yaml.
- Дождитесь, пока команда kubectl get nodes отобразит узел aci-connector.
- Запустите под NGINX через ACI командой kubectl create -f examples/nginx-pod.yaml.
- Откройте под NGINX с помощью его общедоступного адреса.
Пошаговая инструкция
Создайте группу ресурсов
Коннектор ACI Connector создаст каждый экземпляр контейнера в указанной группе ресурсов. Новую группу ресурсов можно создать следующей командой:
$ az group create -n aci-test -l westus
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/aci-test",
"location": "westus",
"managedBy": null,
"name": "aci-test",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
Отредактируйте examples/aci-connector.yaml и укажите имя группы ресурсов в переменной среды ACI_RESOURCE_GROUP.
Создайте Service Principal
Service Principal необходим для создания ресурсов в вашей подписке Azure с помощью коннектора ACI Connector. Создать Service Principal можно с помощью Azure CLI в соответсвии с инструкцией ниже.
Найдите subscriptionId с помощью Azure CLI:
$ az account list -o table
Name CloudName SubscriptionId State IsDefault
----------------------------------------------- ----------- ------------------------------------ ------- -----------
Pay-As-You-Go AzureCloud 12345678-9012-3456-7890-123456789012 Enabled True
С помощью az создайте субъекта-службу, который будет оперировать вашей подпиской:
$ az ad sp create-for-rbac --role=Contributor --scopes /subscriptions/<subscriptionId>/
{
"appId": "<redacted>",
"displayName": "azure-cli-2017-07-19-19-13-19",
"name": "http://azure-cli-2017-07-19-19-13-19",
"password": "<redacted>",
"tenant": "<redacted>"
}
Отредактируйте файл examples/aci-connector.yaml и введите переменные среды, используя указанные выше значения:
- AZURE_CLIENT_ID: введите идентификатор приложения appId.
- AZURE_CLIENT_KEY: введите пароль.
- AZURE_TENANT_ID: укажите тенант.
- AZURE_SUBSCRIPTION_ID: введите идентификатор подписки subscriptionId.
Убедитесь, что провайдер Microsoft.ContainerInstance зарегистрирован
$ az provider list -o table | grep ContainerInstance
Microsoft.ContainerInstance NotRegistered
Если поставщик не зарегистрирован, то зарегистрируйте его с помощью команды:
$ az provider register -n Microsoft.ContainerInstance
$ az provider list -o table | grep ContainerInstance
Microsoft.ContainerInstance Registered
Установите коннектор ACI Connector
$ kubectl create -f examples/aci-connector.yaml
deployment "aci-connector" created
$ kubectl get nodes -w
NAME STATUS AGE VERSION
aci-connector Ready 3s 1.6.6
k8s-agentpool1-31868821-0 Ready 5d v1.7.0
k8s-agentpool1-31868821-1 Ready 5d v1.7.0
k8s-agentpool1-31868821-2 Ready 5d v1.7.0
k8s-master-31868821-0 Ready,SchedulingDisabled 5d v1.7.0
Установите соединитель ACI Connector с Helm (опционально)
Сначала укажите значения в файле values.yaml, находящемся в каталоге /charts/aci-connector.
Затем можно установить чарт:
$ helm install --name my-release ./charts/aci-connector
Значения также можно задать из командной строки, при этом все значения, указанные в файле values.yaml, будут перезаписаны:
$ helm install --name my-release --set env.azureClientId=YOUR-AZURECLIENTID,env.azureClientKey=YOUR-AZURECLIENTKEY,env.azureTenantId=YOUR-AZURETENANTID,env.azureSubscriptionId=YOUR-AZURESUBSCRIPTIONID,env.aciResourceGroup=YOUR-ACIRESOURCEGROUP,env.aciRegion=YOUR-ACI-REGION ./charts/aci-connector
Установите пример c NGINX
$ kubectl create -f examples/nginx-pod.yaml
pod "nginx" created
$ kubectl get po -w -o wide
NAME READY STATUS RESTARTS AGE IP NODE
aci-connector-3396840456-v75q2 1/1 Running 0 44s 10.244.2.21 k8s-agentpool1-31868821-2
nginx 1/1 Running 0 31s 13.88.27.150 aci-connector
Обратите внимание, что под развёрнут на узле aci-connector. Теперь он должен быть доступен через указанный открытый IP-адрес.
Использование планировщика Kubernetes
В примере в nginx-pod имя узла задано жестко, однако можно также использовать планировщик Kubernetes.
Виртуальный узел aci имеет ограничение (taint) (azure.com/aci) с эффектом NoSchedule по умолчанию. Это означает, что по умолчанию поды не запускаются на узле aci, если они не размещаются там явно.
Тем не менее планировщик Kubernetes может включать под, который допускает (tolerates) это ограничение, в график узла aci.
Ссылка на пример пода с таким допуском.
Воспользоваться этим подом легко:
$ kubectl create -f examples/nginx-pod-tolerations.yaml
Обратите внимание, что при наличии других узлов в вашем кластере этот под не обязательно размещается в службе экземпляров контейнеров Azure.
Для того чтобы принудительно развернуть под в службе экземпляров контейнеров Azure, можно явно указать NodeName, как в первом примере, либо удалить все остальные узлы кластера командой kubectl delete nodes <имя узла>. Третий вариант — развернуть в кластере другие рабочие нагрузки; в этом случае планировщик будет обязан запланировать выполнение вашей задачи через API службы экземпляров контейнеров Azure.
Использование сборок Canary
Сборки Canary — это версии коннектора, которые периодически создаются из главной ветки. Поскольку эти сборки не являются официальными выпусками, их стабильность не гарантирована, однако они позволяют тестировать новейшие функции.
Для того чтобы воспользоваться последней версией Canary, вы можете установить пакет обновлений для своего соединителя aci-connector и обновить тег контейнера, используя следующую команду:
$ kubectl set image deploy/aci-connector aci-connector=microsoft/aci-connector-k8s:canary
Автор: stasus