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.

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


  1. shurup
    06.12.2017 06:19

    В хабе Microsoft ещё была статья: «Сегодня речь пойдёт о коннекторе Azure Container Instances для Kubernetes, который позволяет развертывать экземпляры службы контейнеров Azure в кластерах Kubernetes».