你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Helm 要求概述

Helm 是 Kubernetes 的包管理器,可帮助简化应用程序生命周期管理。 Helm 包称为图表,由 YAML 配置和模板文件组成。 执行 Helm 操作后,图表将呈现到 Kubernetes 清单文件中,以触发相应的应用程序生命周期操作。 为了最有效地与 Azure 运营商服务管理器 (AOSM) 集成,发布者在开发 Helm 图表时应考虑某些最佳做法注意事项。

registryUrl 和 imagePullSecrets 的注意事项

通常,每个 Helm 图表都需要 registryUrl 和 imagePullSecrets。 最常见的情况是,发布者在 values.yaml 中公开这些参数。 起初,AOSM 依赖于发布者以严格的方式公开这些值,因此可以在部署期间将其替换为适当的 Azure 值。 随着时间的推移,并非所有发布者都能轻松遵守 AOSM 要求的对这些值的严格处理。

  • 某些图表将 registryUrl 和/或 imagePullSecrets 隐藏在条件后面,或者并不总是满足的其他值限制之后。
  • 某些图表不会将 registryUrl 和/或 imagePullSecrets 声明为预期的命名字符串,而是声明为数组。

为了降低对发布者的严格合规性要求,AOSM 后来引入了两种改进的方法来处理这些值。 第一种方法是 injectArtifactStoreDetail,最后引入的是群集注册表。 这两种较新的方法不依赖于 Helm 包中出现的有效 registryUrl 或 imagePullSecrets。 相反,这些方法代表网络功能将这些值直接注入到 Pod 操作中。

registryUrl 和 imagePullSecrets 的方法摘要

本文支持并介绍了这三种方法。 发布者应为其网络功能和用例选择最佳选项。

旧方法。

  • 要求发布者在 helm 值和部署模板中合规参数化 registryUrl 和 imagePullSecrets 以进行替换。
  • 映像托管在发布者 Azure 容器注册表 (ACR) 中。

InjectArtifactStoreDetail。

  • 使用 Webhook 将 registryUrl 和 imagePullSecrets 直接注入 Pod 操作,对 helm 的依赖最小。
  • 映像仍托管在发布者 ACR 中。

群集注册表。

  • 使用 Webhook 将 registryUrl 和 imagePullSecrets 直接注入 Pod 操作,不依赖于 helm。
  • 映像托管在本地 NFO 扩展群集注册表中。

注意

在这三种情况下,AOSM 都会使用 AOSM 值替换发布者在模板中公开的任何值。 唯一区别是替换方法。

registryUrl 和 imagePullSecrets 的旧要求

Azure 运营商服务管理器 (AOSM) 使用网络功能管理器 (NFM) 服务来部署容器化网络功能 (CNF)。 使用旧方法时,NFM 在网络功能 (NF) 部署期间会将 AOSM 容器 registryUrl 和 imagePullSecrets 值替换到 helm 操作中。

使用旧方法

下面的 Helm 部署模板演示了发布者应如何公开 registryPath 和 imagePullSecrets,以便与 AOSM 旧方法兼容。

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.schema.json 文件演示了发布者如何轻松设置 registryPath 和 imagePullSecretsvalue 要求,以便与 AOSM 旧方法兼容。

{ 
  "$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" ], 
      } 
   } 
} 

下面的 NFDVersion request payload 演示了发布者如何提供 registryPath 和 imagePullSecretsvalue 值,以便与 AOSM 旧方法兼容。

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

下面的 values.yaml 演示了发布者如何提供 registryPath 和 imagePullSecretsvalue 值,以便与 AOSM 旧方法兼容。

global: 
   imagePullSecrets: [] 
   registryPath: “” 

注意

  • registryPath 设置时不带任何前缀,例如 https://oci://。 如果需要,发布者必须在 Helm 包中定义前缀。
  • 必须在创建 NFDVersion 载入步骤中提供 imagePullSecrets 和 registryPath。

旧方法的其他注意事项

使用旧方法时,发布者应考虑以下建议:

  • 避免引用外部注册表
  • 执行手动验证
  • 确保静态映像存储库和标记

避免引用外部注册表

用户应避免引用外部注册表。 例如,如果 deployment.yaml 使用硬编码的注册表路径或外部注册表引用,验证将失败。

执行手动验证

查看创建的映像和容器规格,以确保映像具有 registryURL 的前缀,并且 imagePullSecrets 填充了 secretName。

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

OR

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

确保静态映像存储库和标记

每个 Helm 图表都应包含静态映像存储库和标记。 静态值设置如下:

  • 在映像行中设置这些值,或者,
  • 在 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}}

registryUrl 和 imagePullSecrets 的 injectArtifactStoreDetails 要求

在某些情况下,第三方 helm chart 可能不完全符合 registryURL 的 AOSM 要求。 在这种情况下,可以使用 injectArtifactStoreDetails 功能来避免对 helm 包进行合规性更改。 启用 injectArtifactStoreDetails 后,将使用 Webhook 方法在 Pod 操作期间动态注入正确的 registryUrl 和 imagePullSecrets。 这会替代 helm 包中配置的值。

使用 injectArtifactStoreDetails 方法

若要启用 injectArtifactStoreDetails,请将 NF 资源 roleOverrides 部分中的 installOptions 参数设置为 true,如以下示例所示。

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 图表包仍必须公开格式正确的 registryURL 和 imagePullSecrets 值。

registryUrl 和 imagePullSecrets 的群集注册表要求

有关使用群集注册表的信息,请参阅概念文档

图表不可变性限制

不可变性限制可防止更改文件或目录。 例如,无法更改或重命名不可变文件。 用户应避免使用可变标记,例如“latest”、“dev”或“stable”。 例如,如果 deployment.yaml 为 .Values.image.tag 使用“latest”,那么部署将失败。

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

图表 CRD 声明和使用情况拆分

建议将客户资源定义 (CRD) 的声明和使用情况拆分为单独的 Helm 图表,以支持更新。 有关详细信息,请参阅:method-2-separate-charts