5.3. CRD(사용자 정의 리소스 정의) 업그레이드 안전성
OLM(Operator Lifecycle Manager) v1은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
클러스터 확장에서 제공하는 CRD(사용자 정의 리소스 정의)를 업데이트하면 OLM(Operator Lifecycle Manager) v1은 CRD 업그레이드 안전 우선 순위 검사를 실행하여 이전 버전의 CRD와 이전 버전과의 호환성을 보장합니다. CRD 업데이트에서는 클러스터에서 변경 사항을 진행하기 전에 검증 검사를 전달해야 합니다.
추가 리소스
5.3.1. CRD 업그레이드 금지
기존 CRD(사용자 정의 리소스 정의)에 대한 다음과 같은 변경 사항은 CRD 업그레이드 safety preflight 검사를 통해 발생하며 업그레이드를 방지합니다.
- 새 필수 필드가 기존 CRD 버전에 추가됩니다.
- 기존 필드가 기존 CRD 버전에서 제거됨
- 기존 필드 유형이 기존 CRD 버전에서 변경됨
- 이전에 기본값이 없는 필드에 새 기본값이 추가됩니다.
- 필드의 기본값이 변경됨
- 필드의 기존 기본값이 제거됨
- 이전에 enum 제한이 없는 기존 필드에 새로운 enum 제한 사항이 추가됨
- 기존 필드의 기존 enum 값이 제거됩니다.
- 기존 필드의 최소값이 기존 버전에서 증가했습니다.
- 기존 필드의 최대값이 기존 버전에서 감소합니다.
- 이전에 제약 조건이 없는 필드에 최소 또는 최대 필드 제약 조건이 추가됩니다.
최소 및 최대값에 대한 변경 규칙은 최소 ,minLength
,minProperties
,minItems
,최대
,maxLength
,maxProperties
및 maxItems
제약 조건에 적용됩니다.
기존 CRD에 대한 다음 변경 사항은 CRD 업그레이드 안전성 검사에서 보고하고 Kubernetes API 서버에서 작업을 기술적으로 처리하지만 업그레이드를 방지합니다.
-
범위가 클러스터에서
네임스페이스
에서로
또는 네임스페이스클러스터로
변경
- 저장된 CRD의 기존 버전이 제거됩니다.
CRD 업그레이드 safety preflight 검사에서 금지된 업그레이드 변경 중 하나가 발생하면 CRD 업그레이드에서 감지된 각 변경에 대한 오류를 기록합니다.
CRD에 대한 변경이 금지된 변경 카테고리 중 하나에 속하지 않지만 허용된 대로 적절하게 감지할 수 없는 경우 CRD 업그레이드 안전 전지 검사를 통해 업그레이드를 방지하고 "알 수 없는 변경"에 대한 오류를 기록합니다.
5.3.2. CRD 업그레이드 허용 변경
기존 CRD(사용자 정의 리소스 정의)에 대한 다음 변경 사항은 이전 버전과의 호환성을 위해 안전하지 않으며 CRD 업그레이드 안전 전선 검사로 인해 업그레이드가 중단되지 않습니다.
- 필드에 허용된 enum 값 목록에 새 enum 값 추가
- 기존 필수 필드가 기존 버전에서 선택 사항으로 변경되었습니다.
- 기존 버전의 기존 필드의 최소값이 감소합니다.
- 기존 필드의 최대값이 기존 버전에서 증가했습니다.
- 기존 버전에 대한 수정 없이 새 CRD 버전이 추가되었습니다.
5.3.3. CRD 업그레이드 안전 전 검사 비활성화
CRD(사용자 정의 리소스 정의) 업그레이드 우선 순위 검사는 CRD를 제공하는 ClusterExtension
오브젝트에 값이 true
인 preflight.crdUpgradeSafety.disabled
필드를 추가하여 비활성화할 수 있습니다.
CRD 업그레이드 안전 전지를 비활성화하면 저장된 CRD 버전과의 호환성이 중단되어 클러스터에 의도하지 않은 다른 결과가 발생할 수 있습니다.
개별 필드 검증기를 비활성화할 수 없습니다. CRD 업그레이드 safety preflight 검사를 비활성화하면 모든 필드 검증기가 비활성화됩니다.
다음 검사는 Kubernetes API 서버에서 처리합니다.
-
범위가 클러스터에서
네임스페이스
에서로
또는 네임스페이스클러스터로
변경
- 저장된 CRD의 기존 버전이 제거됩니다.
OLM(Operator Lifecycle Manager) v1을 통해 CRD 업그레이드 안전 검사를 비활성화한 후에도 Kubernetes에서 이 두 작업을 계속 방지할 수 있습니다.
사전 요구 사항
- 클러스터 확장이 설치되어 있어야 합니다.
프로세스
CRD의
ClusterExtension
오브젝트를 편집합니다.$ oc edit clusterextension <clusterextension_name>
preflight.crdUpgradeSafety.disabled
필드를true
로 설정합니다.예 5.22.
ClusterExtension
오브젝트의 예apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: clusterextension-sample spec: installNamespace: default packageName: argocd-operator version: 0.6.0 preflight: crdUpgradeSafety: disabled: true 1
- 1
true
로 설정합니다.
5.3.4. 안전하지 않은 CRD 변경의 예
다음 예제에서는 CRD 업그레이드 안전 전 검사에 의해 catch되는 예제 CRD(사용자 정의 리소스 정의) 섹션의 특정 변경 사항을 보여줍니다.
다음 예제에서는 다음 시작 상태의 CRD 오브젝트를 고려하십시오.
예 5.23. CRD 오브젝트의 예
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.13.0 name: example.test.example.com spec: group: test.example.com names: kind: Sample listKind: SampleList plural: samples singular: sample scope: Namespaced versions: - name: v1alpha1 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object pollInterval: type: string type: object served: true storage: true subresources: status: {}
5.3.4.1. 범위 변경
다음 CRD(사용자 정의 리소스 정의) 예에서 scope
필드가 Namespaced
에서 Cluster
로 변경됩니다.
예 5.24. CRD의 범위 변경 예
spec: group: test.example.com names: kind: Sample listKind: SampleList plural: samples singular: sample scope: Cluster versions: - name: v1alpha1
예 5.25. 오류 출력 예
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoScopeChange" validation failed: scope changed from "Namespaced" to "Cluster"
5.3.4.2. 저장된 버전 제거
다음 CRD(사용자 정의 리소스 정의) 예제에서는 기존 저장된 버전 v1alpha1
이 제거됩니다.
예 5.26. CRD에서 저장된 버전 제거 예
versions: - name: v1alpha2 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object pollInterval: type: string type: object
예 5.27. 오류 출력 예
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoStoredVersionRemoved" validation failed: stored version "v1alpha1" removed
5.3.4.3. 기존 필드 제거
다음 CRD(사용자 정의 리소스 정의) 예에서는 pollInterval
속성 필드가 v1alpha1
스키마에서 제거됩니다.
예 5.28. CRD의 기존 필드 제거 예
versions: - name: v1alpha1 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object type: object
예 5.29. 오류 출력 예
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoExistingFieldRemoved" validation failed: crd/test.example.com version/v1alpha1 field/^.spec.pollInterval may not be removed
5.3.4.4. 필수 필드 추가
다음 CRD(사용자 정의 리소스 정의) 예에서는 pollInterval
속성이 필수 필드로 변경되었습니다.
예 5.30. CRD의 필수 필드 추가 예
versions: - name: v1alpha2 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object pollInterval: type: string type: object required: - pollInterval
예 5.31. 오류 출력 예
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "ChangeValidator" validation failed: version "v1alpha1", field "^": new required fields added: [pollInterval]