2.2. Operator 프레임워크 패키지 형식
이 가이드에서는 OpenShift Container Platform의 OLM(Operator Lifecycle Manager)에서 지원하는 Operator의 패키지 형식에 대해 간단히 설명합니다.
2.2.1. 번들 형식
Operator의 번들 형식은 Operator 프레임워크에서 도입한 패키지 형식입니다. 번들 형식 사양에서는 확장성을 개선하고 자체 카탈로그를 호스팅하는 업스트림 사용자를 더 효과적으로 지원하기 위해 Operator 메타데이터의 배포를 단순화합니다.
Operator 번들은 단일 버전의 Operator를 나타냅니다. 디스크상의 번들 매니페스트는 컨테이너화되어 번들 이미지(Kubernetes 매니페스트와 Operator 메타데이터를 저장하는 실행 불가능한 컨테이너 이미지)로 제공됩니다. 그런 다음 podman
및 docker
와 같은 기존 컨테이너 툴과 Quay와 같은 컨테이너 레지스트리를 사용하여 번들 이미지의 저장 및 배포를 관리합니다.
Operator 메타데이터에는 다음이 포함될 수 있습니다.
- Operator 확인 정보(예: 이름 및 버전)
- UI를 구동하는 추가 정보(예: 아이콘 및 일부 예제 CR(사용자 정의 리소스))
- 필요한 API 및 제공된 API.
- 관련 이미지.
Operator 레지스트리 데이터베이스에 매니페스트를 로드할 때 다음 요구 사항이 검증됩니다.
- 번들의 주석에 하나 이상의 채널이 정의되어 있어야 합니다.
- 모든 번들에 정확히 하나의 CSV(클러스터 서비스 버전)가 있습니다.
- CSV에 CRD(사용자 정의 리소스 정의)가 포함된 경우 해당 CRD가 번들에 있어야 합니다.
2.2.1.1. 매니페스트
번들 매니페스트는 Operator의 배포 및 RBAC 모델을 정의하는 Kubernetes 매니페스트 세트를 나타냅니다.
번들에는 디렉터리당 하나의 CSV와 일반적으로 /manifests
디렉터리에서 CSV의 고유 API를 정의하는 CRD가 포함됩니다.
Bundle 형식 레이아웃의 예
etcd ├── manifests │ ├── etcdcluster.crd.yaml │ └── etcdoperator.clusterserviceversion.yaml │ └── secret.yaml │ └── configmap.yaml └── metadata └── annotations.yaml └── dependencies.yaml
추가 지원 오브젝트
다음과 같은 오브젝트 유형도 번들의 /manifests
디렉터리에 선택적으로 포함될 수 있습니다.
지원되는 선택적 오브젝트 유형
-
ClusterRole
-
ClusterRoleBinding
-
ConfigMap
-
ConsoleCLIDownload
-
ConsoleLink
-
ConsoleQuickStart
-
ConsoleYamlSample
-
PodDisruptionBudget
-
PriorityClass
-
PrometheusRule
-
Role
-
RoleBinding
-
Secret
-
Service
-
ServiceAccount
-
ServiceMonitor
-
VerticalPodAutoscaler
이러한 선택적 오브젝트가 번들에 포함된 경우 OLM(Operator Lifecycle Manager)은 번들에서 해당 오브젝트를 생성하고 CSV와 함께 해당 라이프사이클을 관리할 수 있습니다.
선택적 오브젝트의 라이프사이클
- CSV가 삭제되면 OLM은 선택적 오브젝트를 삭제합니다.
CSV가 업그레이드되면 다음을 수행합니다.
- 선택적 오브젝트의 이름이 동일하면 OLM에서 해당 오브젝트를 대신 업데이트합니다.
- 버전 간 선택적 오브젝트의 이름이 변경된 경우 OLM은 해당 오브젝트를 삭제하고 다시 생성합니다.
2.2.1.2. 주석
번들의 /metadata
디렉터리에는 annotations.yaml
파일도 포함되어 있습니다. 이 파일에서는 번들을 번들 인덱스에 추가하는 방법에 대한 형식 및 패키지 정보를 설명하는 데 도움이 되는 고급 집계 데이터를 정의합니다.
예제 annotations.yaml
annotations: operators.operatorframework.io.bundle.mediatype.v1: "registry+v1" 1 operators.operatorframework.io.bundle.manifests.v1: "manifests/" 2 operators.operatorframework.io.bundle.metadata.v1: "metadata/" 3 operators.operatorframework.io.bundle.package.v1: "test-operator" 4 operators.operatorframework.io.bundle.channels.v1: "beta,stable" 5 operators.operatorframework.io.bundle.channel.default.v1: "stable" 6
- 1
- Operator 번들의 미디어 유형 또는 형식입니다.
registry+v1
형식은 CSV 및 관련 Kubernetes 오브젝트가 포함됨을 나타냅니다. - 2
- Operator 매니페스트가 포함된 디렉터리의 이미지 경로입니다. 이 라벨은 나중에 사용할 수 있도록 예약되어 있으며 현재 기본값은
manifests/
입니다. 값manifests.v1
은 번들에 Operator 매니페스트가 포함되어 있음을 나타냅니다. - 3
- 번들에 대한 메타데이터 파일이 포함된 디렉터리의 이미지의 경로입니다. 이 라벨은 나중에 사용할 수 있도록 예약되어 있으며 현재 기본값은
metadata/
입니다. 값metadata.v1
은 이 번들에 Operator 메타데이터가 있음을 나타냅니다. - 4
- 번들의 패키지 이름입니다.
- 5
- Operator 레지스트리에 추가될 때 번들이 서브스크립션되는 채널 목록입니다.
- 6
- 레지스트리에서 설치할 때 Operator를 서브스크립션해야 하는 기본 채널입니다.
불일치하는 경우 이러한 주석을 사용하는 클러스터상의 Operator 레지스트리만 이 파일에 액세스할 수 있기 때문에 annotations.yaml
파일을 신뢰할 수 있습니다.
2.2.1.3. 종속 항목
Operator의 종속 항목은 번들의 metadata/
폴더에 있는 dependencies.yaml
파일에 나열되어 있습니다. 이 파일은 선택 사항이며 현재는 명시적인 Operator 버전 종속 항목을 지정하는 데만 사용됩니다.
종속성 목록에는 종속성의 유형을 지정하기 위해 각 항목에 대한 type
필드가 포함되어 있습니다. 다음 유형의 Operator 종속 항목이 지원됩니다.
olm.package
-
이 유형은 특정 Operator 버전에 대한 종속성을 나타냅니다. 종속 정보에는 패키지 이름과 패키지 버전이 semver 형식으로 포함되어야 합니다. 예를 들어
0.5.2
와 같은 정확한 버전이나>0.5.1
과 같은 버전 범위를 지정할 수 있습니다. olm.gvk
- 이 유형을 사용하면 작성자는 CSV의 기존 CRD 및 API 기반 사용과 유사하게 GVK(그룹/버전/종류) 정보로 종속성을 지정할 수 있습니다. 이 경로를 통해 Operator 작성자는 모든 종속 항목, API 또는 명시적 버전을 동일한 위치에 통합할 수 있습니다.
olm.constraint
- 이 유형은 임의의 Operator 속성에 대한 일반 제약 조건을 선언합니다.
다음 예제에서는 Prometheus Operator 및 etcd CRD에 대한 종속 항목을 지정합니다.
dependencies.yaml
파일의 예
dependencies: - type: olm.package value: packageName: prometheus version: ">0.27.0" - type: olm.gvk value: group: etcd.database.coreos.com kind: EtcdCluster version: v1beta2
2.2.1.4. opm CLI 정보
opm
CLI 툴은 Operator 번들 형식과 함께 사용할 수 있도록 Operator 프레임워크에서 제공합니다. 이 툴을 사용하면 소프트웨어 리포지토리와 유사한 Operator 번들 목록에서 Operator 카탈로그를 생성하고 유지 관리할 수 있습니다. 결과적으로 컨테이너 레지스트리에 저장한 다음 클러스터에 설치할 수 있는 컨테이너 이미지가 생성됩니다.
카탈로그에는 컨테이너 이미지가 실행될 때 제공되는 포함된 API를 통해 쿼리할 수 있는 Operator 매니페스트 콘텐츠에 대한 포인터 데이터베이스가 포함되어 있습니다. OpenShift Container Platform에서 OLM(Operator Lifecycle Manager)은 CatalogSource
오브젝트에서 정의한 카탈로그 소스의 이미지를 참조할 수 있으며 주기적으로 이미지를 폴링하여 클러스터에 설치된 Operator를 자주 업데이트할 수 있습니다.
-
opm
CLI 설치 단계는 CLI 툴 을 참조하십시오.
2.2.2. 파일 기반 카탈로그
파일 기반 카탈로그는 OLM(Operator Lifecycle Manager) 카탈로그 형식의 최신 버전입니다. 일반 텍스트 기반(JSON 또는 YAML)과 이전 SQLite 데이터베이스 형식의 선언적 구성 진화이며 완전히 이전 버전과 호환됩니다. 이 형식의 목표는 Operator 카탈로그 편집, 구성 가능성 및 확장성을 활성화하는 것입니다.
- 편집
파일 기반 카탈로그를 사용하면 카탈로그 내용과 상호 작용하는 사용자가 형식을 직접 변경하고 변경 사항이 유효한지 확인할 수 있습니다. 이 형식은 일반 텍스트 JSON 또는 YAML이므로 카탈로그 유지 관리자는
jq
CLI와 같이 널리 알려진 지원되는 JSON 또는 YAML 툴을 사용하여 카탈로그 메타데이터를 쉽게 조작할 수 있습니다.이 편집 기능을 사용하면 다음과 같은 기능 및 사용자 정의 확장 기능을 사용할 수 있습니다.
- 기존 번들을 새 채널로 승격
- 패키지의 기본 채널 변경
- 업그레이드 에지 추가, 업데이트 및 제거를 위한 사용자 정의 알고리즘
- 호환성
파일 기반 카탈로그는 카탈로그 구성이 가능한 임의의 디렉터리 계층 구조에 저장됩니다. 예를 들어 별도의 파일 기반 카탈로그 디렉터리인
catalogA
및catalogB
를 고려해 보십시오. 카탈로그 관리자는 새 디렉토리catalogC
를 만들고catalogA
및catalogB
를 복사하여 새로 결합된 카탈로그를 만들 수 있습니다.이 구성 가능성을 통해 분산된 카탈로그를 사용할 수 있습니다. 이 형식을 사용하면 Operator 작성자가 Operator별 카탈로그를 유지 관리할 수 있으며 유지 관리자가 개별 Operator 카탈로그로 구성된 카탈로그를 단순하게 빌드할 수 있습니다. 파일 기반 카탈로그는 하나의 카탈로그의 하위 집합을 추출하거나 두 개의 카탈로그를 조합하여 다른 여러 카탈로그를 결합하여 구성할 수 있습니다.
참고패키지 내의 중복 패키지 및 중복 번들은 허용되지 않습니다.
opm validate
명령은 중복이 발견되면 오류를 반환합니다.Operator 작성자는 Operator, 해당 종속 항목 및 업그레이드 호환성에 가장 익숙하므로 자체 Operator별 카탈로그를 유지 관리하고 해당 콘텐츠를 직접 제어할 수 있습니다. Operator 작성자는 파일 기반 카탈로그를 사용하여 카탈로그에서 패키지를 빌드하고 유지 관리하는 작업을 소유합니다. 그러나 복합 카탈로그 유지 관리자만 카탈로그의 패키지를 큐레이션하고 카탈로그를 사용자에게 게시하는 작업만 소유합니다.
- 확장성
파일 기반 카탈로그 사양은 카탈로그의 하위 수준 형식입니다. 카탈로그 유지 관리자는 낮은 수준의 형식으로 직접 유지 관리할 수 있지만, 카탈로그 유지 관리자는 고유한 사용자 지정 툴링에서 원하는 수의 변경을 수행할 수 있는 확장 기능을 구축할 수 있습니다.
예를 들어 툴은 에지 업그레이드를 위해 높은 수준의 API (예:
(mode=semver)
를 낮은 수준의 파일 기반 카탈로그 형식으로 변환할 수 있습니다. 또는 카탈로그 유지 관리자는 특정 기준을 충족하는 번들에 새 속성을 추가하여 모든 번들 메타데이터를 사용자 지정해야 할 수 있습니다.이러한 확장성을 통해 향후 OpenShift Container Platform 릴리스를 위해 하위 수준 API에서 추가 공식 툴을 개발할 수 있지만, 카탈로그 유지 관리자도 이러한 기능을 사용할 수 있다는 것이 가장 큰 장점입니다.
OpenShift Container Platform 4.11부터 파일 기반 카탈로그 형식으로 기본 Red Hat 제공 Operator 카탈로그 릴리스입니다. 더 이상 사용되지 않는 SQLite 데이터베이스 형식으로 릴리스된 OpenShift Container Platform 4.6에 대한 기본 Red Hat 제공 Operator 카탈로그입니다.
SQLite 데이터베이스 형식과 관련된 opm
하위 명령, 플래그 및 기능은 더 이상 사용되지 않으며 향후 릴리스에서 제거됩니다. 이 기능은 계속 지원되며 더 이상 사용되지 않는 SQLite 데이터베이스 형식을 사용하는 카탈로그에 사용해야 합니다.
와 같은 SQLite 데이터베이스 형식을 사용하기 위한 opm 하위 명령 및 플래그는 파일 기반 카탈로그 형식에서는 작동하지 않습니다. 파일 기반 카탈로그 작업에 대한 자세한 내용은 oc-mirror 플러그인을 사용하여 사용자 정의 카탈로그 관리 및 연결이 끊긴 설치의 이미지 미러링 을 참조하십시오.
opm
index prune
2.2.2.1. 디렉토리 구조
디렉토리 기반 파일 시스템에서 파일 기반 카탈로그를 저장하고 로드할 수 있습니다. opm
CLI는 루트 디렉토리로 이동하고 하위 디렉토리로 재귀하여 카탈로그를 로드합니다. CLI는 발견한 모든 파일을 로드 시도하여 오류가 발생하면 실패합니다.
비카탈로그 파일은 .gitignore
파일과 패턴 및 우선 순위에 대해 동일한 규칙이 있는 .indexignore
파일을 사용하여 무시할 수 있습니다.
.indexignore
파일의 예
# Ignore everything except non-object .json and .yaml files **/* !*.json !*.yaml **/objects/*.json **/objects/*.yaml
카탈로그 유지 관리자는 원하는 레이아웃을 선택할 수 있는 유연성을 가지지만 각 패키지의 파일 기반 카탈로그 Blob을 별도의 하위 디렉터리에 저장하는 것이 좋습니다. 각 개별 파일은 JSON 또는 YAML일 수 있습니다. 카탈로그의 모든 파일에서 동일한 형식을 사용할 필요는 없습니다.
기본 권장 구조
catalog ├── packageA │ └── index.yaml ├── packageB │ ├── .indexignore │ ├── index.yaml │ └── objects │ └── packageB.v0.1.0.clusterserviceversion.yaml └── packageC └── index.json
이 권장 구조에는 디렉터리 계층 구조의 각 하위 디렉터리가 자체 포함된 카탈로그이므로 카탈로그 구성, 검색 및 탐색 간단한 파일 시스템 작업이 가능합니다. 카탈로그는 상위 카탈로그의 루트 디렉터리에 복사하여 상위 카탈로그에도 포함할 수 있습니다.
2.2.2.2. 스키마
파일 기반 카탈로그는 임의의 스키마로 확장할 수 있는 CUE 언어 사양을 기반으로 하는 형식을 사용합니다. 다음 _Meta
CUE 스키마는 모든 파일 기반 카탈로그 Blob이 준수해야 하는 형식을 정의합니다.
_Meta
스키마
_Meta: { // schema is required and must be a non-empty string schema: string & !="" // package is optional, but if it's defined, it must be a non-empty string package?: string & !="" // properties is optional, but if it's defined, it must be a list of 0 or more properties properties?: [... #Property] } #Property: { // type is required type: string & !="" // value is required, and it must not be null value: !=null }
이 사양에 나열된 CUE 스키마는 완전한 것으로 간주되어서는 안 됩니다. opm validate
명령에는 CUE에서 간결하게 표현하기가 어렵거나 불가능한 추가 유효성 검사가 있습니다.
OLM(Operator Lifecycle Manager) 카탈로그에서는 현재 OLM의 기존 패키지 및 번들 개념에 해당하는 3개의 스키마 (olm.package
, olm.channel
, olm.bundle
)를 사용합니다.
카탈로그의 각 Operator 패키지에는 정확히 하나의 olm.package
blob, 하나 이상의 olm.channel
blob, 하나 이상의 olm.bundle
blob이 필요합니다.
모든 olm.*
스키마는 OLM 정의 스키마용으로 예약됩니다. 사용자 지정 스키마는 소유한 도메인과 같이 고유한 접두사를 사용해야 합니다.
2.2.2.2.1. olm.package 스키마
olm.package
스키마는 Operator에 대한 패키지 수준 메타데이터를 정의합니다. 이에는 이름, 설명, 기본 채널 및 아이콘이 포함됩니다.
예 2.1. olm.package
스키마
#Package: { schema: "olm.package" // Package name name: string & !="" // A description of the package description?: string // The package's default channel defaultChannel: string & !="" // An optional icon icon?: { base64data: string mediatype: string } }
2.2.2.2.2. olm.channel 스키마
olm.channel
스키마는 패키지 내의 채널, 채널의 멤버인 번들 항목 및 해당 번들의 업그레이드 에지를 정의합니다.
번들은 여러 olm.channel
Blob에 항목으로 포함될 수 있지만 채널당 하나의 항목만 있을 수 있습니다.
항목의 값이 이 카탈로그나 다른 카탈로그에서 찾을 수 없는 다른 번들 이름을 참조하는 것은 유효합니다. 그러나 여러 헤드가 없는 채널과 같이 다른 모든 채널 불변성은 true를 유지해야 합니다.
예 2.2. olm.channel
스키마
#Channel: { schema: "olm.channel" package: string & !="" name: string & !="" entries: [...#ChannelEntry] } #ChannelEntry: { // name is required. It is the name of an `olm.bundle` that // is present in the channel. name: string & !="" // replaces is optional. It is the name of bundle that is replaced // by this entry. It does not have to be present in the entry list. replaces?: string & !="" // skips is optional. It is a list of bundle names that are skipped by // this entry. The skipped bundles do not have to be present in the // entry list. skips?: [...string & !=""] // skipRange is optional. It is the semver range of bundle versions // that are skipped by this entry. skipRange?: string & !="" }
skipRange
필드를 사용하는 경우 건너뛰는 Operator 버전이 업데이트 그래프에서 정리되므로 Subscription
오브젝트의 spec.startingCSV
속성이 있는 사용자가 더 이상 설치할 수 없습니다.
여러 이전 버전의 Operator 버전에 대한 직접(버전 증가) 업데이트를 수행하고 설치를 위해 사용자가 해당 이전 버전을 사용할 수 있도록 유지하려면 항상 replaces
필드와 함께 skipRange
필드를 사용합니다. replaces
필드가 해당 Operator 버전의 즉시 이전 버전을 가리키는지 확인합니다.
2.2.2.2.3. olm.bundle 스키마
예 2.3. olm.bundle
스키마
#Bundle: { schema: "olm.bundle" package: string & !="" name: string & !="" image: string & !="" properties: [...#Property] relatedImages?: [...#RelatedImage] } #Property: { // type is required type: string & !="" // value is required, and it must not be null value: !=null } #RelatedImage: { // image is the image reference image: string & !="" // name is an optional descriptive name for an image that // helps identify its purpose in the context of the bundle name?: string & !="" }
2.2.2.3. 속성
속성은 파일 기반 카탈로그 스키마에 연결할 수 있는 임의 메타데이터입니다. type
필드는 value
필드의 의미 및 구문 의미를 효과적으로 지정하는 문자열입니다. 이 값은 임의의 JSON 또는 YAML일 수 있습니다.
OLM은 예약된 olm.*
접두사를 사용하여 몇 가지 속성 유형을 다시 정의합니다.
2.2.2.3.1. olm.package 속성
olm.package
속성은 패키지 이름과 버전을 정의합니다. 이는 번들의 필수 속성이며, 이러한 속성 중 정확히 하나가 있어야 합니다. packageName
필드는 번들의 최상위 package
필드와 일치해야 하며 version
필드는 유효한 의미 체계 버전이어야 합니다.
예 2.4. olm.package
속성
#PropertyPackage: { type: "olm.package" value: { packageName: string & !="" version: string & !="" } }
2.2.2.3.2. olm.gvk 속성
olm.gvk
속성은 이 번들에서 제공하는 Kubernetes API의 GVK(그룹/버전/종류)를 정의합니다. 이 속성은 OLM에서 이 속성이 포함된 번들을 필수 API와 동일한 GVK를 나열하는 다른 번들의 종속성으로 확인하는 데 사용됩니다. GVK는 Kubernetes GVK 검증을 준수해야 합니다.
예 2.5. olm.gvk
속성
#PropertyGVK: { type: "olm.gvk" value: { group: string & !="" version: string & !="" kind: string & !="" } }
2.2.2.3.3. olm.package.required
olm.package.required
속성은 이 번들에 필요한 다른 패키지의 패키지 이름 및 버전 범위를 정의합니다. 번들 목록이 필요한 모든 패키지 속성에 대해 OLM은 나열된 패키지 및 필수 버전 범위에 대한 클러스터에 Operator가 설치되어 있는지 확인합니다. versionRange
필드는 유효한 의미 버전(semver) 범위여야 합니다.
예 2.6. olm.package.required
속성
#PropertyPackageRequired: { type: "olm.package.required" value: { packageName: string & !="" versionRange: string & !="" } }
2.2.2.3.4. olm.gvk.required
olm.gvk.required
속성은 이 번들에 필요한 Kubernetes API의 GVK(그룹/버전/종류)를 정의합니다. 번들 목록이 필요한 모든 GVK 속성에 대해 OLM은 이를 제공하는 클러스터에 Operator가 설치되어 있는지 확인합니다. GVK는 Kubernetes GVK 검증을 준수해야 합니다.
예 2.7. olm.gvk.required
속성
#PropertyGVKRequired: { type: "olm.gvk.required" value: { group: string & !="" version: string & !="" kind: string & !="" } }
2.2.2.4. 카탈로그의 예
파일 기반 카탈로그를 사용하면 카탈로그 유지 관리자가 Operator 큐레이션 및 호환성에 중점을 둘 수 있습니다. Operator 작성자는 Operator에 대한 Operator별 카탈로그를 이미 생성했기 때문에 카탈로그 유지 관리자는 각 Operator 카탈로그를 카탈로그의 루트 디렉터리의 하위 디렉터리에 렌더링하여 카탈로그를 빌드할 수 있습니다.
파일 기반 카탈로그를 구축하는 방법은 여러 가지가 있습니다. 다음 단계에서는 간단한 접근 방식을 간략하게 설명합니다.
카탈로그의 각 Operator에 대한 이미지 참조가 포함된 카탈로그의 단일 구성 파일을 유지 관리합니다.
카탈로그 구성 파일 예
name: community-operators repo: quay.io/community-operators/catalog tag: latest references: - name: etcd-operator image: quay.io/etcd-operator/index@sha256:5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 - name: prometheus-operator image: quay.io/prometheus-operator/index@sha256:e258d248fda94c63753607f7c4494ee0fcbe92f1a76bfdac795c9d84101eb317
구성 파일을 구문 분석하고 참조에서 새 카탈로그를 생성하는 스크립트를 실행합니다.
스크립트 예
name=$(yq eval '.name' catalog.yaml) mkdir "$name" yq eval '.name + "/" + .references[].name' catalog.yaml | xargs mkdir for l in $(yq e '.name as $catalog | .references[] | .image + "|" + $catalog + "/" + .name + "/index.yaml"' catalog.yaml); do image=$(echo $l | cut -d'|' -f1) file=$(echo $l | cut -d'|' -f2) opm render "$image" > "$file" done opm alpha generate dockerfile "$name" indexImage=$(yq eval '.repo + ":" + .tag' catalog.yaml) docker build -t "$indexImage" -f "$name.Dockerfile" . docker push "$indexImage"
2.2.2.5. 지침
파일 기반 카탈로그를 유지 관리할 때 다음 지침을 고려하십시오.
2.2.2.5.1. 변경할 수 없는 번들
OLM(Operator Lifecycle Manager)의 일반적인 지침은 번들 이미지 및 해당 메타데이터를 변경할 수 없음으로 간주해야 한다는 것입니다.
손상된 번들이 카탈로그로 푸시된 경우 사용자 중 한 명이 해당 번들로 업그레이드되었다고 가정해야 합니다. 이러한 가정에 따라 손상된 번들이 설치된 사용자에게 업그레이드를 수신하려면 손상된 번들에서 업그레이드 엣지를 사용하여 다른 번들을 릴리스해야 합니다. 해당 번들의 콘텐츠가 카탈로그에서 업데이트되는 경우 OLM은 설치된 번들을 다시 설치하지 않습니다.
그러나 카탈로그 메타데이터의 변경이 권장되는 몇 가지 사례가 있습니다.
-
채널 승격: 번들을 이미 릴리스하고 나중에 다른 채널에 추가할 것을 결정한 경우, 다른
olm.channel
blob에 번들에 대한 항목을 추가할 수 있습니다. -
새로운 업그레이드 에지: 새
1.2.z
번들 버전(예:1.2.4
)을 릴리스했지만1.3.0
이 이미 릴리스된 경우1.3.0
의 카탈로그 메타데이터를 업데이트하여1.2.4
를 건너뛸 수 있습니다.
2.2.2.5.2. 소스 제어
카탈로그 메타데이터는 소스 제어에 저장되고 정보 소스로 처리되어야 합니다. 카탈로그 이미지 업데이트에는 다음 단계가 포함되어야 합니다.
- 소스 제어 카탈로그 디렉터리를 새 커밋으로 업데이트합니다.
-
카탈로그 이미지를 빌드하고 내보냅니다. 사용자가 사용 가능하게 되면 카탈로그 업데이트를 수신할 수 있도록
:latest
또는:<target_cluster_version>
과 같은 일관된 태그 지정 용어를 사용합니다.
2.2.2.6. CLI 사용
opm
CLI를 사용하여 파일 기반 카탈로그를 생성하는 방법에 대한 자세한 내용은 사용자 정의 카탈로그 관리를 참조하십시오.
파일 기반 카탈로그 관리와 관련된 opm
CLI 명령에 대한 참조 문서는 CLI 툴 을 참조하십시오.
2.2.2.7. 자동화
Operator 작성자 및 카탈로그 유지 관리자는 CI/CD 워크플로를 사용하여 카탈로그 유지 관리를 자동화하는 것이 좋습니다. 카탈로그 유지 관리자는 다음 작업을 수행하도록 GitOps 자동화를 빌드하여 이 작업을 추가로 개선할 수 있습니다.
- 예를 들어 패키지의 이미지 참조를 업데이트하여 해당 PR(pull request) 작성자가 요청된 변경을 수행할 수 있는지 확인합니다.
-
카탈로그 업데이트가
opm validate
명령을 전달하는지 확인합니다. - 업데이트된 번들 또는 카탈로그 이미지 참조가 있는지, 카탈로그 이미지가 클러스터에서 성공적으로 실행되며 해당 패키지의 Operator가 성공적으로 설치될 수 있는지 확인합니다.
- 이전 검사를 통과하는 PR을 자동으로 병합합니다.
- 카탈로그 이미지를 자동으로 다시 빌드하고 다시 게시합니다.
2.2.3. RukPak (기술 프리뷰)
RukPak은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
OpenShift Container Platform 4.12에는 플랫폼 Operator 유형이 기술 프리뷰 기능으로 도입되었습니다. 플랫폼 Operator 메커니즘은 OpenShift Container Platform 4.12에도 도입된 RukPak 구성 요소와 컨텐츠를 관리하는 리소스에 의존합니다.
RukPak은 Kubernetes 클러스터에서 콘텐츠를 설치하고 관리하는 프로비저너 로 알려진 일련의 컨트롤러로 구성됩니다. RukPak은 Bundle
및 BundleDeployment
의 두 가지 주요 API도 제공합니다. 이러한 구성 요소는 함께 작동하여 콘텐츠를 클러스터에 가져와서 설치하고 클러스터 내에 리소스를 생성합니다.
프로비저너는 프로비저너를 명시적으로 참조하는 Bundle
및 BundleDeployment
리소스에 감시를 배치합니다. 지정된 번들의 경우 프로비저너는 Bundle
리소스의 콘텐츠를 클러스터에 압축합니다. 그런 다음 해당 번들을 참조하는 BundleDeployment
리소스가 있는 경우 프로비저너는 번들 콘텐츠를 설치하고 해당 리소스의 라이프사이클을 관리합니다.
현재 두 개의 프로비저너는 RukPak과 함께 소스 및 일반 +v0
번들의 압축을 풀고 번들과 함께 제공되는 레지스트리 프로비저너 와 소스 및 OLM(Operator Lifecycle Manager) 레지스트리+v1
번들의 압축을 풉니다.
2.2.3.1. 번들
RukPak Bundle
오브젝트는 클러스터의 다른 소비자가 사용할 수 있는 콘텐츠를 나타냅니다. Pod에서 사용을 시작하기 위해 컨테이너 이미지의 콘텐츠를 가져와서 압축 해제해야 하는 것과 마찬가지로 Bundle
오브젝트를 사용하여 가져와서 압축 해제해야 하는 콘텐츠를 참조하는 데 사용됩니다. 이러한 관점에서 번들은 이미지 개념을 일반화하며 모든 유형의 콘텐츠를 표시하는 데 사용할 수 있습니다.
번들은 아무것도 할 수 없습니다. 프로비저닝 프로그램이 클러스터에서 콘텐츠를 사용할 수 있도록 해야 합니다. 프로비저너 Pod에 마운트된 디렉터리의 tar.gz
파일과 같은 임의의 스토리지 매체에 압축을 풀 수 있습니다. 각 Bundle
오브젝트에는 특정 번들 유형을 감시하고 압축 해제하는 Provisioner
오브젝트를 나타내는 관련 spec.provisionerClassName
필드가 있습니다.
일반 프로비저너에서 작동하도록 구성된 Bundle
오브젝트의 예
apiVersion: core.rukpak.io/v1alpha1 kind: Bundle metadata: name: my-bundle spec: source: type: image image: ref: my-bundle@sha256:xyz123 provisionerClassName: core-rukpak-io-plain
번들은 생성 후 변경 불가능한 것으로 간주됩니다.
2.2.3.1.1. 번들 불변
API 서버에서 Bundle
오브젝트를 승인한 후 번들은 RukPak 시스템의 나머지 부분에서 변경할 수 없는 아티팩트로 간주됩니다. 이 동작은 번들이 클러스터의 소스에 대한 고유한 정적 콘텐츠를 나타내는 개념을 적용합니다. 사용자는 특정 번들이 특정 매니페스트 세트를 가리키며 새 번들을 생성하지 않고 업데이트할 수 없다는 확신을 가질 수 있습니다. 이 속성은 포함된 BundleTemplate
오브젝트에서 생성한 독립 실행형 번들 및 동적 번들 모두에 적용됩니다.
번들 불변성은 코어 RukPak Webhook에 의해 적용됩니다. 이 Webhook는 Bundle
오브젝트 이벤트를 감시하고 번들로 업데이트하는 경우 기존 번들의 spec
필드가 제안된 업데이트된 번들의 사양 필드와 의미적으로 같은지 확인합니다. 동일하지 않은 경우 Webhook에서 업데이트가 거부됩니다. 메타데이터
또는 상태와
같은 기타 Bundle
오브젝트 필드는 번들의 라이프사이클 중에 업데이트됩니다. 이는 변경 불가능한 것으로 간주되는 spec
필드일 뿐입니다.
Bundle
오브젝트를 적용한 다음 사양을 업데이트하려고 하면 실패합니다. 예를 들어 다음 예제에서는 번들을 생성합니다.
$ oc apply -f -<<EOF apiVersion: core.rukpak.io/v1alpha1 kind: Bundle metadata: name: combo-tag-ref spec: source: type: git git: ref: tag: v0.0.2 repository: https://github.com/operator-framework/combo provisionerClassName: core-rukpak-io-plain EOF
출력 예
bundle.core.rukpak.io/combo-tag-ref created
그런 다음 최신 태그를 가리키도록 번들에 패치를 적용하면 오류가 반환됩니다.
$ oc patch bundle combo-tag-ref --type='merge' -p '{"spec":{"source":{"git":{"ref":{"tag":"v0.0.3"}}}}}'
출력 예
Error from server (bundle.spec is immutable): admission webhook "vbundles.core.rukpak.io" denied the request: bundle.spec is immutable
코어 RukPak 승인 Webhook는 번들 사양이 변경 불가능하므로 패치를 거부했습니다. 번들 내용을 변경하는 데 권장되는 방법은 현재 위치에서 업데이트하는 대신 새 Bundle
오브젝트를 생성하는 것입니다.
추가 불변 고려 사항
Bundle
오브젝트의 spec
필드는 변경할 수 없지만 기본 spec
필드를 변경하지 않고 BundleDeployment
오브젝트가 최신 버전의 번들 콘텐츠로 피벗할 수 있습니다. 이 의도하지 않은 피벗은 다음 시나리오에서 발생할 수 있습니다.
-
사용자는
Bundle
오브젝트의spec.source
필드에 이미지 태그, Git 분기 또는 Git 태그를 설정합니다. - 이미지 태그는 새 다이제스트로 이동하거나, 사용자가 변경 사항을 Git 분기로 푸시하거나 사용자가 다른 커밋에서 Git 태그를 삭제하고 다시 실행합니다.
- 사용자는 압축 풀기 포드를 삭제하는 등 번들의 포드를 다시 생성하는 작업을 수행합니다.
이 시나리오가 발생하면 3단계의 결과로 2단계의 새 콘텐츠가 압축 해제됩니다. 번들 배포에서는 변경 사항을 감지하고 최신 버전의 콘텐츠로 전환합니다.
이는 Pod의 컨테이너 이미지 중 하나가 태그를 사용하는 Pod 동작과 유사하지만 태그가 다른 다이제스트로 이동된 다음 나중에 기존 Pod가 다른 노드에 다시 예약됩니다. 이 시점에서 노드는 새 다이제스트에서 새 이미지를 가져와서 사용자가 명시적으로 요청하지 않고 다른 이미지를 실행합니다.
기본 Bundle
사양 콘텐츠가 변경되지 않도록 번들을 생성할 때 다이제스트 기반 이미지 또는 Git 커밋 참조를 사용합니다.
2.2.3.1.2. 일반 번들 사양
RukPak의 일반 번들은 지정된 디렉터리에서 정적, 임의의 Kubernetes YAML 매니페스트로 이루어진 컬렉션입니다.
현재 구현된 일반 번들 형식은 plain+v0
형식입니다. 번들 형식인 plain+
은 번들 유형(v0
일반
)을 현재 스키마 버전(v0)과 결합합니다.
일반+v0
번들 형식은 스키마 버전 v0
에 있으므로 변경될 수 있는 실험 형식입니다.
예를 들어 다음은 plain+v0
번들의 파일 트리를 보여줍니다. 애플리케이션을 배포하는 데 필요한 Kubernetes 리소스가 포함된 manifests/
디렉터리가 있어야 합니다.
plain+v0
번들 파일 트리 예
manifests ├── namespace.yaml ├── cluster_role.yaml ├── role.yaml ├── serviceaccount.yaml ├── cluster_role_binding.yaml ├── role_binding.yaml └── deployment.yaml
번들이 프로비저너에서 압축을 풀 수 있는 유효한 plain+v0
번들로 사용할 수 있도록 정적 매니페스트는 manifests/
디렉터리에 있어야 합니다. manifests/
디렉터리도 플랫해야 합니다. 모든 매니페스트는 하위 디렉터리가 없는 최상위 수준에 있어야 합니다.
정적 매니페스트가 아닌 일반 번들의 manifests/
디렉터리에 콘텐츠를 포함하지 마십시오. 그러지 않으면 해당 번들의 클러스터에 콘텐츠를 생성할 때 오류가 발생합니다. oc apply
명령을 사용하여 성공적으로 적용되지 않은 파일은 오류가 발생합니다. 다중 오브젝트 YAML 또는 JSON 파일도 유효합니다.
2.2.3.1.3. 레지스트리 번들 사양
레지스트리 번들 또는 레지스트리+v1
번들에는 기존 OLM(Operator Lifecycle Manager) 번들 형식으로 구성된 정적 Kubernetes YAML 매니페스트 세트가 포함되어 있습니다.
추가 리소스
2.2.3.2. BundleDeployment
BundleDeployment
오브젝트는 오브젝트를 설치하고 제거하여 Kubernetes 클러스터의 상태를 변경합니다. RBAC를 사용하여 해당 권한이 필요한 사용자에게만 설치 및 액세스를 제한하는 콘텐츠를 확인하고 신뢰하는 것이 중요합니다.
RukPak BundleDeployment
API는 Bundle
오브젝트를 가리키며 활성 상태임을 나타냅니다. 여기에는 활성 번들의 이전 버전의 피벗이 포함됩니다. BundleDeployment
오브젝트에는 원하는 번들에 대한 포함된 사양도 포함될 수 있습니다.
Pod가 컨테이너 이미지 인스턴스를 생성하는 것과 마찬가지로 번들 배포에서는 배포된 버전의 번들을 생성합니다. 번들 배포는 Pod 개념을 일반화하는 것으로 볼 수 있습니다.
번들 배포에서 참조된 번들을 기반으로 클러스터를 변경하는 방법에 대한 구체적인 내용은 해당 번들 배포를 조사하도록 구성된 프로비저너에 의해 정의됩니다.
일반 프로비저너에서 작동하도록 구성된 BundleDeployment
오브젝트의 예
apiVersion: core.rukpak.io/v1alpha1 kind: BundleDeployment metadata: name: my-bundle-deployment spec: provisionerClassName: core-rukpak-io-plain template: metadata: labels: app: my-bundle spec: source: type: image image: ref: my-bundle@sha256:xyz123 provisionerClassName: core-rukpak-io-plain
2.2.3.3. provisioner
RukPak 프로비저너는 BundleDeployment
및 Bundle
API를 이해하고 작업을 수행할 수 있는 컨트롤러입니다. 각 프로비저너에는 고유 ID가 할당되며 해당 ID와 일치하는 spec.provisionerClassName
필드가 있는 Bundle
및 BundleDeployment
오브젝트를 조정해야 합니다.
예를 들어 일반 프로비저너는 지정된 plain+v0
번들을 클러스터에 압축한 다음 인스턴스화하여 클러스터에서 사용할 수 있는 번들의 콘텐츠를 만들 수 있습니다.