Usages
이 기능은 v1.14에서 도입됐고 v1.19에서 베타 상태로 승격됐어요. 자세한 내용은 Crossplane 기능 수명주기를 읽어보세요.
Usage는 리소스가 사용 중임을 나타내요. Usages의 두 가지 주요 사용 사례는 다음과 같아요.
- 리소스를 실수로 삭제하는 것에서 보호
- 의존 리소스가 삭제되기 전에 리소스가 삭제되지 않도록 보장하는 삭제 순서(Deletion ordering)
첫 번째 사용 사례는 Usage for Deletion Protection 섹션, 두 번째는 Usage for Deletion Ordering 섹션을 참고하세요.
출처: 문서
본문
Usages 활성화 (Enable usages)
Usages는 베타 기능이에요. Crossplane은 베타 기능을 기본적으로 활성화해요. Usage 지원을 비활성화하려면 Crossplane 파드 설정을 변경하고 --enable-usages=false 인자를 설정하면 돼요.
$ kubectl edit deployment crossplane --namespace crossplane-system
apiVersion: apps/v1
kind: Deployment
spec:
# Removed for brevity
template:
spec:
containers:
- args:
- core
- start
- --enable-usages=false
Crossplane 설치 가이드에서 --enable-usages 같은 기능 플래그를 Helm으로 활성화하는 방법을 설명하고 있어요.
Usage 만들기 (Create a usage)
Usage spec에는 사용 중이거나 보호되는 리소스를 정의하는 필수 of 필드가 있어요. reason 필드는 보호 이유를 정의하고 by 필드는 사용 중인 리소스를 정의해요. 두 필드 모두 선택 사항이지만, 둘 중 하나는 반드시 제공해야 해요.
삭제 보호용 Usage (Usage for deletion protection)
다음 예는 reason으로 정의된 이유와 함께 삭제 요청을 거부해 my-database 리소스의 삭제를 방지해요.
apiVersion: protection.crossplane.io/v1beta1
kind: Usage
metadata:
namespace: default
name: protect-production-database
spec:
of:
apiVersion: rds.aws.m.upbound.io/v1beta1
kind: Instance
resourceRef:
name: my-database
reason: "Production Database - should never be deleted!"
삭제 순서용 Usage (Usage for deletion ordering)
다음 예는 my-prometheus-chart 리소스가 삭제되기 전에 my-cluster 리소스의 삭제 요청을 거부해 삭제를 방지해요.
apiVersion: protection.crossplane.io/v1beta1
kind: Usage
metadata:
namespace: default
name: release-uses-cluster
spec:
of:
apiVersion: eks.m.upbound.io/v1beta1
kind: Cluster
resourceRef:
name: my-cluster
by:
apiVersion: helm.m.crossplane.io/v1beta1
kind: Release
resourceRef:
name: my-prometheus-chart
Usages에서 셀렉터 사용 (Using selectors with usages)
Usages는 selectors를 사용해 사용 중이거나 사용하는 리소스를 정의할 수 있어요. 이는 리소스 이름을 제공하는 대신 labels나 matching controller references를 사용해 리소스를 정의할 수 있게 해줘요.
apiVersion: protection.crossplane.io/v1beta1
kind: Usage
metadata:
namespace: default
name: release-uses-cluster
spec:
of:
apiVersion: eks.m.upbound.io/v1beta1
kind: Cluster
resourceSelector:
matchControllerRef: false # default, and could be omitted
matchLabels:
foo: bar
by:
apiVersion: helm.m.crossplane.io/v1beta1
kind: Release
resourceSelector:
matchLabels:
baz: qux
Usage 컨트롤러가 셀렉터를 해석하면 resourceRef.name 필드에 리소스 이름을 저장해요. 다음 예는 셀렉터 해석 후의 Usage 리소스를 보여줘요.
셀렉터는 한 번만 해석돼요. 일치하는 항목이 둘 이상이면 일치하는 리소스 목록에서 임의의 리소스가 선택돼요.
apiVersion: protection.crossplane.io/v1beta1
kind: Usage
metadata:
namespace: default
name: release-uses-cluster
spec:
of:
apiVersion: eks.m.upbound.io/v1beta1
kind: Cluster
resourceRef:
name: my-cluster
resourceSelector:
matchLabels:
foo: bar
by:
apiVersion: helm.m.crossplane.io/v1beta1
kind: Release
resourceRef:
name: my-cluster
resourceSelector:
matchLabels:
baz: qux
차단된 삭제 시도 재생 (Replay blocked deletion attempt)
기본적으로 Usage 리소스를 삭제해도 Usage가 차단한 삭제 시도가 있었다 하더라도 사용 중인 리소스의 삭제가 촉발되지는 않아요. 차단된 삭제를 재생하려면 replayDeletion 필드를 true로 설정하면 돼요.
apiVersion: protection.crossplane.io/v1beta1
kind: Usage
metadata:
namespace: default
name: release-uses-cluster
spec:
replayDeletion: true
of:
apiVersion: eks.m.upbound.io/v1beta1
kind: Cluster
resourceRef:
name: my-cluster
by:
apiVersion: helm.m.crossplane.io/v1beta1
kind: Release
resourceRef:
name: my-prometheus-chart
삭제 재생은 사용된 리소스가 컴포지션의 일부일 때 유용해요. 이 구성은 사용 리소스가 사라지자마자 사용된 리소스의 삭제를 재생함으로써 사용된 리소스(따라서 그것을 소유하는 컴포지트)의 삭제 시간을 극적으로 줄여줘요. Kubernetes 가비지 컬렉터의 긴 지수 백오프를 기다리는 대신 말이죠.
컴포지션에서의 Usage (Usage in a Composition)
Usages의 전형적인 사용 사례는 Composition의 리소스 간 삭제 순서를 정의하는 것이에요. Usages는 셀렉터에서 컨트롤러 참조 일치(matching controller reference)를 지원해, 일치하는 리소스가 교차 리소스 참조와 같은 방식으로 같은 컴포지트 리소스에 있도록 보장해요.
Composition에 같은 타입의 리소스가 여러 개 있으면 Usage 리소스가 사용 중이거나 사용하는 리소스를 고유하게 식별해야 해요. 이는 추가 라벨을 사용하고 matchControllerRef를 matchLabels 셀렉터와 결합해 달성할 수 있어요.
네임스페이스 간 Usage (Usage across namespaces)
of와 by가 있는 Usage는 기본적으로 Usage와 같은 네임스페이스에 있는 두 리소스 간의 사용 관계를 나타내요.
Usage는 Usage와 같은 네임스페이스의 by 리소스와 다른 네임스페이스의 of 리소스 간의 사용 관계를 나타낼 수도 있어요.
다른 네임스페이스의 리소스를 사용하려면 of의 resourceRef 또는 resourceSelector에서 namespace를 지정해요.
apiVersion: protection.crossplane.io/v1beta1
kind: Usage
metadata:
namespace: default
name: release-uses-cluster
spec:
of:
apiVersion: eks.m.upbound.io/v1beta1
kind: Cluster
resourceRef:
namespace: cluster-infra
name: my-cluster
by:
apiVersion: helm.m.crossplane.io/v1beta1
kind: Release
resourceRef:
name: my-prometheus-chart
ClusterUsages
클러스터 스코프 리소스를 보호하려면 ClusterUsage를 사용해요.
apiVersion: protection.crossplane.io/v1beta1
kind: ClusterUsage
metadata:
name: protect-important-crd
spec:
of:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
resourceRef:
name: importantresources.example.crossplane.io
reason: "Very important CRD - should never be deleted!"
Crossplane은 활성 관리 리소스가 있을 때 Providers가 실수로 삭제되는 것을 보호하기 위해 ClusterUsage 리소스를 자동으로 만들 수 있어요. --enable-provider-deletion-protection 알파 기능 플래그로 활성화해요. 자세한 내용은 Provider deletion protection을 참고하세요.