Рекомендации по пакету Helm

Helm — это менеджер пакетов для Kubernetes, который помогает упростить управление жизненным циклом приложений. Пакеты Helm называются диаграммами и состоят из файлов конфигурации и шаблонов YAML. После выполнения операции Helm диаграммы отображаются в файлах манифеста Kubernetes, чтобы активировать соответствующие действия жизненного цикла приложения. Для наиболее эффективной интеграции с Azure Operator Service Manager следуйте приведенным ниже рекомендациям при разработке диаграмм Helm.

Рекомендации по registryPath и imagePullSecrets

Для каждой диаграммы Helm обычно требуются registryPath и imagePullSecrets параметры. Чаще всего эти параметры предоставляются в values.yaml файле. Во-первых, Диспетчер служб оператора Azure зависит от издателей, управляющих этими значениями строго (устаревшим подходом), которые следует заменить соответствующими значениями Azure во время развертывания. Но не все издатели могут легко соответствовать строгому управлению этими значениями. Некоторые диаграммы скрывают registryPath условные условия или imagePullSecrets другие ограничения значений, которые не всегда соблюдались. Некоторые диаграммы объявляют registryPath и (или) imagePullSecrets в виде массива вместо ожидаемой именованной строки.

Чтобы снизить требования к соответствию издателям, Диспетчер служб Azure представил два улучшенных метода: injectArtifactStoreDetail и реестр кластеров. Эти новые методы не зависят или registryPathimagePullSecrets не отображаются в пакете Helm. Вместо этого эти методы используют веб-перехватчик для внедрения соответствующих значений Azure непосредственно в операции pod.

Сводка по методам registryPath и imagePullSecrets

Все три метода в настоящее время поддерживаются, как описано в этой статье. Выберите оптимальный вариант для сетевой функции (NF) и вариант использования.

Наследство:

  • Требуется параметризация registryPath и imagePullSecrets использование значений Helm и шаблонов развертывания для подстановки.
  • Размещает образы в реестре контейнеров Azure.

InjectArtifactStoreDetail:

  • Использует веб-перехватчик для внедрения registryPath и imagePullSecrets непосредственно в операции pod с минимальными зависимостями от Helm.
  • Размещает образы в реестре контейнеров Azure.

Реестр кластеров:

  • Использует веб-перехватчик для внедрения registryPath и imagePullSecrets непосредственно в операции pod без зависимости от Helm.
  • Размещает изображения в расширении локальной сетевой функции (NFO).

Во всех трех случаях Диспетчер служб оператора Azure заменяет значения Azure любым значениям, предоставляемым в шаблонах. Единственное различие заключается в методе подстановки.

Устаревшие требования для registryPath и imagePullSecrets

Диспетчер служб Azure использует службу Диспетчера сетевых функций Azure для развертывания контейнерных сетевых функций (CNFs). С помощью устаревшего метода Диспетчер сетевых функций Azure заменяет контейнер и значения контейнера registryPathimagePullSecrets Service Manager Оператора Azure в операцию Helm во время развертывания сетевых функций.

Пример устаревшего метода

В следующем шаблоне развертывания Helm показан пример того, как вы должны предоставлять registryPath и imagePullSecrets:

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: nginx-deployment 
  labels: 
    app: nginx 
spec: 
  replicas: 3 
  selector: 
    matchLabels: 
      app: nginx 
  template: 
    metadata: 
      labels: 
        app: nginx 
    spec: 
      {{- if .Values.global.imagePullSecrets }} 
      imagePullSecrets: {{ toYaml .Values.global.imagePullSecrets | nindent 8 }} 
      {{- end }} 
      containers: 
      - name: contosoapp 
        image:{{ .Values.global.registryPath }}/contosoapp:1.14.2 
        ports: 
        - containerPort: 80 

В следующем values.yaml шаблоне показан пример предоставления и registryPath значенийimagePullSecrets:

global: 
   imagePullSecrets: [] 
   registryPath: "" 

В следующем values.schema.json файле показан пример определения и registryPath значенийimagePullSecrets:

{ 
  "$schema": "http://json-schema.org/draft-07/schema#", 
  "title": "StarterSchema", 
  "type": "object", 
  "required": ["global"], 
  "properties": { 
      "global" : {
          "type": "object",
          "properties": {
              "registryPath": {"type": "string"}, 
              "imagePullSecrets": {"type": "string"}, 
          }
          "required": [ "registryPath", "imagePullSecrets" ], 
      } 
   } 
} 

