Учебник. Развертывание конфигураций с помощью GitOps в кластерах Kubernetes с поддержкой Azure Arc

Важно!

Это руководство предназначено для GitOps с Flux версии 1. GitOps с Flux версии 2 теперь доступен для кластеров Kubernetes и Служба Azure Kubernetes (AKS) с поддержкой Azure Arc; Перейдите к руководству по GitOps с Flux версии 2. Рекомендуется как можно скорее выполнить миграцию на Flux версии 2 .

Поддержка ресурсов конфигурации кластера на основе Flux версии 1, созданных до 1 января 2024 г., завершится 24 мая 2025 г. Начиная с 1 января 2024 г. вы не сможете создавать новые ресурсы конфигурации кластера на основе Flux версии 1.

В этом учебнике показано, как применить конфигурации с помощью GitOps в кластерах Kubernetes с поддержкой Azure Arc. Вы узнаете, как:

  • создать конфигурацию для кластера Kubernetes с поддержкой Azure Arc на основе примера репозитория Git;
  • убедиться, что конфигурация успешно создана;
  • применить конфигурацию из частного репозитория Git;
  • проверить конфигурацию Kubernetes.

Предварительные требования

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.

  • Существующий подключенный кластер Kubernetes с поддержкой Azure Arc.

  • Понимание преимуществ и архитектуры этой возможности. Дополнительные сведения см. в статье Конфигурации и GitOps — Kubernetes с поддержкой Azure Arc.

  • k8s-configuration Установите расширение Azure CLI версии >= 1.0.0:

    az extension add --name k8s-configuration
    

    Совет

    Если расширение k8s-configuration уже установлено, его можно обновить до последней версии, выполнив следующую команду: az extension update --name k8s-configuration

Создание конфигурации

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

  • Пространства имен: cluster-config, team-a, team-b
  • развертывание arc-k8s-demo;
  • ConfigMap team-a/endpoints.

config-agent получает из Azure новые и обновленные конфигурации. Эта задача займет до 5 минут.

Если вы связываете с конфигурацией частный репозиторий, обязательно выполните действия из раздела Применение конфигурации из частного репозитория Git.

Использование Azure CLI

Используя расширение Azure CLI для k8s-configuration, свяжите подключенный кластер с примером репозитория Git.

  1. Присвойте этой конфигурации имя cluster-config.

  2. Поручите агенту развертывание оператора в пространстве имен cluster-config.

  3. Присвойте этому оператору разрешения cluster-admin.

    az k8s-configuration create --name cluster-config --cluster-name AzureArcTest1 --resource-group AzureArcTest --operator-instance-name cluster-config --operator-namespace cluster-config --repository-url https://github.com/Azure/arc-k8s-demo --scope cluster --cluster-type connectedClusters
    
    {
      "complianceStatus": {
      "complianceState": "Pending",
      "lastConfigApplied": "0001-01-01T00:00:00",
      "message": "{\"OperatorMessage\":null,\"ClusterState\":null}",
      "messageLevel": "3"
      },
      "configurationProtectedSettings": {},
      "enableHelmOperator": false,
      "helmOperatorProperties": null,
      "id": "/subscriptions/<sub id>/resourceGroups/<group name>/providers/Microsoft.Kubernetes/connectedClusters/<cluster name>/providers/Microsoft.KubernetesConfiguration/sourceControlConfigurations/cluster-config",
      "name": "cluster-config",
      "operatorInstanceName": "cluster-config",
      "operatorNamespace": "cluster-config",
      "operatorParams": "--git-readonly",
      "operatorScope": "cluster",
      "operatorType": "Flux",
      "provisioningState": "Succeeded",
      "repositoryPublicKey": "",
      "repositoryUrl": "https://github.com/Azure/arc-k8s-demo",
      "resourceGroup": "MyRG",
      "sshKnownHostsContents": "",
      "systemData": {
        "createdAt": "2020-11-24T21:22:01.542801+00:00",
        "createdBy": null,
        "createdByType": null,
        "lastModifiedAt": "2020-11-24T21:22:01.542801+00:00",
        "lastModifiedBy": null,
        "lastModifiedByType": null
      },
      "type": "Microsoft.KubernetesConfiguration/sourceControlConfigurations"
    }
    

Использование общедоступного репозитория Git

Параметр Формат
--repository-url http[s]://server/repo[.git]

Использование частного репозитория Git с SSH и ключами, созданными с помощью Flux

Добавьте открытый ключ, созданный с помощью Flux, в учетную запись пользователя в поставщике службы Git. Если ключ добавляется в репозиторий, а не в учетную запись пользователя, в URL-адресе укажите git@ вместо user@.

Дополнительные сведения см. в статье Применение конфигурации из частного репозитория Git.

