Создайте инфраструктуру с помощью Azure Files для развертывания GitHub Actions с высокой доступностью в Azure Kubernetes Service (AKS)

В этой статье рассказано, как создать инфраструктуру, необходимую для развертывания контроллера действий (ARC) в AKS с помощью файлов Azure и Helm.

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

Настройка переменных среды

Задайте следующие переменные среды для использования в этом руководстве:

export AKS_AND_STORAGE_ACCOUNT_RG="aks-files-actions"
export AKS_CLUSTER_NAME="aks-actions"
export STORAGE_ACCOUNT_NAME=""
export AKS_STORAGE_ACCOUNT_LOCATION="westus3"
export GITHUB_CONFIG_URL="azure-files-samples/Workloads/azurefiles-actions-aks at master · Azure-Samples/azure-files-samples"

# Optional. Changes might require additional changes on ./install/*.yaml files.

export NAMESPACE_ARC_CONTROLLER="arc-systems"
export ARC_CONTROLLER_NAME="arc-controller"
export NAMESPACE_ARC_RUNNERS="arc-runners"
export ARC_RUNNER_SCALESET_NAME="arc-runner-set"
export ARC_RUNNER_GITHUB_SECRET_NAME=""

Обязательно замените значения для следующих обязательных переменных:

  • AKS_AND_STORAGE_ACCOUNT_RG с именем группы ресурсов, используемой учетной записью хранения и кластером AKS.
  • AKS_CLUSTER_NAME с именем кластера AKS.
  • STORAGE_ACCOUNT_NAME с именем учетной записи хранения данных.
  • AKS_STORAGE_ACCOUNT_LOCATION с названием региона, в котором будут создаваться ресурсы. В этом примере мы развертываем их в том же регионе, что и кластер AKS, чтобы упростить управление производительностью и затратами.
  • GITHUB_CONFIG_URL с URL-адресом организации или репозитория GitHub.

Если это возможно, сохраните следующие необязательные переменные в качестве значений по умолчанию:

  • NAMESPACE_ARC_CONTROLLER: имя пространства имен Kubernetes для запуска контроллера группы масштабирования ARC runners.
  • ARC_CONTROLLER_NAME: имя контроллера масштабируемого набора ARC runners.
  • NAMESPACE_ARC_RUNNERS: имя пространства имен Kubernetes для запуска самостоятельно размещенных runnerов ARC.
  • ARC_RUNNER_SCALESET_NAME: имя масштабируемого набора runners ARC.
  • ARC_RUNNER_GITHUB_SECRET_NAME: имя данного секретного ключа GitHub.

Установка необходимых расширений

Расширения aks-preview, k8s-extension и amg предоставляют больше возможностей для управления кластерами Kubernetes и запросами ресурсов Azure. Установите эти расширения с помощью следующих az extension add команд:

az extension add --upgrade --name aks-preview --yes --allow-preview true 
az extension add --upgrade --name k8s-extension --yes --allow-preview false 
az extension add --upgrade --name amg --yes --allow-preview false

Создайте группу ресурсов

Создайте группу ресурсов с помощью команды az group create. Эта группа ресурсов будет содержать кластер AKS и учетную запись хранения файлов Azure.

az group create \ 
    --name $AKS_AND_STORAGE_ACCOUNT_RG \ 
    --location $AKS_STORAGE_ACCOUNT_LOCATION

Создание кластера AKS

Создайте кластер AKS с помощью команды az aks create.

az aks create --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" --name "${AKS_CLUSTER_NAME}" \ 
    --os-sku AzureLinux \ 
    --node-count 1 \ 
    --enable-cluster-autoscaler \ 
    --min-count 1 \ 
    --max-count 3 \ 
    --node-vm-size standard_d4s_v5 \ 
    --max-pods=100 \ 
    --network-plugin azure \ 
    --network-plugin-mode overlay \ 
    --generate-ssh-keys

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

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

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

    az aks get-credentials --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" --name "${AKS_CLUSTER_NAME}"
    
  2. Проверьте подключение к кластеру kubectl get nodes с помощью команды. Эта команда возвращает список узлов в кластере AKS.

    kubectl get nodes
    