В следующей версии определения сетевой функции (полезные данные запроса NFDV) показан пример того, как можно указать registryPath значения и imagePullSecrets значения при развертывании:

"registryValuesPaths": [ "global.registryPath" ], 
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ], 

В предыдущих примерах:

  • Значение registryPath задано без префикса, например https:// или oci://. При необходимости определите префикс в пакете Helm.
  • imagePullSecrets и registryPath должен быть предоставлен во время подключения NFDV.

Другие вопросы

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

Избегайте ссылок на внешний реестр

Ссылки на внешний реестр могут вызвать проблемы с проверкой. Например, если deployment.yaml используется жестко закодированный путь к реестру или ссылки на внешний реестр, проверка завершается ошибкой.

Выполнение ручной проверки

Просмотрите спецификации образов и контейнеров, чтобы убедиться, что образы имеют префикс registryPath и imagePullSecrets заполнены следующим secretNameобразом:

 helm template --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryPath>" <release-name> <chart-name> --dry-run

Ниже приведен еще один пример:

 helm install --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryPath>" <release-name> <chart-name> --dry-run
 kubectl create secret <secretName> regcred --docker-server=<registryPath> --dockerusername=<regusername> --docker-password=<regpassword>

Использование репозитория статических образов и тегов

Каждая диаграмма Helm должна содержать репозиторий статических образов и теги. Статические значения задаются одним из следующих методов:

  • В строке image
  • Без values.yamlпредоставления этих значений в NFDV

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

 image: "{{ .Values.global.registryPath }}/contosoapp:1.14.2"
 image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}"
 
YAML values.yaml
image:
  repository: contosoapp
  tag: 1.14.2
 image: http://myUrl/{{ .Values.image.repository }}:{{ .Values.image.tag}}

Требования injectArtifactStoreDetails для реестраPath и imagePullSecrets

В некоторых случаях сторонние диаграммы Helm могут не соответствовать требованиям Azure Operator Service Manager для registryPath. В этих случаях можно injectArtifactStoreDetails избежать внесения изменений в пакеты Helm.

С injectArtifactStoreDetails включенным методом веб-перехватчика используется для внедрения правильных registryPath и imagePullSecrets динамических операций pod. Этот метод переопределяет значения, настроенные в пакете Helm. Вы по-прежнему должны использовать юридические фиктивные значения, где registryPath и imagePullSecrets ссылаются, как правило, в global разделе values.yaml.

В следующем values.yaml примере показано, как предоставить registryPath и imagePullSecrets значения для совместимости с подходом injectArtifactStoreDetails :

global: 
   registryPath: "azure.io"
   imagePullSecrets: ["abc123"] 

Примечание.

Если registryPath в базовом пакете Helm осталось пустым, развертывание сетевой службы сайта (SNS) завершается сбоем во время скачивания образа.

Использование метода injectArtifactStoreDetails

Чтобы включитьinjectArtifactStoreDetails, задайте installOptions параметр в разделе roleOverridesресурса true NF, как показано в следующем примере:

resource networkFunction 'Microsoft.HybridNetwork/networkFunctions@2023-09-01' = {
  name: nfName
  location: location
  properties: {
    nfviType: 'AzureArcKubernetes'
    networkFunctionDefinitionVersionResourceReference: {
      id: nfdvId
      idType: 'Open'
    }
    allowSoftwareUpdate: true
    nfviId: nfviId
    deploymentValues: deploymentValues
    configurationType: 'Open'
    roleOverrideValues: [
      // Use inject artifact store details feature on test app 1
      '{"name":"testapp1", "deployParametersMappingRuleProfile":{"helmMappingRuleProfile":{"options":{"installOptions":{"atomic":"false","wait":"false","timeout":"60","injectArtifactStoreDetails":"true"},"upgradeOptions": {"atomic": "false", "wait": "true", "timeout": "100", "injectArtifactStoreDetails": "true"}}}}}'
    ]
  }
}

Примечание.

Пакет диаграмм Helm по-прежнему должен предоставлять правильный формат registryPath и imagePullSecrets значения.

Требования к реестру кластера для registryPath и imagePullSecrets

В реестре кластеров образы копируются из реестра контейнеров Azure в локальный репозиторий Docker в кластере Nexus Kubernetes. Метод веб-перехватчика используется для динамического внедрения правильных registryPath значений и imagePullSecrets значений во время операций pod. Этот метод переопределяет значения, настроенные в пакете Helm. Вы по-прежнему должны использовать юридические фиктивные значения, где registryPath и imagePullSecrets ссылаются, как правило, в global разделе values.yaml.