Параметр Формат Примечания
--repository-url ssh://user@server/repo[.git] или user@server:repo[.git] Можно использовать git@ вместо user@

Использование частного репозитория Git с SSH и предоставленными пользователем ключами

Предоставьте собственный закрытый ключ напрямую или через файл. Этот ключ должен иметь формат PEM и заканчиваться символом перевода строки (\n).

Добавьте связанный открытый ключ в учетную запись пользователя в поставщике службы Git. Если ключ добавляется в репозиторий, а не в учетную запись пользователя, укажите git@ вместо user@.

Дополнительные сведения см. в статье Применение конфигурации из частного репозитория Git.

Параметр Формат Примечания
--repository-url ssh://user@server/repo[.git] или user@server:repo[.git] Можно использовать git@ вместо user@
--ssh-private-key Ключ в кодировке base64 и формате PEM Предоставьте ключ напрямую
--ssh-private-key-file Полный путь к локальному файлу Укажите полный путь к локальному файлу, который содержит ключ в формате PEM

Использование закрытого узла Git с SSH с предоставленным пользователем списком известных узлов

Оператор Flux сохраняет список общих узлов Git в известном файле hosts для проверки подлинности репозитория Git перед установкой SSH-подключения. Если вы используете нестандартный репозиторий Git или собственный узел Git, предоставьте собственный ключ узла, чтобы Flux смог опознать репозиторий.

Как и закрытые ключи, содержимое known_hosts можно предоставить напрямую или через файл. Для предоставления собственного содержимого соблюдайте спецификации формата для содержимого known_hosts и используйте любой из описанных выше сценариев с ключами SSH.

Параметр Формат Примечания
--repository-url ssh://user@server/repo[.git] или user@server:repo[.git] Можно использовать git@ вместо user@
--ssh-known-hosts Данные в кодировке base64 Непосредственное предоставление содержимого known_hosts
--ssh-known-hosts-file Полный путь к локальному файлу Предоставление содержимого known_hosts в локальном файле

Использование частного репозитория Git с HTTPS

Параметр Формат Примечания
--repository-url https://server/repo [.git] HTTPS с обычной проверкой подлинности
--https-user Необработанные данные или данные в кодировке base64 Имя пользователя HTTPS
--https-key Необработанные данные или данные в кодировке base64 Личный маркер доступа или пароль HTTPS

Примечание

  • Чарт для оператора Helm версии 1.2.0 и выше поддерживает закрытую проверку подлинности выпуска HTTPS Helm.
  • Выпуск HTTPS Helm не поддерживается для кластеров, управляемых AKS.
  • Если вам нужно, чтобы Flux обращался к репозиторию Git через прокси-сервер, потребуется настроить для агентов Azure Arc параметры прокси-сервера. Дополнительные сведения см. в разделе Подключение с использованием исходящего прокси-сервера.

Дополнительные параметры

Настройте в конфигурации следующие необязательные параметры.

Параметр Описание
--enable-helm-operator Параметр для включения поддержки развертываний чартов Helm.
--helm-operator-params Значения чарта для оператора Helm (если включено). Например, --set helm.versions=v3.
--helm-operator-chart-version Версия чарта для оператора Helm (если включено). Используйте версию 1.2.0 или выше. По умолчанию: 1.2.0.
--operator-namespace Имя для пространства имен оператора. По умолчанию: default. Длина не более 23 символов.
--operator-params Параметры для оператора. Должны быть заданы в одинарных кавычках. Например --operator-params='--git-readonly --sync-garbage-collection --git-branch=main'.

Параметры, поддерживаемые в --operator-params:

Параметр Описание
--git-branch Ветвь репозитория Git для манифестов Kubernetes. Значение по умолчанию — master. В новых репозиториях есть корневая ветвь с именем main, и тогда здесь нужно задать значение --git-branch=main.
--git-path Относительный путь в репозитории Git, где Flux будет размещать манифесты Kubernetes.
--git-readonly Этот репозиторий Git будет считаться доступным только для чтения. Flux не будет выполнять попытки записи в него.
--manifest-generation Если параметр включен, Flux будет искать .flux.yaml и запустит Kustomize или другие генераторы манифестов.
--git-poll-interval Период опроса на наличие новых фиксаций в репозитории Git. По умолчанию используется значение 5m (5 минут).
--sync-garbage-collection Если этот флажок установлен, Flux удалит ресурсы, которые были созданы, но теперь отсутствуют в Git.
--git-label Метка для отслеживания хода синхронизации. Используется для маркировки ветви Git. Значение по умолчанию — flux-sync.
--git-user Имя пользователя для фиксации Git.
--git-email Электронная почта для фиксации Git.

