Поделиться через


Краткое руководство: развертывание кластера Службы Azure Kubernetes (AKS) с использованием Flatcar Container Linux для AKS (предварительная версия) через шаблон ARM.

Служба Azure Kubernetes (AKS) — это управляемая служба Kubernetes, которая позволяет быстро развертывать кластеры и управлять ими. В этом кратком руководстве вы сможете:

  • Создайте кластер AKS с помощью Flatcar Container Linux для AKS (предварительная версия).
  • Развертывание кластера AKS с использованием шаблона Azure Resource Manager.
  • Запустите пример мультиконтейнерного приложения с группой микрослужб и веб-интерфейсов с имитацией сценария розничной торговли.

Шаблон Azure Resource Manager — это файл нотации объектов JavaScript (JSON), который определяет инфраструктуру и конфигурацию проекта. В шаблоне используется декларативный синтаксис. Вы описываете предполагаемое развертывание без написания последовательности команд программирования для создания развертывания.

Замечание

Чтобы приступить к быстрой подготовке кластера AKS, в этой статье содержатся действия по развертыванию кластера с параметрами по умолчанию только для оценки. Прежде чем развертывать готовый к работе кластер, рекомендуется ознакомиться с базовой эталонной архитектурой , чтобы понять, как она соответствует вашим бизнес-требованиям.

Перед тем как начать

