Helm 요구 사항 개요
Helm은 애플리케이션 수명 주기 관리를 간소화하는 데 도움이 되는 Kubernetes의 패키지 관리자입니다. Helm 패키지는 차트라고 하며 YAML 구성 및 템플릿 파일로 구성됩니다. Helm 작업을 실행하면 차트가 Kubernetes 매니페스트 파일로 렌더링되어 적절한 애플리케이션 수명 주기 작업을 트리거합니다. AOSM(Azure Operator Service Manager)과의 가장 효율적인 통합을 위해 게시자는 Helm 차트를 개발할 때 특정 모범 사례 고려 사항을 고려해야 합니다.
registryUrl 및 imagePullSecrets에 대한 고려 사항
모든 Helm 차트에는 일반적으로 선언된 registryUrl 및 imagePullSecrets가 필요합니다. 게시자는 이러한 두 매개 변수를 values.yaml의 변수로 일관되게 정의하는 것이 좋습니다. 처음에 AOSM은 게시자가 이러한 값을 엄격한 방식으로 노출하는 데 의존했기 때문에 배포 중에 수집한 다음 삽입할 수 있습니다. 이 방법을 레거시 메서드라고 합니다. 모든 게시자 차트가 AOSM에 필요한 registryUrl 및 imagePullSecrets의 엄격한 정의를 준수하는 것은 아니기 때문에 초과 작업으로 인해 많은 합병증이 발생했습니다.
- 일부 차트는 조건부 뒤에 registryUrl 및/또는 imagePullSecrets를 숨기거나 항상 충족되지 않는 다른 값 제한을 숨깁니다.
- 일부 차트는 registryUrl 및/또는 imagePullSecrets를 예상된 명명된 문자열로 선언하지 않고 배열로 선언합니다.
registryUrl 및 imagePullSecrets에 대한 게시자의 엄격한 준수 요구 사항을 줄이기 위해 AOSM은 나중에 이러한 값을 처리하는 두 가지 향상된 방법을 도입했습니다. 먼저 injectArtifactStoreDetail 및 마지막으로 클러스터 레지스트리. 이러한 두 가지 최신 메서드는 Helm 패키지에 표시되는 registryUrl 또는 imagePullSecrets에 전혀 의존하지 않습니다. 대신 이러한 메서드는 네트워크 함수를 대신하여 이러한 값을 파생하고 삽입합니다.
registryUrl 및 imagePullSecrets에 대한 메서드 요약
유산.
- 대체를 위해 helm 값 및 템플릿에서 registryUrl 및 imagePullSecrets를 올바르게 매개 변수화하는 데 필요한 게시자입니다.
- 게시자 ACR(Azure Container Registry)에서 호스트되는 이미지입니다.
InjectArtifactStoreDetail.
- 웹후크를 사용하여 helm에 대한 종속성 없이 registryUrl 및 imagePullSecrets를 Pod에 직접 삽입합니다.
- 게시자 ACR에서 여전히 호스트되는 이미지입니다.
클러스터 레지스트리.
- InjectArtifactStoreDetail과 동일하며, 이제 이미지가 로컬 클러스터 레지스트리에 호스트된다는 점을 제외하면.
참고 항목
세 가지 경우 모두 AOSM은 AOSM 파생 비밀을 게시자가 템플릿에 노출하는 비밀로 대체합니다. 유일한 차이점은 Legacy 및 InjectArtifactStoreDetail이며, 비밀은 게시자 ACR에 바인딩되고 클러스터 레지스트리에서는 비밀이 클러스터 레지스트리에 바인딩됩니다.
registryUrl 및 imagePullSecrets에 대한 레거시 요구 사항
AOSM(Azure Operator Service Manager)은 NFM(네트워크 기능 관리자) 서비스를 사용하여 CNF(컨테이너화된 네트워크 기능)를 배포합니다. NFM은 NF(네트워크 함수) 배포 중에 컨테이너 registryUrl 및 imagePullSecrets를 helm 값에 동적으로 삽입합니다. 다음 helm 배포 템플릿은 게시자가 AOSM 레거시 접근 방식과의 호환성을 위해 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.schema.json
파일은 게시자가 AOSM 레거시 접근 방식과의 호환성을 위해 registryPath 및 imagePullSecretsvalue 요구 사항을 쉽게 설정할 수 있는 방법의 예를 보여 줍니다.
{
"$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
게시자가 AOSM 레거시 방식과의 호환성을 위해 registryPath 및 imagePullSecretsvalue 값을 제공하는 방법의 예제를 보여 줍니다.
"registryValuesPaths": [ "global.registryPath" ],
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ],
다음은 values.yaml
게시자가 AOSM 레거시 방식과의 호환성을 위해 registryPath 및 imagePullSecretsvalue 값을 제공하는 방법의 예제를 보여 줍니다.
global:
imagePullSecrets: []
registryPath: “”
속성 | 형식 | 설명 |
---|---|---|
imagePullSecrets | 문자열 | imagePullSecrets는 컨테이너 이미지를 가져오는 데 사용되는 비밀 이름의 배열입니다. |
registryPath | 문자열 | RegistryPath는 AzureContainerRegistry 서버 위치입니다. |
참고 항목
- registryPath는 다음과 같은
https://
접두사 없이 설정됩니다oci://
. 필요한 경우 게시자는 Helm 패키지에 접두사를 정의해야 합니다. - NFDVersion 온보딩 단계 만들기에서 imagePullSecrets 및 RegistryPath를 제공해야 합니다.
외부 레지스트리에 대한 참조 방지
사용자는 외부 레지스트리에 대한 참조를 사용하지 않아야 합니다. 예를 들어, development.yaml이 하드코딩된 레지스트리 경로나 외부 레지스트리 참조를 사용하는 경우 유효성 검사에 실패합니다.
수동 유효성 검사
만들어진 이미지와 컨테이너 사양을 검토하여 이미지에 RegistryURL이라는 접두사가 있고 imagePullSecrets가 secretName으로 채워져 있는지 확인합니다.
helm template --set "global.imagePullSecrets[0].name=<secretName>" --set "global.registry.url=<registryURL>" <release-name> <chart-name> --dry-run
또는
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 차트에는 정적 이미지 리포지토리와 태그가 포함되어야 합니다. 정적 값은 다음과 같이 설정됩니다.
- 이미지 줄에서 설정하거나
- value.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 차트가 registryURL에 대한 AOSM 요구 사항을 완전히 준수하지 않을 수 있습니다. 이 경우 helm 패키지를 변경하지 않도록 injectArtifactStoreDetails 기능을 사용할 수 있습니다. injectArtifactStoreDetails를 사용하려면 NF 리소스 roleOverrides 섹션의 installOptions 매개 변수를 true로 설정한 다음 Helm 차트 패키지에서 레지스트리 URL을 유효한 상태로 유지하는 데 필요한 모든 registryURL 값을 사용합니다. 사용하도록 설정된 injectArtifactStoreDetails 매개 변수의 다음 예제를 참조하세요.
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"}}}}}'
]
}
}
차트 불변성 제한 사항
불변성 제한으로 인해 파일이나 디렉터리가 변경되지 않습니다. 예를 들어 변경할 수 없는 파일은 변경하거나 이름을 바꿀 수 없습니다. 사용자는 최신, 개발 또는 안정과 같은 변경 가능한 태그를 사용하지 않아야 합니다. 예를 들어, development.yaml이 .Values.image.tag에 '최신'을 사용한 경우 배포가 실패합니다.
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}“
차트 CRD 선언 및 사용량 분할
업데이트를 지원하려면 CRD(고객 리소스 정의)의 선언 및 사용을 별도의 Helm 차트로 분할하는 것이 좋습니다. 자세한 내용은 method-2-separate-charts를 참조하세요.