Если вы не хотите, чтобы Flux записывал данные в репозиторий, а значения --git-user и --git-email не заданы, значение для --git-readonly будет присвоено автоматически.

Дополнительные сведения см. в документации по Flux.

Примечание

Flux по умолчанию выполняет синхронизацию из ветви master репозитория Git. При этом более новые репозитории Git имеют корневую ветвь с именем main. В этом случае вам нужно указать --git-branch=main в --operator-params.

Совет

Вы можете создать конфигурацию на портале Azure, используя вкладку GitOps для ресурса Kubernetes с поддержкой Azure Arc.

Проверка конфигурации

Проверка успешного создания конфигурации выполняется с помощью Azure CLI.

az k8s-configuration show --name cluster-config --cluster-name AzureArcTest1 --resource-group AzureArcTest --cluster-type connectedClusters

В ресурс конфигурации будет записываться актуальная информация о состояния соответствия, сообщения и отладочные сведения.

{
  "complianceStatus": {
    "complianceState": "Installed",
    "lastConfigApplied": "2020-12-10T18:26:52.801000+00:00",
    "message": "...",
    "messageLevel": "Information"
  },
  "configurationProtectedSettings": {},
  "enableHelmOperator": false,
  "helmOperatorProperties": {
    "chartValues": "",
    "chartVersion": ""
  },
  "id": "/subscriptions/<sub id>/resourceGroups/AzureArcTest/providers/Microsoft.Kubernetes/connectedClusters/AzureArcTest1/providers/Microsoft.KubernetesConfiguration/sourceControlConfigurations/cluster-config",
  "name": "cluster-config",
  "operatorInstanceName": "cluster-config",
  "operatorNamespace": "cluster-config",
  "operatorParams": "--git-readonly",
  "operatorScope": "cluster",
  "operatorType": "Flux",
  "provisioningState": "Succeeded",
  "repositoryPublicKey": "...",
  "repositoryUrl": "git://github.com/Azure/arc-k8s-demo.git",
  "resourceGroup": "AzureArcTest",
  "sshKnownHostsContents": null,
  "systemData": {
    "createdAt": "2020-12-01T03:58:56.175674+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2020-12-10T18:30:56.881219+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
},
  "type": "Microsoft.KubernetesConfiguration/sourceControlConfigurations"
}

При создании или обновлении конфигурации происходит следующее.

  1. Azure Arc config-agent проверяет наличие новых или обновленных конфигураций в Azure Resource Manager (Microsoft.KubernetesConfiguration/sourceControlConfigurations) и обнаруживает новую конфигурацию Pending.
  2. config-agent считывает свойства конфигурации и создает целевое пространство имен.
  3. Служба Azure Arc controller-manager создает учетную запись службы Kubernetes и сопоставляет ее с ClusterRoleBinding или RoleBinding для соответствующих разрешений (область cluster или namespace). Затем она развертывает экземпляр flux.
  4. При использовании варианта SSH с ключами, созданными Flux, flux создает ключ SSH и записывает открытый ключ в журнал.
  5. config-agent возвращает сведения о состоянии в ресурс конфигурации в Azure.

В ходе подготовки состояние ресурса конфигурации будет несколько раз меняться. Отслеживайте ход выполнения с помощью приведенной выше команды az k8s-configuration show ...:

Изменение состояния Описание
complianceStatus->Pending Представляет исходное состояние и состояние хода выполнения.
complianceStatus ->Installed config-agent удалось настроить кластер и развернуть flux без ошибок.
complianceStatus ->Failed У config-agent возникла ошибка при развертывании flux. Подробные сведения приведены в тексте ответа complianceStatus.message.

Применение конфигурации из частного репозитория Git

Если вы используете частный репозиторий Git, нужно настроить открытый ключ SSH в репозитории. Открытый ключ SSH вы можете предоставить самостоятельно, или его создаст Flux. Открытый ключ можно настроить для определенного репозитория Git или для пользователе Git, который имеет доступ к нужному репозиторию.

Получение собственного открытого ключа

Если вы создали собственные ключи SSH, значит у вас уже есть закрытый и открытый ключи.

Получение открытого ключа с помощью Azure CLI

Используйте следующую команду в Azure CLI, если ключи будет создавать Flux.

az k8s-configuration show --resource-group <resource group name> --cluster-name <connected cluster name> --name <configuration name> --cluster-type connectedClusters --query 'repositoryPublicKey' 
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAREDACTED"

Получение открытого ключа на портале Azure

Выполните следующие шаги на портале Azure, если ключи будет создавать Flux.

  1. На портале Azure перейдите к подключенному кластерному ресурсу.
  2. На странице ресурсов выберите GitOps и просмотрите список конфигураций для этого кластера.
  3. Выберите конфигурацию, которая использует частный репозиторий Git.
  4. В открывшемся окне контекста в нижней части окна скопируйте открытый ключ репозитория.

