Несколько месяцев назад я рассказывал вам о выходе новой службы экземпляров контейнеров Azure (Azure Container Instances, ACI), которая максимально упрощает развёртывание контейнеров. Сегодня речь пойдёт о коннекторе Azure Container Instances для Kubernetes, который позволяет развертывать экземпляры службы контейнеров Azure в кластерах Kubernetes.

Этот коннектор является экспериментальным и его не следует использовать для реальных проектов.



Серия статей «Говорим о контейнерах»:


1. Контейнеры быстрого развёртывания.
2. DevOps с Kubernetes и VSTS. Часть 1: Локальная история.
3. DevOps с Kubernetes и VSTS. Часть 2: Облачная история.
4. Нода c бесконечной ёмкостью для Kubernetes.

Такой подход позволяет практически мгновенно выделять кластеру необходимые ресурсы, избавляя администратора от необходимости управлять инфраструктурой ВМ и позволяя ему продолжать использовать Kubernetes API. В кластере Kubernetes можно одновременно использовать виртуальные машины и экземпляры контейнеров, тем самым получая преимущества обеих технологий.

Принципы работы


Грубо говоря, коннектор ACI Connector имитирует интерфейс Kubelet следующим образом:

  • регистрируется в Kubernetes как узел (node) с неограниченными ресурсами;
  • отправляет поды (pod) на исполнение в службу экземпляров контейнеров Azure вместо нод на виртуальных машин.

После того как коннектор регистрируется в качестве узла с именем aci-connector, можно указать nodeName: aci-connector в конфигурации пода, чтобы запустить его через службу экземпляров контейнеров Azure. Поды, в конфигурации которых этот узел не указан, запускаются по расписанию в обычном режиме. Ниже даны инструкции по использованию соединителя ACI Connector и планировщика Kubernetes с помощью ограничений и допусков(taints и tolerations).

ACI connector k8s

Требования


  1. Работающий клиент командной строки az — установить Azure CLI 2.0.
  2. Кластер Kubernetes с рабочим kubectl — настроить кластер Kubernetes в Azure.

Текущие возможности


В дополнении к примерам на текущий момент поддерживаются следующие функции Kubernetes, если они определены в манифесте пода. По мере расширения возможностей коннектора aci-connector этот список будет изменяться.


Текущие ограничения


Следующие функции Kubernetes в настоящее время не поддерживаются коннектором aci-connector:

  • ConfigMaps
  • Secrets
  • ServiceAccounts
  • Volumes
  • kubectl logs
  • kubectl exec

Как быстро попробовать


  1. Отредактируйте файл examples/aci-connector.yaml и укажите переменные среды.
  2. Запустите коннектор ACI Connector командой kubectl create -f examples/aci-connector.yaml.
  3. Дождитесь, пока команда kubectl get nodes отобразит узел aci-connector.
  4. Запустите под NGINX через ACI командой kubectl create -f examples/nginx-pod.yaml.
  5. Откройте под 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

Комментарии (0)