Создание общего файлового хранилища Azure

Прежде чем использовать файловую общую папку Azure Files в качестве тома Kubernetes, необходимо создать учетную запись хранения Azure и файловую общую папку. В этом руководстве мы используем SMB общей папки Azure уровня "Премиум" с поддержкой кэширования метаданных. Минимальное значение составляет 100 ГБ для каждого создаваемого ресурса.

  1. Создайте учетную запись хранения с помощью az storage account create команды. Следующая команда создает учетную запись хранения с помощью номера SKU Premium_LRS.

    az storage account create --name "${STORAGE_ACCOUNT_NAME}" --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" \
        --location "${AKS_STORAGE_ACCOUNT_LOCATION}" \
        --sku Premium_LRS \
        --kind FileStorage
    
  2. Экспорт строки подключения в виде переменной среды, которая используется для создания общей папки с помощью az storage account show-connection-string команды.

    export AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name "${STORAGE_ACCOUNT_NAME}" --resource-group "${AKS_AND_STORAGE_ACCOUNT_RG}" --query connectionString -o tsv)
    
  3. Создайте общую папку premium размером 100 ГБ с помощью az storage share create команды. В этом примере в качестве имени ресурса используется metadatacaching. При изменении этого имени также необходимо изменить arc-runners-set-pv.yaml файл, чтобы отразить это изменение.

    az storage share create --name metadatacaching --quota 100 --connection-string "${AZURE_STORAGE_CONNECTION_STRING}"
    

Установка контроллера масштабируемого набора runners ARC

Установите контроллер набора масштабирования ARC, используя следующую команду helm install.

helm install "${ARC_CONTROLLER_NAME}" \ 
    --namespace "${NAMESPACE_ARC_CONTROLLER}" \ 
    --create-namespace \
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller

Создание секретов в Kubernetes

Секрет ключа хранилища общих папок Azure

Для Azure Files необходимо создать секрет в AKS с ключом хранилища, который используется для доступа к файловому ресурсу Azure из pod AKS.

  1. Экспортируйте ключ учетной записи хранения в качестве переменной среды с помощью команды az storage account keys list.

    STORAGE_KEY=$(az storage account keys list --resource-group ${AKS_AND_STORAGE_ACCOUNT_RG} --account-name ${STORAGE_ACCOUNT_NAME} --query "[0].value" -o tsv) 
    
  2. Создайте пространство имен Kubernetes для запуска локальных runners ARC с помощью kubectl create namespace команды.

    kubectl create namespace "${NAMESPACE_ARC_RUNNERS}" 
    
  3. Создайте секрет Kubernetes для хранения ключа хранения файлового обмена Azure с помощью команды kubectl create secret generic.

    kubectl create secret generic azure-storage-secret \ 
       --namespace "${NAMESPACE_ARC_RUNNERS}" \ 
       --from-literal=azurestorageaccountname=${STORAGE_ACCOUNT_NAME} \ 
       --from-literal=azurestorageaccountkey=${STORAGE_KEY}
    

Секрет приложения GitHub

  1. Создайте приложение GitHub, чтобы позволить самостоятельно размещенному runner получить доступ к вашей организации или репозиторию GitHub, используя руководство по регистрации приложения GitHub. Процесс создания GitHub предоставляет следующие параметры:

    • GITHUB_APP_ID: идентификатор приложения GitHub.
    • GITHUB_APP_INSTALLATION_ID: идентификатор установки приложения GitHub.
    • github_app_private_key: закрытый ключ приложения GitHub. Необходимо заменить раздел -----BEGIN RSA PRIVATE KEY----- на закрытый ключ.
  2. Создайте секрет Kubernetes для хранения учетных данных приложения GitHub с помощью kubectl create secret generic команды. Замените заполнители фактическими значениями, полученными из процесса создания приложения GitHub.

    GITHUB_APP_ID="app-id-placeholder"
    GITHUB_APP_INSTALLATION_ID="installation-id-placeholder"
    
    kubectl create secret generic ${ARC_RUNNER_GITHUB_SECRET_NAME} \ 
        --namespace=${NAMESPACE_ARC_RUNNERS} \
        --from-literal=github_app_id=${GITHUB_APP_ID} \
        --from-literal=github_app_installation_id=${GITHUB_APP_INSTALLATION_ID} \
        --from-literal=github_app_private_key=' <Private Key read here>'
    