Добавление открытого ключа с помощью GitHub

Используйте один из следующих методов.

  • Вариант 1. Добавьте открытый ключ в учетную запись пользователя (применяется ко всем репозиториям в учетной записи).

    1. Откройте GitHub и щелкните значок профиля в правом верхнем углу страницы.
    2. Щелкните Параметры.
    3. Щелкните SSH and GPG keys (Ключи SSH и GPG).
    4. Щелкните New SSH key (Новый ключ SSH).
    5. Укажите заголовок.
    6. Вставьте открытый ключ без кавычек.
    7. Щелкните Add SSH key (Добавить ключ SSH).
  • Вариант 2. Добавьте открытый ключ в качестве ключа развертывания в репозиторий Git (применяется только к этому репозиторию).

    1. Откройте GitHub и перейдите в свой репозиторий.
    2. Щелкните Параметры.
    3. Щелкните Deploy keys (Ключи развертывания).
    4. Щелкните Add deploy key (Добавить ключ развертывания).
    5. Укажите заголовок.
    6. Поставьте флажок Allow write access (Разрешить доступ на запись).
    7. Вставьте открытый ключ без кавычек.
    8. Щелкните Add New (Добавить новый).

Добавление открытого ключа с помощью репозитория Azure DevOps

Чтобы добавить ключ в список ключей SSH, сделайте следующее.

  1. В разделе User Settings (Параметры пользователя) в правом верхнем углу (рядом с изображением профиля) щелкните SSH public keys (Открытые ключи SSH).
  2. Щелкните + Создать ключ.
  3. Укажите имя.
  4. Вставьте открытый ключ без кавычек.
  5. Нажмите кнопку Добавить.

Проверка конфигурации Kubernetes

Когда config-agent установит экземпляр flux, сохраненные в репозитории Git ресурсы станут доступными для кластера. С помощью следующей команды убедитесь, что пространства имен, развертывания и ресурсы успешно созданы.

kubectl get ns --show-labels
NAME              STATUS   AGE    LABELS
azure-arc         Active   24h    <none>
cluster-config    Active   177m   <none>
default           Active   29h    <none>
itops             Active   177m   fluxcd.io/sync-gc-mark=sha256.9oYk8yEsRwWkR09n8eJCRNafckASgghAsUWgXWEQ9es,name=itops
kube-node-lease   Active   29h    <none>
kube-public       Active   29h    <none>
kube-system       Active   29h    <none>
team-a            Active   177m   fluxcd.io/sync-gc-mark=sha256.CS5boSi8kg_vyxfAeu7Das5harSy1i0gc2fodD7YDqA,name=team-a
team-b            Active   177m   fluxcd.io/sync-gc-mark=sha256.vF36thDIFnDDI2VEttBp5jgdxvEuaLmm7yT_cuA2UEw,name=team-b

Мы видим, что пространства имен team-a, team-b, itops и cluster-config созданы.

Оператор flux был развернут в пространство имен cluster-config, как указано в ресурсе конфигурации:

kubectl -n cluster-config get deploy  -o wide
NAME             READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                         SELECTOR
cluster-config   1/1     1            1           3h    flux         docker.io/fluxcd/flux:1.16.0   instanceName=cluster-config,name=flux
memcached        1/1     1            1           3h    memcached    memcached:1.5.15               name=memcached

Дальнейшее исследование

Вы можете изучить другие ресурсы, развернутые в составе репозитория конфигурации, сделав следующее.

kubectl -n team-a get cm -o yaml
kubectl -n itops get all

Очистка ресурсов

Удалите конфигурацию с помощью Azure CLI или портала Azure. После выполнения команды удаления ресурс конфигурации будет сразу же удален из Azure. Полное удаление связанных объектов из кластера должно произойти в течение 10 минут. Если на момент удаления конфигурация находится в состоянии сбоя, полное удаление связанных объектов может занять до часа.

Когда удаляется конфигурация с областью действия namespace, Azure Arc не удаляет соответствующее пространство имен, чтобы предотвратить нарушение работы существующих рабочих нагрузок. При необходимости это пространство имен можно удалить вручную с помощью kubectl.

az k8s-configuration delete --name cluster-config --cluster-name AzureArcTest1 --resource-group AzureArcTest --cluster-type connectedClusters

Примечание

Никакие изменения в кластере, произошедшие в результате развертываний из отслеживаемого репозитория Git, не удаляются при удалении конфигурации.

Дальнейшие действия

Перейдите к следующему учебнику, чтобы узнать, как реализовать непрерывную поставку и непрерывную интеграцию с помощью GitOps.