Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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."
}
}