
Azure Container Instances (ACI) позволяют запускать контейнеры, не беспокоясь об инфраструктуре. Мы можем дать образ контейнера, и ACI с радостью запустит контейнер и даже обеспечит внешним IP-адресом. Когда ручное вмешательство необходимо только при запуске контейнеров, это называется «беcсерверные контейнеры». ACI отлично подходит для пакетных рабочих нагрузок или долгосрочных контейнеров, где мы не хотим иметь дело с инфраструктурой.
ACI обеспечивает низкоуровневый блок построения инфраструктуры для запуска контейнеров. Мы можем думать о нем как о ВМ (виртуальная машина), но вместо запуска образа виртуальной машины он запускает образ контейнера.
Один интересный пример того, как ACI можно использовать в сочетании с контейнерным оркестром, – это экспериментальный ACI-коннектор для Kubernetes. Когда он установлен в кластере Kubernetes, ACI-коннектор создает виртуальные узлы в кластере. Они ведут себя как узлы с неограниченной мощностью. На них мы можем планировать запуск подов (pods), но фактически они будут выполняться как группы контейнеров в ACI.
Возможно, однажды ACI Connector станет основой, позволяющей «бессерверному Kubernetes»… строить кластер в Kubernetes Azure Container Service (AKS), который не имеет физических узлов
Недавно в ACI Connector для Kubernetes была добавлена поддержка контейнеров Windows, и сегодня мы рассмотрим, как использовать ACI Connector для запуска контейнеров Windows.