Конфигурации файлового хранилища Azure

Вы можете одновременно подключить файловое хранилище Azure Files в нескольких pod, используя AccessMode: ReadWriteMany, чтобы подключить одно и то же файловое хранилище во всех pod, созданных реплицирующим набором ARC Kubernetes. Мы используем общую папку файлов Azure следующим образом:

  • В качестве постоянной общей папки SMB для кэширования пакетов NuGet, используемых примером приложения .NET. Файл arc-runners-set-pv-pvc.yaml создает необходимые PV и PVC для подключения файлового ресурса Azure Files в модулях pod масштабируемого набора ARC. Мы рекомендуем Azure File Premium для этого первого варианта. Настройте volumeAttributes и все параметры пространств имен в манифестах PV и PVC, как показано в следующем примере:

    volumeAttributes: 
      resourceGroup: metadata-agroves  # Optional. Only set this when the storage account isn't in the same resource group as node. 
      shareName: metadatacaching
    nodeStageSecretRef:
      name: azure-storage-secret
      namespace: arc-runners
    
  • В качестве временного тома для рабочей папки runners GitHub. Мы также создадим два класса хранилища: Azure Files Standard (github-azurefile) и Azure File Premium (github-azurefile-premium). Эти классы позволяют создавать и удалять тома по запросу. При запуске задания GitHub создается новый модуль runner в Kubernetes, а также создается и подключается новая файловая доля Azure. Том живет только во время выполнения задания. Стандартный класс позволяет использовать любой размер тома, а класс Premium позволяет использовать том не менее 100 ГБ. Вы можете выбрать любой класс, который вы предпочитаете. Имейте в виду, что Premium обеспечивает более высокую производительность. Файл arc-runners-storage-class-files.yaml можно настроить, но это не обязательно.

Создайте постоянный том и запрос на постоянный том

  1. Создайте постоянный том и запрос на постоянный том с помощью команды kubectl apply.

    kubectl apply -f ./install/arc-runners-set-pv-pvc.yaml --namespace "${NAMESPACE_ARC_RUNNERS}" --wait 
    
  2. Примените класс хранилища для файлов Azure с помощью kubectl apply команды.

    kubectl apply -f ./install/arc-runners-storage-class-files.yaml --wait 
    

Установка масштабируемого набора runners ARC

Следующий фрагмент кода взят из файла arc-runners-set-values.yaml, находящегося в папке установки, который вы можете настроить перед установкой набора диаграмм Helm для runner.

containerMode: 
  type: "kubernetes" # Type can be set to dind or kubernetes 
  ## The following is required when containerMode.type=kubernetes 
  kubernetesModeWorkVolumeClaim: 
    accessModes: ["ReadWriteMany"] 
    storageClassName: "github-azurefile-premium" # or "github-azurefile" for Standard_LRS 
    resources: 
      requests: 
        storage: 100Gi # 100Gi minimum to premium or any size when using Standard_LRS "github-azurefile" storage class 
template: 
  spec: 
  securityContext: 
    fsGroup: 123 # Group used by GitHub default agent image 
  containers: 
  - name: runner 
    image: ghcr.io/actions/actions-runner:latest 
    command: ["/home/runner/run.sh"] 
    env: 
      - name: ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER 
        value: "false" 
      - name: ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE 
        value: "/home/runner/container-config/container-podspec.yaml" 
    volumeMounts: 
      - name: "container-podspec-volume" 
        mountPath: "/home/runner/container-config" 
      - name: azurefile 
        mountPath: /home/runner/.nuget/              
  volumes: 
    - name: "container-podspec-volume" 
      configMap: 
        name: hook-extension 
    - name: azurefile 
      persistentVolumeClaim: 
        claimName: azurefile 