В этой статье предполагается базовое понимание концепций Kubernetes. Дополнительные сведения см. в статье Ключевые концепции Kubernetes для службы Azure Kubernetes (AKS).

  • Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.

  • Убедитесь, что учетная запись, используемая для создания кластера, имеет необходимые минимальные разрешения. Дополнительные сведения о доступе и удостоверении для AKS см. в статье Возможности контроля доступа и идентификации в Службе Azure Kubernetes (AKS).

  • Чтобы развернуть шаблон ARM, необходимо иметь права на запись на ресурсы, которые вы развертываете, и иметь доступ ко всем операциям на ресурсе типа Microsoft.Resources/deployments. Например, для развертывания виртуальной машины необходимы разрешения Microsoft.Compute/virtualMachines/write и Microsoft.Resources/deployments/*. Список ролей и разрешений см. в статье Встроенные роли Azure.

После развертывания кластера из шаблона можно использовать Azure CLI или Azure PowerShell для подключения к кластеру и развертывания примера приложения.

Регистрация поставщиков ресурсов

Возможно, потребуется зарегистрировать поставщиков ресурсов в подписке Azure. Например, Microsoft.ContainerService требуется.

Проверьте состояние регистрации с помощью az provider show команды.

az provider show --namespace Microsoft.ContainerService --query registrationState

При необходимости зарегистрируйте поставщика ресурсов с помощью команды az provider register .

az provider register --namespace Microsoft.ContainerService

Установка aks-preview расширения

Это важно

Предварительные версии функций AKS доступны на условиях самообслуживания и добровольного выбора. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:

  1. aks-preview Установите расширение Azure CLI с помощью az extension add команды.

    az extension add --name aks-preview
    
  2. Обновите до последней версии расширения с помощью az extension update команды. Flatcar Container Linux требует минимум 18.0.0b42.

    az extension update --name aks-preview
    

Регистрация AKSFlatcarPreview флага компонента

  1. Зарегистрируйте флаг функции AKSFlatcarPreview с помощью команды az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "AKSFlatcarPreview"
    
  2. Проверьте состояние регистрации с помощью az feature show команды. Через несколько минут отобразится состояние Registered (Зарегистрировано).

    az feature show --namespace Microsoft.ContainerService --name AKSFlatcarPreview
    
  3. Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью az provider register команды.

    az provider register --namespace Microsoft.ContainerService
    

Создание пары ключей SSH

Чтобы создать кластер AKS с помощью шаблона ARM, укажите открытый ключ SSH. Если вам нужен этот ресурс, выполните действия, описанные в этом разделе. В противном случае перейдите к разделу "Просмотр шаблона ".

Чтобы получить доступ к узлам AKS, подключитесь с помощью пары ключей SSH (общедоступная и частная). Чтобы создать пару ключей SSH, сделайте следующее:

  1. Перейдите по адресу https://shell.azure.com, чтобы открыть Cloud Shell в браузере.

  2. Создайте группу ресурсов с помощью команды az group create.

    az group create \
      --name myResourceGroup \
      --location eastus
    
  3. Создайте пару ключей SSH с помощью команды az sshkey create или ssh-keygen команды.

    az sshkey create --name mySSHKey --resource-group myResourceGroup
    

    Или создайте пару ключей SSH с помощью SSH-keygen

    ssh-keygen -t rsa -b 4096
    
  4. Чтобы развернуть шаблон, необходимо указать открытый ключ из пары SSH. Получите открытый az sshkey show ключ с помощью команды.

    az sshkey show --name mySSHKey --resource-group myResourceGroup --query publicKey
    

    По умолчанию файлы ключей SSH создаются в каталоге ~/.ssh . При выполнении az sshkey create команды или ssh-keygen команды перезаписывается любая существующая пара ключей SSH с тем же именем.

    Дополнительные сведения о создании ключей SSH см. в статье Detailed steps: Create and manage SSH keys for authentication to a Linux VM in Azure (Подробные инструкции. Создание ключей SSH для проверки подлинности на виртуальной машине Linux в Azure и управление этими ключами).

Проверьте шаблон

Шаблон, используемый в этом кратком руководстве, взят из шаблонов быстрого запуска Azure.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.26.170.59819",
      "templateHash": "14823542069333410776"
    }
  },
  "parameters": {
    "clusterName": {
      "type": "string",
      "defaultValue": "aks101cluster",
      "metadata": {
        "description": "The name of the Managed Cluster resource."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location of the Managed Cluster resource."
      }
    },
    "dnsPrefix": {
      "type": "string",
      "metadata": {
        "description": "Optional DNS prefix to use with hosted Kubernetes API server FQDN."
      }
    },
    "osDiskSizeGB": {
      "type": "int",
      "defaultValue": 0,
      "minValue": 0,
      "maxValue": 1023,
      "metadata": {
        "description": "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 will apply the default disk size for that agentVMSize."
      }
    },
    "agentCount": {
      "type": "int",
      "defaultValue": 3,
      "minValue": 1,
      "maxValue": 50,
      "metadata": {
        "description": "The number of nodes for the cluster."
      }
    },
    "agentVMSize": {
      "type": "string",
      "defaultValue": "standard_d2s_v3",
      "metadata": {
        "description": "The size of the Virtual Machine."
      }
    },
    "linuxAdminUsername": {
      "type": "string",
      "metadata": {
        "description": "User name for the Linux Virtual Machines."
      }
    },
    "sshRSAPublicKey": {
      "type": "string",
      "metadata": {
        "description": "Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example 'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm'"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.ContainerService/managedClusters",
      "apiVersion": "2024-02-01",
      "name": "[parameters('clusterName')]",
      "location": "[parameters('location')]",
      "identity": {
        "type": "SystemAssigned"
      },
      "properties": {
        "dnsPrefix": "[parameters('dnsPrefix')]",
        "agentPoolProfiles": [
          {
            "name": "agentpool",
            "osDiskSizeGB": "[parameters('osDiskSizeGB')]",
            "count": "[parameters('agentCount')]",
            "vmSize": "[parameters('agentVMSize')]",
            "osType": "Linux",
            "mode": "System"
          }
        ],
        "linuxProfile": {
          "adminUsername": "[parameters('linuxAdminUsername')]",
          "ssh": {
            "publicKeys": [
              {
                "keyData": "[parameters('sshRSAPublicKey')]"
              }
            ]
          }
        }
      }
    }
  ],
  "outputs": {
    "controlPlaneFQDN": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-02-01').fqdn]"
    }
  }
}

Тип ресурса, определенный в шаблоне ARM, — Microsoft.ContainerService/managedClusters.

Для получения дополнительных примеров AKS посетите страницу Шаблоны быстрого запуска AKS.

Развертывание шаблона

  1. Выберите «Развернуть в Azure», чтобы войти в систему и открыть шаблон.

    Кнопка для развертывания шаблона Resource Manager в Azure.

  2. На странице "Основные сведения" оставьте значения по умолчанию для размера диска ОС, количества агентов, размера виртуальной машины агента и типа ОС и настройте следующие параметры шаблона:

    • Подписка— выберите подписку Azure.
    • Группа ресурсов: выберите Создать новую. Введите уникальное имя группы ресурсов, например myResourceGroup, а затем нажмите кнопку ОК.
    • OS SKU: укажите flatcar. Если не обновить OS SKU, по умолчанию будет использовано значение Ubuntu.
    • Расположение: выберите расположение, например восточную часть США.
    • Имя кластера: введите уникальное имя кластера AKS, например myAKSCluster.
    • Префикс DNS: введите уникальный префикс DNS для кластера, например myakscluster.
    • Имя пользователя администратора Linux: введите имя пользователя для подключения с помощью SSH, например azureuser.
    • Источник открытого ключа SSH: выберите " Использовать существующий открытый ключ".
    • Имя пары ключей: скопируйте и вставьте общедоступную часть пары ключей SSH (по умолчанию содержимое ~/.ssh/id_rsa.pub).
  3. Выберите Просмотреть и создать>Создать.

Создание кластера AKS займет несколько минут. Дождитесь успешного развертывания кластера, прежде чем перейти к следующему шагу.

Подключение к кластеру

Кластером Kubernetes можно управлять при помощи kubectl клиента командной строки Kubernetes.

Если вы используете Azure Cloud Shell, kubectl уже установлен. Чтобы установить и запустить kubectl локально, используйте az aks install-cli команду.

  1. Настройте kubectl для подключения к вашему кластеру Kubernetes с помощью команды az aks get-credentials. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.

    az aks get-credentials \
      --resource-group myResourceGroup \
      --name myAKSCluster
    
  2. Проверьте подключение к кластеру kubectl get с помощью команды. Эта команда возвращает список узлов кластера.

    kubectl get nodes
    

    В следующем примере выходных данных показаны три узла, созданные на предыдущих шагах. Убедитесь, что этот узел находится в состоянии готовности:

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-agentpool-38955149-vmss000000   Ready    <none>   5m53s   v1.32.7
    aks-agentpool-38955149-vmss000001   Ready    <none>   6m31s   v1.32.7
    aks-agentpool-238955149-vmss000002   Ready    <none>   6m35s   v1.32.7
    

Развертывание приложения

Чтобы развернуть приложение, используйте файл манифеста для создания всех объектов, необходимых для запуска приложения AKS Store. Файл манифеста Kubernetes используется для определения желаемого состояния кластера, например, какие образы контейнеров следует запускать. В манифесте указаны следующие развертывания и службы Kubernetes:

Снимок экрана: пример архитектуры Магазина Azure.

  • Интерфейс магазина: веб-приложение для пользователей для просмотра продуктов и размещения заказов.
  • Сервис продукта: отображает информацию о продукте.
  • Служба заказов: помещает заказы.
  • Rabbit MQ: очередь сообщений для управления очередью заказов.

Замечание

Не рекомендуется запускать контейнеры с сохранением состояния, такие как Rabbit MQ, без постоянного хранилища для продакшена. Они используются здесь для простоты, но мы рекомендуем использовать управляемые службы, такие как Azure Cosmos DB или Служебная шина Azure.

  1. Создайте файл с именем aks-store-quickstart.yaml и скопируйте его в следующем манифесте:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env:
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    Сведения о разбивке файлов манифеста YAML см. в разделе "Развертывания" и "Манифесты YAML".

    Если вы создаете и сохраняете файл YAML локально, вы можете отправить файл манифеста в каталог по умолчанию в CloudShell, нажав кнопку "Отправить и скачать файлы " и выбрав файл из локальной файловой системы.

  2. Разверните приложение с помощью kubectl apply команды и укажите имя манифеста YAML.

    kubectl apply -f aks-store-quickstart.yaml
    

    В следующем примере выходных данных показаны развертывания и службы:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

Тестирование приложения

  1. Проверьте состояние развернутых подов с помощью команды kubectl get pods. Убедитесь, что все модули pod находятся в состоянии Running прежде чем продолжить.

    kubectl get pods
    
  2. Проверьте общедоступный IP-адрес для приложения store-front. Отслеживайте ход выполнения, используя команду kubectl get service с аргументом --watch.

    kubectl get service store-front --watch
    

    Выходные данные EXTERNAL-IP для store-front службы изначально отображаются как в ожидании:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. Когда адрес EXTERNAL-IP изменится из состояния pending на общедоступный IP-адрес, выполните команду CTRL-C, чтобы остановить процесс отслеживания kubectl.

    В следующем примере выходных данных показан общедоступный IP-адрес, присвоенный службе.

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  4. Откройте веб-браузер и перейдите на внешний IP-адрес вашей службы для просмотра приложения Microsoft Azure Store в действии.

    Снимок экрана: пример приложения AKS Store.

Удаление кластера

Если вы не планируете использовать учебник AKS, очистите ненужные ресурсы, чтобы избежать расходов Azure.

  • Удалите группу ресурсов, службу контейнеров и все связанные ресурсы с помощью az group delete команды.
az group delete --name myResourceGroup

Замечание

Кластер AKS был создан с управляемой системой идентичностью, которая является идентичностью по умолчанию, используемой в этом кратком руководстве. Платформа управляет этим удостоверением, поэтому удалить его вручную не нужно.

Дальнейшие шаги

В этом кратком руководстве вы развернули кластер Kubernetes, а затем развернули на нем простое многоконтейнерное приложение. Этот пример приложения предназначен только для демонстрационных целей и не представляет все рекомендации для приложений Kubernetes. Рекомендации по созданию полных решений с помощью AKS для использования в производственной среде см. в руководстве по решению AKS.

Чтобы узнать больше об AKS и ознакомиться с полным примером кода к развертыванию, перейдите к руководству по кластеру Kubernetes.