Настройка Azure Container Service для кластера Kubernetes (AKS)
Создать управляемый кластер Kubernetes в Azure с использованием AKS невероятно просто. Запустите эти команды CLI Azure:
$ az group create -n antchu-aks-temp $ az aks create -g antchu-aks-temp -n antchu-aks-temp -c 1 -l eastus -k 1.8.2
Это создает группу ресурсов и ресурс AKS. Мы установили размер пула агентов в 1, его местоположение в eastus и версию Kubernetes 1.8.2.
После того как кластер готов, мы можем использовать CLI Azure для установки последнего CLI Kubernetes (kubectl) и загрузить файл конфигурации для нашего кластера:
$ az aks install-cli $ az aks get-credentials -g antchu-aks-temp -n antchu-aks-temp
Теперь мы видим один узел в кластере.
$ kubectl get nodes NAME STATUS ROLES AGE VERSION aks-agentpool1-16617890-0 Ready agent 2m v1.8.2
Установка ACI-коннектора для Kubernetes
Создадим группу ресурсов
Перед установкой ACI-коннектора необходимо создать группу ресурсов, в которую будут развертываться ресурсы ACI:
$ az group create -n antchu-aci-temp -l eastus { "id": "/subscriptions/<subscription-id>/resourceGroups/antchu-aci-temp", "location": "eastus", "managedBy": null, "name": "antchu-aci-temp", "properties": { "provisioningState": "Succeeded" }, "tags": null }
Обратите внимание на идентификатор новой группы ресурсов.
Создание первичного сервиса
Затем нужно создать первичный сервис, который ACI-коннектор будет использовать для создания экземпляров контейнера, управления и их удаления во вновь созданной группе ресурсов. Первичному сервису необходимо назначить роль контрибьютора в группе ресурсов. Чтобы создать первичный сервис и назначить ему роли, мы запускаем следующую команду, используя полный идентификатор группы ресурсов на предыдущем шаге:
$ az ad sp create-for-rbac -n antchu-aks-aci-temp --role contributor --scopes <resource-group-id> { "appId": "<app-id>", "displayName": "antchu-aks-aci-temp", "name": "http://antchu-aks-aci-temp", "password": "<password>", "tenant": "<tenant-id>" }
Обратите внимание на возвращаемые значения свойств appId, password и tenant.
Установка ACI-коннектора
ACI-коннектор доступен как образ на Docker Hub. Чтобы получить поддержку Windows, нужно использовать сборку canary. Создайте следующий файл aci-connector.yaml. Он определяет deployment Kubernetes с одним контейнером, который запускает контейнер из образа microsoft/aci-connector-k8s:canary:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: aci-connector namespace: default spec: replicas: 1 template: metadata: labels: app: aci-connector spec: containers: - name: aci-connector image: microsoft/aci-connector-k8s:canary imagePullPolicy: Always env: - name: AZURE_CLIENT_ID value: <tenant-id> - name: AZURE_CLIENT_KEY value: <app-id> - name: AZURE_TENANT_ID value: <tenant-id> - name: AZURE_SUBSCRIPTION_ID value: <subscription-id> - name: ACI_RESOURCE_GROUP value: antchu-aci-temp
Замените переменные среды значениями, полученными из предыдущих команд. Затем создайте deployment в Kubernetes:
$ kubectl create -f aci-connector.yaml
Теперь, если посмотрим состояние кластера, мы увидим ещё два новых виртуальных узла:
$ kubectl get nodes NAME STATUS ROLES AGE VERSION aci-connector-0 Ready <none> 10s v1.6.6 aci-connector-1 Ready <none> 10s v1.6.6 aks-agentpool1-16617890-0 Ready agent 9m v1.8.2
Планирование запуска контейнеров на aci-connector-0 будет запускать контейнеры Linux; aci-connector-1 будет запускать контейнеры Windows.
Чтобы Kubernetes случайно не загрузил на них поды, для узлов ACI-коннектора был добавлен azure.com/aci:NoSchedule taint. Мы можем это увидеть, если посмотрим на свойства узла:
$ kubectl describe node aci-connector-1 Name: aci-connector-1 Roles: <none> Labels: beta.kubernetes.io/os=1 Annotations: node.alpha.kubernetes.io/ttl=0 Taints: azure.com/aci:NoSchedule …
Планируем запуск контейнера Windows на ACI
Создайте файл iis-pod.yaml со следующим содержимым. В нем описывается один контейнер, в котором отображается содержимое контейнера Windows microsoft/iis:windowsservercore.
apiVersion: v1 kind: Pod metadata: name: iis-winsvrcore spec: containers: - image: microsoft/iis:windowsservercore imagePullPolicy: Always name: iis-winsvrcore dnsPolicy: ClusterFirst nodeName: aci-connector-1
Обратите внимание: мы явно указываем Kubernetes, что этот под должен запускаться на узле с именем aci-connector-1. Теперь мы создаем под:
$ kubectl create -f iis-pod.yaml pod "iis-winsvrcore" created
И если мы запросим список наших подов, они появятся в списке:
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE aci-connector-54b97586f5-l96l9 1/1 Running 0 32m 10.244.0.10 aks-agentpool1-16617890-0 iis-winsvrcore 1/1 Running 0 2m 13.88.182.114 aci-connector-1
ACI понадобится несколько минут, чтобы загрузить образ и запустить его. В настоящее время в ACI-коннекторе есть ошибка: он покажет под в состоянии «Running», даже если под все еще создается. Мы должны увидеть статус экземпляра контейнера, выполнив команду Azure CLI:
$ az container list -o table Name ResourceGroup ProvisioningState Image IP:ports CPU/Memory OsType Location ----------------- --------------- ------------------- ------------------------------- ----------------- --------------- -------- ---------- iis-winsvrcore antchu-aci-temp Creating microsoft/iis:windowsservercore 13.88.182.114:80 1.0 core/1.5 gb Windows westus
Когда состояние изменится на «Succeeded», мы можем перейти по IP-адресу контейнера. Получить IP можно через выполнение kubectl get -o wide или вывод команды az, указанный выше.

Обновление – 21 ноября 2017 г.
Посмотрите это видео от Ria Bhatia – менеджера, работающего в ACI и ACI Connector. Отличная демонстрация технологий, о которых мы говорили.
Оригинал: Deploying Windows Containers with Azure Container Instances (ACI) Connector for Kubernetes.