В этом примере мы используем настраиваемую версию Kubernetes containerMode для включения монтирования тома файлового ресурса Azure File к пакетам NuGet и к эфемерному тому папки _work.

Следующие параметры не являются обязательными для изменения:

  • storageClassName: выберите между "github-azurefile-premium" и "github-azurefile".
  • storage: выберите размер хранилища. Минимальное значение 100 ГБ для Premium.

Другие параметры Helm задаются в команде helm install с помощью опции --set.

Для совместимости с функцией контейнера рабочего процесса GitHub, которая позволяет запускать контейнеры внутри конвейера, мы подключаем container-podspec-volume со спецификацией pod для pod рабочего процесса, созданного ARC при запуске рабочих процессов с функцией контейнера. Эта спецификация pod смонтирована из ConfigMap, созданной из файла arc-runners-set-container-pod-spec.yaml в директории установки. Никаких изменений не требуется.

kubectl apply -f ./install/arc-runners-set-container-pod-spec.yaml 

Параметры набора масштабируемости в диаграмме Helm для runners ARC

Диаграмма Helm масштабируемого набора раннеров ARC предоставляет несколько параметров. Следующие параметры являются наиболее важными при установке набора масштабирования с подключением ресурса общего диска Azure File в AKS:

  • githubConfigUrl: ваша организация или репозиторий GitHub.
  • githubConfigSecret: секрет приложения GitHub для доступа к GitHub из локального runner.
  • minRunners: минимальное количество исполнителей в масштабируемом наборе, ожидающих новых заданий из GitHub.
  • maxRunners: максимальное количество выполняющихся заданий или ожидание новых заданий из GitHub.
  • runnerGroup: группа runner'ов GitHub, используемая набором runner'ов ARC.

Скачайте масштабируемый набор runners ARC Helm.

Установка чарта Helm на AKS

Установите масштабируемый набор runners ARC Helm в AKS с помощью helm install команды.

helm install "${ARC_RUNNER_SCALESET_NAME}" \ 
    --namespace "${NAMESPACE_ARC_RUNNERS}" \ 
    --create-namespace \ 
    --values ./install/arc-runners-set-values.yaml \ 
    --set githubConfigUrl="${GITHUB_CONFIG_URL}" \ 
    --set githubConfigSecret="${ARC_RUNNER_GITHUB_SECRET_NAME}" \ 
    --set minRunners=1 \ 
    --set maxRunners=3 \ 
    --set runnerGroup=default \ 
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set

Обновление установки масштабируемого набора runner

Если вы хотите обновить любую конфигурацию в масштабируемом наборе runners ARC, можно использовать helm upgrade --install команду с теми же параметрами, которые использовались для установки масштабируемого набора. Например, если вы хотите изменить minRunners параметр с 1 по 2, можно выполнить следующую команду:

helm upgrade --install "${ARC_RUNNER_SCALESET_NAME}" \
    --namespace "${NAMESPACE_ARC_RUNNERS}" \
    --create-namespace \
    --values ./install/arc-runners-set-values.yaml \
    --set githubConfigUrl="${GITHUB_CONFIG_URL}" \
    --set githubConfigSecret="${ARC_RUNNER_GITHUB_SECRET_NAME}" \
    --set minRunners=2 \
    --set maxRunners=3 \
    --set runnerGroup=default \
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set

Следующий шаг

Соавторы

Корпорация Майкрософт поддерживает эту статью. Первоначальная версия была написана следующими участниками:

  • Хорхе Артерио | Старший адвокат по облачным технологиям
  • Джефф Паттерсон | Главный диспетчер продуктов
  • Рена Шах | Старший менеджер по продуктам
  • Шехар Сингх Сорот | Product Manager 2
  • Эрин Шаффер | Разработчик содержимого 2