你当前正在访问 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