В следующем values.yaml примере показано, как предоставить registryPath и imagePullSecrets значения для совместимости с подходом реестра кластера:

global: 
   registryPath: "azure.io"
   imagePullSecrets: ["abc123"] 

Примечание.

Если registryPath в базовом пакете Helm осталось пустым, развертывание SNS завершается сбоем во время скачивания образа.

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

Рекомендации по неизменяемости ограничений

Ограничения неизменяемости препятствуют изменению файла или каталога. Например, неизменяемый файл нельзя изменить или переименовать. Следует избегать использования изменяемых тегов, таких как latest, devили stable. Например, если deployment.yaml используется дляlatest, развертывание завершается .Values.image.tag ошибкой.

 image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}"

Рекомендации по объявлению и использованию CRD

Мы рекомендуем разделить объявление и использование определений ресурсов клиента (CRD) на отдельные диаграммы Helm для поддержки обновлений. Подробные сведения см. в документации Helm по разделению диаграмм.

Рекомендации по тегам версии образа

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

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

Эти методики помогают предотвратить проблемы с развертыванием и улучшить трассировку, безопасность отката и соответствие требованиям безопасности.

Рекомендации по последовательному упорядочению nfApplication

По умолчанию приложения CNF устанавливаются или обновляются в зависимости от порядка их отображения в NFDV. Для операции удаления приложения CNF удаляются в указанном обратном порядке. Если необходимо определить определенный порядок приложений CNF, отличающихся от значения по умолчанию, используйте dependsOnProfile для определения уникальной последовательности для операций установки, обновления и удаления.

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

Вы можете использовать dependsOnProfile в NFDV для управления последовательностью выполнения команд Helm для управления приложениями типа CNF. В следующем примере:

  • Во время установки приложения CNF развертываются в следующем порядке: dummyApplication1, dummyApplication2. dummyApplication
  • Во время операции обновления приложения CNF обновляются в следующем порядке: dummyApplication2, dummyApplication1. dummyApplication
  • Во время операции удаления приложения CNF удаляются в следующем порядке: dummyApplication2, dummyApplication1. dummyApplication
{
    "location": "eastus",
    "properties": {
        "networkFunctionTemplate": {
            "networkFunctionApplications": [
                {
                  "dependsOnProfile": {
                        "installDependsOn": [
                            "dummyApplication1",
                            "dummyApplication2"
                        ],
                        "uninstallDependsOn": [
                            "dummyApplication1"
                        ],
                        "updateDependsOn": [
                            "dummyApplication1"
                        ]
                    },
                    "name": "dummyApplication"
                },
                {
                  "dependsOnProfile": {
                        "installDependsOn": [
                        ],
                        "uninstallDependsOn": [
                            "dummyApplication2"
                        ],
                        "updateDependsOn": [
                            "dummyApplication2"
                        ]
                    },
                    "name": "dummyApplication1"
                },
                {
                    "dependsOnProfile": null,
                    "name": "dummyApplication2"
                }
            ],
            "nfviType": "AzureArcKubernetes"
        },
        "networkFunctionType": "ContainerizedNetworkFunction"
    }
}

Частые ошибки в работе с dependsOnProfile

В настоящее время, если предоставленный в NFDV dependsOnProfile код недействителен, завершается операция NF с ошибкой валидации. Сообщение об ошибке проверки отображается в ресурсе состояния операции и выглядит примерно так:

 {
  "id": "/providers/Microsoft.HybridNetwork/locations/EASTUS2EUAP/operationStatuses/ca051ddf-c8bc-4cb2-945c-a292bf7b654b*C9B39996CFCD97AB3A121AE136ED47F67BB13946C573EF90628C47628BC5EF5F",
  "name": "ca051ddf-c8bc-4cb2-945c-a292bf7b654b*C9B39996CFCD97AB3A121AE136ED47F67BB13946C573EF90628C47628BC5EF5F",
  "resourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/xinrui-publisher/providers/Microsoft.HybridNetwork/networkfunctions/testnfDependsOn02",
  "status": "Failed",
  "startTime": "2023-07-17T20:48:01.4792943Z",
  "endTime": "2023-07-17T20:48:10.0191285Z",
  "error": {
    "code": "DependenciesValidationFailed",
    "message": "CyclicDependencies: Circular dependencies detected at hellotest."
  }
}