Helm 패키지 요구 사항
Helm은 Kubernetes 애플리케이션 관리를 돕는 Kubernetes용 패키지 관리자입니다. Helm 패키지는 차트라고 하며 몇 가지 YAML 구성 파일과 Kubernetes 매니페스트 파일로 렌더링되는 일부 템플릿으로 구성됩니다. 차트는 모든 환경에서 누구나 재사용할 수 있으므로 복잡성과 중복이 줄어듭니다.
레지스트리 URL 경로 및 imagepullsecrets 요구 사항
일반적으로 Helm 패키지를 개발할 때 값에 컨테이너 레지스트리 서버 URL을 유지합니다. 컨테이너 레지스트리 서버 URL을 값으로 유지하는 것은 각 환경 컨테이너 레지스트리 간에 아티팩트를 이동하는 데 유용합니다. AOSM(Azure Operator Service Manager)은 NFM(네트워크 기능 관리자) 서비스를 사용하여 CNF(컨테이너화된 네트워크 기능)를 배포합니다. NFM(네트워크 기능 관리자)에는 NF(네트워크 기능) 배포 중에 컨테이너 레지스트리 서버 위치 및 imagepullsecrets를 helm 값에 삽입하는 함수가 포함되어 있습니다. imagePullSecret은 레지스트리에 액세스하는 데 사용되는 Docker 자격 증명을 저장하는 권한 부여 토큰(비밀이라고도 함)입니다. 예를 들어, Kubernetes 배포를 통해 애플리케이션을 배포해야 하는 경우 다음 예와 같이 배포를 정의할 수 있습니다.
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
은 Helm 차트의 단일 위치에서 값 요구 사항과 제약 조건을 쉽게 설정할 수 있는 파일입니다. 이 파일에서 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" ],
}
}
}
NFDVersion 요청 페이로드는 RegistryValuesPaths에 다음 값을 제공합니다.
"registryValuesPaths": [ "global.registryPath" ],
"imagePullSecretsValuesPaths": [ "global.imagePullSecrets" ],
NF 배포 중에 NFO(네트워크 기능 운영자)는 RegistryPath를 올바른 ACR(Azure Container Registry) 서버 위치로 설정합니다. 예를 들어, NFO는 다음과 같은 동등한 명령을 실행합니다.
$ helm install --set "global.registryPath=<registryURL>" --set "global.imagePullSecrets[0].name=<secretName>" releasename ./releasepackage
참고 항목
RegistryPath는 https:// 또는 oci://와 같은 접두사 없이 설정됩니다. helm 패키지에 접두사가 필요한 경우 게시자는 패키지에서 이를 정의해야 합니다.
values.yaml
은 Helm 차트의 기본값이 포함된 파일입니다. 차트의 기본값을 정의하는 YAML 파일입니다. value.yaml 파일에는 두 가지 형식의 변수(imagePullSecrets 및 RegistryPath)가 있어야 합니다. 각각은 표에 설명되어 있습니다.
global:
imagePullSecrets: []
registryPath: “”
이름 | 형식 | 설명 |
---|---|---|
imagePullSecrets | 문자열 | imagePullSecrets는 컨테이너 이미지를 가져오는 데 사용되는 비밀 이름의 배열입니다. |
registryPath | 문자열 | RegistryPath는 AzureContainerRegistry 서버 위치입니다. |
NFDVersion 온보딩 단계 만들기에서 imagePullSecrets 및 RegistryPath를 제공해야 합니다.
클러스터에서 실행 중인 NFO는 helm install –set 명령을 사용하여 helm 릴리스 중에 이러한 두 변수(imagePullSecrets 및 RegistryPath)를 채웁니다.
자세한 내용은 pull-image-private-registry를 참조하세요.
불변성 제한
불변성 제한으로 인해 파일이나 디렉터리가 변경되지 않습니다. 예를 들어, 변경이 불가능한 파일은 변경하거나 이름을 바꿀 수 없으며 추가 작업을 허용하는 파일은 삭제, 수정 또는 이름을 바꿀 수 없습니다.
변경 가능한 태그 사용 방지
사용자는 최신, 개발 또는 안정과 같은 변경 가능한 태그를 사용하지 않아야 합니다. 예를 들어, development.yaml이 .Values.image.tag에 '최신'을 사용한 경우 배포가 실패합니다.
image: "{{ .Values.global.registryPath }}/{{ .Values.image.repository }}:{{ .Values.image.tag}}“
외부 레지스트리에 대한 참조 방지
사용자는 외부 레지스트리에 대한 참조를 사용하지 않아야 합니다. 예를 들어, development.yaml이 하드코딩된 레지스트리 경로나 외부 레지스트리 참조를 사용하는 경우 유효성 검사에 실패합니다.
image: http://myURL/{{ .Values.image.repository }}:{{ .Values.image.tag}}
권장 사항
CRD(사용자 지정 리소스 정의) 선언 및 사용법을 분할하고 수동 유효성 검사를 사용하는 것이 좋습니다. 각 내용은 다음 섹션에서 설명됩니다.
CRD 선언 및 사용법 분할
업데이트를 지원하려면 CRD의 선언과 사용을 별도의 helm 차트로 분할하는 것이 좋습니다. 자세한 내용은 method-2-separate-charts를 참조하세요.
수동 유효성 검사
만들어진 이미지와 컨테이너 사양을 검토하여 이미지에 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(Network Function Design Version)에서 이러한 값을 노출하지 않습니다.
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