함수 패치 앤 트랜스폼
함수 패치 앤 트랜스폼 (Function Patch and Transform)
Function Patch and Transform를 사용하면 관리 리소스(MR) 템플릿을 지정하는 Composition을 작성하고, "패치 앤 트랜스폼(patch and transform)" 작업으로 그 템플릿을 채울 수 있습니다. 크로스플레인은 복합 리소스(XR)에서 복사한 값으로 템플릿을 채웁니다.
출처: 문서
본문
패치(patch)는 한 리소스에서 값을 복사하여 다른 리소스에 적용합니다. 트랜스폼(transform)은 패치를 적용하기 전에 값을 수정합니다.
팁 크로스플레인이 Composition 함수를 지원하기 전까지 모든 Composition은 Patch and Transform을 사용했습니다.
Function Patch and Transform은 크로스플레인이 v1.17에서 deprecated 처리한 레거시 mode: Resources Composition과 같은 방식으로 동작합니다. 차이점은 mode: Resources Composition 대신 mode: Pipeline Composition과 함수를 사용한다는 것입니다.
다음은 Function Patch and Transform을 사용하는 Composition 예시입니다. 이 Composition을 사용하는 AcmeBucket XR을 생성하면 크로스플레인은 템플릿을 사용하여 Amazon S3 Bucket MR을 생성합니다.
크로스플레인은 AcmeBucket XR의 spec.desiredRegion 필드에서 값을 복사하여 Bucket 관리 리소스의 spec.forProvider.region 필드에 패치합니다.
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: example
spec:
compositeTypeRef:
apiVersion: custom-api.example.org/v1alpha1
kind: AcmeBucket
mode: Pipeline
pipeline:
- step: patch-and-transform
functionRef:
name: function-patch-and-transform
input:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: storage-bucket
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: "us-east-2"
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: spec.forProvider.region
참고 패치 앤 트랜스폼은 단순한 Composition에 가장 적합합니다. 루프(loop)나 조건문(conditional) 같은 기능은 의도적으로 지원하지 않습니다.
함수 설치하기 (Install the function)
Composition에서 사용하기 전에 Function Patch and Transform을 설치해야 합니다. 다음 매니페스트를 적용하여 설치하세요.
apiVersion: pkg.crossplane.io/v1
kind: Function
metadata:
name: function-patch-and-transform
spec:
package: xpkg.crossplane.io/crossplane-contrib/function-patch-and-transform:v0.8.2
팁 Composition과 Composition 함수에 대해 더 자세히 알아보려면 Composition 페이지를 읽어 보세요.
리소스 템플릿 (Resource templates)
함수 입력의 resources 필드는 복합 리소스가 이 함수를 사용할 때 생성하는 것들의 집합을 정의합니다.
예를 들어, 입력은 가상 머신과 연결된 스토리지 버킷을 동시에 생성하는 템플릿을 정의할 수 있습니다.
팁 크로스플레인은 복합 리소스가 생성하는 리소스를 composed resources라고 부릅니다.
resources 필드는 개별 리소스를 name과 함께 나열합니다. 이 name은 Composition 내부에서 리소스를 식별합니다. Provider와 함께 사용되는 외부 이름(external name)과는 관련이 없습니다.
base의 내용은 독립 실행형 관리 리소스를 생성하는 것과 동일합니다.
이 예시는 provider-upjet-aws를 사용하여 S3 스토리지 Bucket과 EC2 컴퓨트 Instance를 정의합니다.
apiVersion과 kind를 정의한 후 리소스 설정을 정의하는 spec.forProvider 필드를 정의합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: storage-bucket
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: "us-east-2"
- name: vm
base:
apiVersion: ec2.aws.m.upbound.io/v1beta1
kind: Instance
spec:
forProvider:
ami: ami-0d9858aa3c6322f73
instanceType: t2.micro
region: "us-east-2"
복합 리소스가 이 함수를 사용하면, 제공된 모든 spec.forProvider 설정으로 두 개의 새 관리 리소스를 생성합니다.
spec은 관리 리소스에서 사용되는 모든 설정(annotations, labels 적용 또는 특정 providerConfigRef 사용 등)을 지원합니다.
참고 리소스에
crossplane.io/external-name어노테이션을 사용하여 외부 시스템(예: AWS)에서 리소스 이름을 설정하세요.
팁 Function Patch and Transform을 사용하면 모든 종류의 쿠버네티스 리소스를 템플릿화 할 수 있습니다.
패치 만들기 (Create a patch)
resources 목록의 각 항목은 패치 목록을 포함할 수 있습니다. patches 필드는 개별 리소스에 적용할 패치 목록을 받습니다.
각 패치는 크로스플레인이 적용하는 패치 작업의 종류를 정의하는 type을 가집니다.
패치는 패치 유형에 따라 서로 다른 리소스 안의 필드를 참조하지만, 모든 패치는 fromFieldPath와 toFieldPath를 참조합니다.
fromFieldPath는 패치 입력 값의 경로입니다. toFieldPath는 패치가 적용되는 경로입니다.
다음은 복합 리소스의 spec.field1 필드에서 값을 복사하여 composed Bucket의 labels에 적용하는 패치 예시입니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: storage-bucket
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: "us-east-2"
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.labels["patchLabel"]
필드 선택하기 (Selecting fields)
크로스플레인은 JSONPath 선택자의 부분집합인 "필드 경로(field paths)"로 복합 리소스 또는 관리 리소스의 필드를 선택합니다.
필드 경로는 metadata, spec, status 필드를 포함하여 복합 리소스 또는 관리 리소스 객체의 모든 필드를 선택할 수 있습니다.
필드 경로는 필드 이름과 일치하는 문자열이거나 대괄호 안의 배열 인덱스일 수 있습니다. 필드 이름은 . 문자를 사용하여 하위 요소를 선택할 수 있습니다.
필드 경로 예시 (Example field paths)
다음은 복합 리소스 객체에서 가져온 선택자 예시입니다.
| 선택자 (Selector) | 선택된 요소 (Selected element) | | kind | kind | | spec.desiredRegion | eu-north-1 | | spec.resourceRefs[0].name | my-example-978mh-r6z64 |
$ kubectl get composite -o yaml
apiVersion: example.org/v1alpha1
kind: Example
metadata:
# Removed for brevity
labels:
crossplane.io/composite: my-example-978mh
spec:
desiredRegion: eu-north-1
field1: field1-text
crossplane:
resourceRefs:
- apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
name: my-example-978mh-r6z64
- apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
name: my-example-978mh-cnlhj
- apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
name: my-example-978mh-rv5nm
패치 재사용하기 (Reuse a patch)
PatchSet를 사용하여 여러 리소스에서 패치 객체를 재사용할 수 있습니다.
PatchSet를 만들려면 함수 입력에 patchSets 객체를 정의합니다.
PatchSet 안의 각 패치는 name과 patches 목록을 가집니다.
type: PatchSet 패치로 리소스에 PatchSet을 적용합니다. patchSetName을 PatchSet의 name으로 설정합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
patchSets:
- name: my-patchset
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: spec.forProvider.region
resources:
- name: bucket1
base:
# Removed for brevity
patches:
- type: PatchSet
patchSetName: my-patchset
- name: bucket2
base:
# Removed for brevity
patches:
- type: PatchSet
patchSetName: my-patchset
중요 PatchSet은 다른 PatchSet을 포함할 수 없습니다. 크로스플레인은 PatchSet 안의 transforms나 policies를 무시합니다.
리소스 간 패치 (Patching between resources)
Function Patch and Transform은 두 composed resource 사이에 직접 패치할 수 없습니다. 예를 들어 네트워크 리소스를 생성하고 그 리소스 이름을 컴퓨트 리소스에 패치하는 경우가 그렇습니다.
리소스는 복합 리소스의 사용자 정의 status 필드에 패치할 수 있습니다. 그러면 다른 리소스가 그 Status 필드를 읽어 필드를 패치할 수 있습니다.
먼저 복합 리소스 정의(Definition)와 사용자 정의 필드(예: secondResource)에 사용자 정의 status를 정의합니다.
kind: CompositeResourceDefinition
# Removed for brevity.
spec:
# Removed for brevity.
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
properties:
spec:
# Removed for brevity.
status:
type: object
properties:
secondResource:
type: string
함수 입력 안에서 소스 데이터가 있는 리소스는 ToCompositeFieldPath 패치를 사용하여 복합 리소스의 status.secondResource 필드에 데이터를 씁니다.
대상 리소스는 FromCompositeFieldPath 패치를 사용하여 복합 리소스의 status.secondResource 필드에서 데이터를 읽고 관리 리소스의 secondResource라는 라벨에 씁니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
# Removed for brevity
patches:
- type: ToCompositeFieldPath
fromFieldPath: metadata.name
toFieldPath: status.secondResource
- name: bucket2
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
# Removed for brevity
patches:
- type: FromCompositeFieldPath
fromFieldPath: status.secondResource
toFieldPath: metadata.labels['secondResource']
복합 리소스를 describe하여 resources와 status.secondResource 값을 확인하세요.
$ kubectl describe composite
Name: my-example-jp7rx
Spec:
# Removed for brevity
Resource Refs:
Name: my-example-jp7rx-gfg4m
# Removed for brevity
Name: my-example-jp7rx-fttpj
Status:
# Removed for brevity
Second Resource: my-example-jp7rx-gfg4m
대상 관리 리소스를 describe하여 secondResource 라벨을 확인하세요.
$ kubectl describe bucket
kubectl describe bucket my-example-jp7rx-fttpj
Name: my-example-jp7rx-fttpj
Labels: crossplane.io/composite=my-example-jp7rx
secondResource=my-example-jp7rx-gfg4m
EnvironmentConfigs로 패치하기 (Patch with EnvironmentConfigs)
크로스플레인은 EnvironmentConfigs를 사용하여 인메모리 데이터 저장소를 만듭니다. Composition은 패치 과정의 일부로 이 데이터 저장소에서 읽고 쓸 수 있습니다.
EnvironmentConfigs는 Composition이 사용할 데이터를 미리 정의할 수 있고, 복합 리소스는 다른 리소스가 읽을 수 있도록 인메모리 환경에 데이터를 쓸 수 있습니다.
참고 EnvironmentConfigs 사용에 대한 자세한 내용은 EnvironmentConfigs 페이지를 읽어 보세요.
EnvironmentConfigs로 패치를 적용하려면 먼저 environment.environmentConfigs로 사용할 EnvironmentConfigs를 정의합니다.
사용할 EnvironmentConfigs를 식별하려면 reference 또는 selector를 사용합니다.
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
# Removed for Brevity
spec:
environment:
environmentConfigs:
- ref:
name: example-environment
# Removed for Brevity
복합 리소스 패치 (Patch a composite resource)
복합 리소스와 인메모리 환경 사이를 패치하려면 environment 안의 patches를 사용합니다.
ToCompositeFieldPath를 사용하여 인메모리 환경에서 복합 리소스로 데이터를 복사합니다.
FromCompositeFieldPath를 사용하여 복합 리소스에서 인메모리 환경으로 데이터를 복사합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
environment:
patches:
- type: ToCompositeFieldPath
fromFieldPath: tags
toFieldPath: status.envTag
- type: FromCompositeFieldPath
fromFieldPath: metadata.name
toFieldPath: newEnvironmentKey
개별 리소스는 인메모리 환경에 기록된 모든 데이터를 사용할 수 있습니다.
개별 리소스 패치 (Patch an individual resource)
개별 리소스를 패치하려면 리소스의 patches 안에서 ToEnvironmentFieldPath를 사용하여 리소스에서 인메모리 환경으로 데이터를 복사합니다.
FromEnvironmentFieldPath를 사용하여 인메모리 환경에서 리소스로 데이터를 복사합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: vpc
base:
apiVersion: ec2.aws.m.upbound.io/v1beta1
kind: VPC
spec:
forProvider:
cidrBlock: 172.16.0.0/16
patches:
- type: ToEnvironmentFieldPath
fromFieldPath: status.atProvider.id
toFieldPath: vpcId
- type: FromEnvironmentFieldPath
fromFieldPath: tags
toFieldPath: spec.forProvider.tags
EnvironmentConfigs 옵션과 사용법에 대한 자세한 내용은 EnvironmentConfigs 페이지를 참고하세요.
패치 유형 (Types of patches)
Function Patch and Transform은 여러 패치 유형을 지원하며, 각 유형은 서로 다른 데이터 소스를 사용하고 서로 다른 위치에 패치를 적용합니다.
크로스플레인 패치 요약:
| 패치 유형 (Patch Type) | 데이터 소스 (Data Source) | 데이터 대상 (Data Destination) | | FromCompositeFieldPath | 복합 리소스의 필드 | composed resource의 필드 | | ToCompositeFieldPath | composed resource의 필드 | 복합 리소스의 필드 | | CombineFromComposite | 복합 리소스의 여러 필드 | composed resource의 필드 | | CombineToComposite | composed resource의 여러 필드 | 복합 리소스의 필드 | | FromEnvironmentFieldPath | 인메모리 환경의 데이터 | composed resource의 필드 | | ToEnvironmentFieldPath | composed resource의 필드 | 인메모리 환경 | | CombineFromEnvironment | 인메모리 환경의 여러 필드 | composed resource의 필드 | | CombineToEnvironment | composed resource의 여러 필드 | 인메모리 환경의 필드 |
참고 다음 예시들은 모두 동일한 Composition, CompositeResourceDefinition, EnvironmentConfigs를 사용합니다. 예시 간에 적용된 패치만 다릅니다. 모든 예시는 리소스 생성을 위해 provider-aws-s3에 의존합니다.
참조 Composition:
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: example-composition
spec:
compositeTypeRef:
apiVersion: example.org/v1alpha1
kind: Example
environment:
environmentConfigs:
- ref:
name: example-environment
mode: Pipeline
pipeline:
- step: patch-and-transform
functionRef:
name: function-patch-and-transform
input:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
- name: bucket2
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
참조 CompositeResourceDefinition:
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: examples.example.org
spec:
group: example.org
names:
kind: Example
plural: examples
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
field1:
type: string
field2:
type: string
field3:
type: string
desiredRegion:
type: string
boolField:
type: boolean
numberField:
type: integer
status:
type: object
properties:
url:
type: string
참조 XR:
apiVersion: example.org/v1alpha1
kind: Example
metadata:
namespace: default
name: my-example
spec:
field1: "field1-text"
field2: "field2-text"
desiredRegion: "eu-north-1"
boolField: false
numberField: 10
참조 EnvironmentConfig:
apiVersion: apiextensions.crossplane.io/v1beta1
kind: EnvironmentConfig
metadata:
name: example-environment
data:
locations:
us: us-east-2
eu: eu-north-1
key1: value1
key2: value2
FromCompositeFieldPath
FromCompositeFieldPath 패치는 복합 리소스의 값을 가져와 composed resource의 필드에 적용합니다.
팁
FromCompositeFieldPath패치를 사용하여 사용자가 XR에서 제공한 옵션을 관리 리소스forProvider설정에 적용하세요.
예를 들어, 복합 리소스에서 사용자가 제공한 desiredRegion 값을 관리 리소스의 region에 사용하려면 다음과 같이 합니다.
fromFieldPath 값은 복합 리소스의 필드입니다.
toFieldPath 값은 변경할 composed resource의 필드입니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: spec.forProvider.region
관리 리소스를 확인하여 업데이트된 region을 확인할 수 있습니다.
$ kubectl describe bucket
Name: my-example-qlr68-29nqf
# Removed for brevity
Spec:
For Provider:
Region: eu-north-1
ToCompositeFieldPath
ToCompositeFieldPath 패치는 개별 composed resource에서 이를 생성한 복합 리소스로 데이터를 씁니다.
팁
ToCompositeFieldPath패치를 사용하여 Composition의 한 composed resource에서 데이터를 가져와 같은 Composition의 두 번째 composed resource에서 사용하세요.
예를 들어, 크로스플레인이 새 관리 리소스를 만든 후 hostedZoneID 값을 가져와 복합 리소스의 status에 저장합니다.
중요 복합 리소스 status 필드에 패치하려면 먼저 CompositeResourceDefinition에 사용자 정의 status 필드를 정의해야 합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: ToCompositeFieldPath
fromFieldPath: status.atProvider.hostedZoneId
toFieldPath: status.hostedZoneId
생성된 관리 리소스를 확인하여 Hosted Zone Id 필드를 볼 수 있습니다.
$ kubectl describe bucket
Name: my-example-p5pxf-5vnp8
# Removed for brevity
Status:
At Provider:
Hosted Zone Id: Z2O1EMRO9K5GLX
# Removed for brevity
다음으로 복합 리소스를 확인하여 패치가 status에 적용되었는지 확인합니다.
$ kubectl describe composite
Name: my-example-p5pxf
# Removed for brevity
Status:
Hosted Zone Id: Z2O1EMRO9K5GLX
CombineFromComposite
CombineFromComposite 패치는 복합 리소스에서 값을 가져와 결합한 후 composed resource에 적용합니다.
팁
CombineFromComposite패치를 사용하여 보안 정책 같은 복잡한 문자열을 만들고 composed resource에 적용하세요.
예를 들어, XR 값 desiredRegion과 field2를 사용하여 관리 리소스의 name을 생성합니다.
CombineFromComposite 패치는 combine 옵션만 지원합니다.
variables는 결합할 복합 리소스의 fromFieldPath 값 목록입니다.
지원되는 유일한 strategy는 strategy: string입니다.
선택적으로 Go 문자열 포맷팅을 기반으로 문자열을 결합하는 방법을 지정하는 string.fmt를 적용할 수 있습니다.
toFieldPath는 새 문자열을 적용할 composed resource의 필드입니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: CombineFromComposite
combine:
variables:
- fromFieldPath: spec.desiredRegion
- fromFieldPath: spec.field2
strategy: string
string:
fmt: "my-resource-%s-%s"
toFieldPath: metadata.name
관리 리소스를 describe하여 적용된 패치를 볼 수 있습니다.
$ kubectl describe bucket
Name: my-resource-eu-north-1-field2-text
CombineToComposite
CombineToComposite 패치는 composed resource에서 값을 가져와 결합한 후 복합 리소스에 적용합니다.
팁
CombineToComposite패치를 사용하여 관리 리소스의 여러 필드로 URL 같은 단일 필드를 만드세요.
예를 들어, 관리 리소스 name과 region을 사용하여 사용자 정의 url 필드를 생성합니다.
중요 복합 리소스 status 필드에 사용자 정의 필드를 쓰려면 먼저 CompositeResourceDefinition에서 사용자 정의 필드를 정의해야 합니다.
CombineToComposite 패치는 combine 옵션만 지원합니다.
variables는 결합할 관리 리소스의 fromFieldPath 목록입니다.
지원되는 유일한 strategy는 strategy: string입니다.
선택적으로 Go 문자열 포맷팅을 기반으로 문자열을 결합하는 방법을 지정하는 string.fmt를 적용할 수 있습니다.
toFieldPath는 새 문자열을 적용할 복합 리소스의 필드입니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: CombineToComposite
combine:
variables:
- fromFieldPath: metadata.name
- fromFieldPath: spec.forProvider.region
strategy: string
string:
fmt: "https://%s.%s.com"
toFieldPath: status.url
복합 리소스를 확인하여 적용된 패치를 검증할 수 있습니다.
$ kubectl describe composite
Name: my-example-bjdjw
API Version: example.org/v1alpha1
Kind: Example
# Removed for brevity
Status:
# Removed for brevity
URL: https://my-example-bjdjw-r6ncd.us-east-2.com
FromEnvironmentFieldPath
FromEnvironmentFieldPath 패치는 인메모리 환경에서 값을 가져와 composed resource에 적용합니다.
팁
FromEnvironmentFieldPath를 사용하여 현재 환경에 기반한 사용자 정의 관리 리소스 설정을 적용하세요.
예를 들어, 환경의 locations.eu 값을 가져와 region으로 적용합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: FromEnvironmentFieldPath
fromFieldPath: locations.eu
toFieldPath: spec.forProvider.region
관리 리소스를 확인하여 적용된 패치를 검증할 수 있습니다.
kubectl describe bucket
Name: my-example-8vrvc-xx5sr
# Removed for brevity
Spec:
For Provider:
Region: eu-north-1
# Removed for brevity
ToEnvironmentFieldPath
중요 EnvironmentConfig 사용에 대한 자세한 내용은 EnvironmentConfigs 문서를 읽어 보세요.
ToEnvironmentFieldPath 패치는 composed resource에서 값을 가져와 인메모리 환경에 적용합니다.
팁
ToEnvironmentFieldPath를 사용하여 어떤FromEnvironmentFieldPath패치든 접근할 수 있는 데이터를 환경에 쓰세요.
예를 들어, 원하는 region 값을 가져와 환경의 key1으로 적용합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: ToEnvironmentFieldPath
fromFieldPath: spec.forProvider.region
toFieldPath: key1
환경은 인메모리이므로 패치가 환경에 값을 썼는지 확인할 명령은 없습니다.
CombineFromEnvironment
중요 EnvironmentConfig 사용에 대한 자세한 내용은 EnvironmentConfigs 문서를 읽어 보세요.
CombineFromEnvironment 패치는 인메모리 환경의 여러 값을 결합하여 composed resource에 적용합니다.
팁
CombineFromEnvironment패치를 사용하여 보안 정책 같은 복잡한 문자열을 만들고 관리 리소스에 적용하세요.
예를 들어, 환경의 여러 필드를 결합하여 고유한 annotation을 만듭니다.
CombineFromEnvironment 패치는 combine 옵션만 지원합니다.
지원되는 유일한 strategy는 strategy: string입니다.
variables는 결합할 인메모리 환경의 fromFieldPath 값 목록입니다.
선택적으로 Go 문자열 포맷팅을 기반으로 문자열을 결합하는 방법을 지정하는 string.fmt를 적용할 수 있습니다.
toFieldPath는 새 문자열을 적용할 composed resource의 필드입니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: CombineFromEnvironment
combine:
strategy: string
variables:
- fromFieldPath: key1
- fromFieldPath: key2
string:
fmt: "%s-%s"
toFieldPath: metadata.annotations[EnvironmentPatch]
관리 리소스를 describe하여 새 annotation을 볼 수 있습니다.
$ kubectl describe bucket
Name: my-example-zmxdg-grl6p
# Removed for brevity
Annotations: EnvironmentPatch: value1-value2
# Removed for brevity
CombineToEnvironment
중요 EnvironmentConfig 사용에 대한 자세한 내용은 EnvironmentConfigs 문서를 읽어 보세요.
CombineToEnvironment 패치는 composed resource의 여러 값을 결합하여 인메모리 EnvironmentConfig 환경에 적용합니다.
팁
CombineToEnvironment패치를 사용하여 다른 관리 리소스에서 사용할 보안 정책 같은 복잡한 문자열을 만드세요.
예를 들어, 관리 리소스의 여러 필드를 결합하여 고유한 문자열을 만들고 환경의 key2 값에 저장합니다.
이 문자열은 관리 리소스 Kind와 region을 결합합니다.
CombineToEnvironment 패치는 combine 옵션만 지원합니다.
지원되는 유일한 strategy는 strategy: string입니다.
variables는 결합할 관리 리소스의 fromFieldPath 값 목록입니다.
선택적으로 Go 문자열 포맷팅을 기반으로 문자열을 결합하는 방법을 지정하는 string.fmt를 적용할 수 있습니다.
toFieldPath는 새 문자열을 쓸 환경의 키입니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: CombineToEnvironment
combine:
strategy: string
variables:
- fromFieldPath: kind
- fromFieldPath: spec.forProvider.region
string:
fmt: "%s.%s"
toFieldPath: key2
환경은 인메모리이므로 패치가 환경에 값을 썼는지 확인할 명령은 없습니다.
패치 트랜스폼 (Transform a patch)
패치를 적용할 때 크로스플레인은 패치로 적용하기 전에 데이터를 수정하는 것을 지원합니다. 크로스플레인은 이를 "트랜스폼(transform)" 작업이라고 부릅니다.
크로스플레인 트랜스폼 요약:
| 트랜스폼 유형 (Transform Type) | 동작 (Action) | | convert | 입력 데이터 유형을 다른 유형으로 변환합니다. "캐스팅(casting)"이라고도 합니다. | | map | 특정 입력에 따라 특정 출력을 선택합니다. | | match | 문자열 또는 정규 표현식에 따라 특정 출력을 선택합니다. | | math | 입력에 수학 연산을 적용합니다. | | string | Go 문자열 포맷팅을 사용하여 입력 문자열을 변경합니다. |
transforms 필드로 개별 패치에 직접 트랜스폼을 적용합니다.
트랜스폼은 수행할 트랜스폼 작업을 나타내는 type이 필요합니다.
다른 트랜스폼 필드는 type과 같습니다. 예시에서는 map입니다.
다른 필드는 사용하는 패치 유형에 따라 다릅니다.
이 예시는 type: map 트랜스폼을 사용하여 입력 spec.desiredRegion을 us 또는 eu 중 하나와 일치시키고 spec.forProvider.region 값에 해당하는 AWS 리전을 반환합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: bucket1
base:
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
spec:
forProvider:
region: us-east-2
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: spec.forProvider.region
transforms:
- type: map
map:
us: us-east-2
eu: eu-north-1
Convert 트랜스폼
convert 트랜스폼 유형은 입력 데이터 유형을 다른 데이터 유형으로 변경합니다.
팁 일부 프로바이더 API는 필드가 문자열이어야 합니다.
convert유형을 사용하여 boolean 또는 integer 필드를 문자열로 변경하세요.
convert 트랜스폼은 출력 데이터 유형을 정의하는 toType이 필요합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.numberField
toFieldPath: metadata.label["numberToString"]
transforms:
- type: convert
convert:
toType: string
지원되는 toType 값:
| toType 값 | 설명 | | bool | true 또는 false의 boolean 값 | | float64 | 64비트 부동소수점 값 | | int | 32비트 정수 값 | | int64 | 64비트 정수 값 | | string | 문자열 값 | | object | 객체 | | array | 배열 |
문자열을 boolean으로 변환
문자열에서 bool로 변환할 때 크로스플레인은 1, t, T, TRUE, True, true 문자열을 boolean 값 True와 같다고 간주합니다.
0, f, F, FALSE, False, false 문자열은 boolean 값 False와 같습니다.
숫자를 boolean으로 변환
크로스플레인은 정수 1과 부동소수점 1.0을 boolean 값 True와 같다고 간주합니다. 다른 정수나 부동소수점 값은 모두 False입니다.
boolean을 숫자로 변환
크로스플레인은 boolean 값 True를 정수 1 또는 float64 1.0으로 변환합니다.
False 값은 정수 0 또는 float64 0.0으로 변환됩니다.
문자열을 float64로 변환
string에서 float64로 변환할 때 크로스플레인은 선택적 format: quantity 필드를 지원합니다.
format: quantity를 사용하면 메가바이트(megabyte)의 M 또는 메가비트(megabit)의 Mi 같은 크기 접미어를 올바른 float64 값으로 변환합니다.
참고 지원되는 접미어의 전체 목록은 Go 언어 문서를 참고하세요.
convert 객체에 format: quantity를 추가하여 quantity 접미어 지원을 활성화합니다.
- type: convert
convert:
toType: float64
format: quantity
문자열을 객체로 변환
크로스플레인은 JSON 문자열을 객체로 변환합니다.
convert 객체에 format: json을 추가합니다. 이 변환에 지원되는 유일한 문자열 형식입니다.
- type: convert
convert:
toType: object
format: json
팁 이 변환은 객체의 키를 패치할 때 유용합니다.
다음 예시는 customized key로 리소스에 태그를 추가합니다.
- type: FromCompositeFieldPath
fromFieldPath: spec.clusterName
toFieldPath: spec.forProvider.tags
transforms:
- type: string
string:
type: Format
fmt: '{"kubernetes.io/cluster/%s": "true"}'
- type: convert
convert:
toType: object
format: json
문자열을 배열로 변환
크로스플레인은 JSON 문자열을 배열로 변환합니다.
convert 객체에 format: json을 추가합니다. 이 변환에 지원되는 유일한 문자열 형식입니다.
- type: convert
convert:
toType: array
format: json
Map 트랜스폼
map 트랜스폼 유형은 입력 값을 출력 값에 매핑합니다.
팁
map트랜스폼은US나EU같은 일반적인 리전 이름을 프로바이더 고유의 리전 이름으로 변환하는 데 유용합니다.
map 트랜스폼은 fromFieldPath의 값을 map에 나열된 옵션과 비교합니다.
크로스플레인이 값을 찾으면 매핑된 값을 toFieldPath에 넣습니다.
참고 값을 찾지 못하면 크로스플레인은 해당 패치에 오류를 발생시킵니다.
spec.field1이 문자열 "field1-text"이면 크로스플레인은 annotation에 문자열 firstField를 사용합니다.
spec.field1이 문자열 "field2-text"이면 크로스플레인은 annotation에 문자열 secondField를 사용합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["myAnnotation"]
transforms:
- type: map
map:
"field1-text": "firstField"
"field2-text": "secondField"
이 예시에서 spec.field1의 값은 field1-text입니다.
$ kubectl describe composite
Name: my-example-twx7n
Spec:
# Removed for brevity
field1: field1-text
관리 리소스에 적용된 annotation은 firstField입니다.
$ kubectl describe bucket
Name: my-example-twx7n-ndb2f
Annotations: crossplane.io/composition-resource-name: bucket1
myAnnotation: firstField
# Removed for brevity.
Match 트랜스폼
match 트랜스폼은 map 트랜스폼과 비슷합니다.
match 트랜스폼은 정확한 문자열과 함께 정규 표현식(regex) 지원을 추가하고, 일치하는 것이 없을 때 기본값(default value)을 제공할 수 있습니다.
match 객체는 patterns 객체를 필요로 합니다.
patterns는 입력 값과 일치시키려는 하나 이상의 패턴 목록입니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["myAnnotation"]
transforms:
- type: match
match:
patterns:
- type: literal
# Removed for brevity
- type: regexp
# Removed for brevity
Match patterns는 정확한 문자열을 일치시키는 type: literal이거나 정규 표현식을 일치시키는 type: regexp일 수 있습니다.
참고 크로스플레인은 첫 번째 패턴 일치 후 match 처리를 중지합니다.
정확한 문자열 일치 (Match an exact string)
정확한 문자열을 일치시키려면 type: literal로 pattern을 사용합니다.
일치에 성공하면 크로스플레인은 result:를 패치 toFieldPath에 제공합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["myAnnotation"]
transforms:
- type: match
match:
patterns:
- type: literal
literal: "field1-text"
result: "matchedLiteral"
정규 표현식 일치 (Match a regular expression)
정규 표현식을 일치시키려면 type: regexp로 pattern을 사용합니다. 일치시킬 정규 표현식 값으로 regexp 키를 정의합니다.
일치에 성공하면 크로스플레인은 result:를 패치 toFieldPath에 제공합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["myAnnotation"]
transforms:
- type: match
match:
patterns:
- type: regexp
regexp: '^field1.*'
result: "foundField1"
기본값 사용하기 (Using default values)
선택적으로 일치하는 패턴이 없을 때 사용할 기본값을 제공할 수 있습니다.
기본값은 원래 입력 값이거나 정의된 기본값일 수 있습니다.
fallbackTo: Value를 사용하여 일치 항목이 없을 때 기본값을 제공합니다.
예를 들어 문자열 unknownString이 일치하지 않으면 크로스플레인은 toFieldPath에 Value StringNotFound를 제공합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["myAnnotation"]
transforms:
- type: match
match:
patterns:
- type: literal
literal: "UnknownString"
result: "foundField1"
fallbackTo: Value
fallbackValue: "StringNotFound"
기본값으로 원래 입력을 사용하려면 fallbackTo: Input을 사용합니다.
크로스플레인은 toFieldPath 값에 원래 fromFieldPath 입력을 사용합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["myAnnotation"]
transforms:
- type: match
match:
patterns:
- type: literal
literal: "UnknownString"
result: "foundField1"
fallbackTo: Input
Math 트랜스폼
math 트랜스폼을 사용하여 입력을 곱하거나 최솟값 또는 최댓값을 적용합니다.
중요
math트랜스폼은 정수 입력만 지원합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.numberField
toFieldPath: metadata.annotations["mathAnnotation"]
transforms:
- type: math
math:
...
clampMin
type: clampMin은 입력이 type: clampMin 값보다 작을 때 정의된 최솟값을 사용합니다.
예를 들어, 이 type: clampMin은 입력이 20보다 커야 합니다.
입력이 20보다 낮으면 크로스플레인은 toFieldPath에 clampMin 값을 사용합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.numberField
toFieldPath: metadata.annotations["mathAnnotation"]
transforms:
- type: math
math:
type: clampMin
clampMin: 20
clampMax
type: clampMax는 입력이 type: clampMax 값보다 클 때 정의된 최댓값을 사용합니다.
예를 들어, 이 type: clampMax는 입력이 5보다 작아야 합니다.
입력이 5보다 높으면 크로스플레인은 toFieldPath에 clampMax 값을 사용합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.numberField
toFieldPath: metadata.annotations["mathAnnotation"]
transforms:
- type: math
math:
type: clampMax
clampMax: 5
Multiply
type: multiply는 입력에 multiply 값을 곱합니다.
예를 들어, 이 type: multiply는 fromFieldPath 값에 2를 곱합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.numberField
toFieldPath: metadata.annotations["mathAnnotation"]
transforms:
- type: math
math:
type: multiply
multiply: 2
참고
multiply값은 정수만 지원합니다.
String 트랜스폼
string 트랜스폼은 문자열 입력에 문자열 포맷팅 또는 조작을 적용합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["stringAnnotation"]
transforms:
- type: string
string:
type: ...
String 트랜스폼은 다음 types를 지원합니다.
- Convert
- Format
- Join
- Regexp
- TrimPrefix
- TrimSuffix
- Replace
String convert
type: convert는 다음 변환 유형 중 하나에 따라 입력을 변환합니다.
- ToUpper - 문자열을 모두 대문자로 변경
- ToLower - 문자열을 모두 소문자로 변경
- ToBase64 - 입력에서 새 base64 문자열 생성
- FromBase64 - base64 입력에서 새 텍스트 문자열 생성
- ToJson - 입력 문자열을 유효한 JSON으로 변환
- ToSha1 - 입력 문자열의 SHA-1 해시 생성
- ToSha256 - 입력 문자열의 SHA-256 해시 생성
- ToSha512 - 입력 문자열의 SHA-512 해시 생성
- ToAdler32 - 입력 문자열의 Adler32 해시 생성
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["FIELD1-TEXT"]
transforms:
- type: string
string:
type: Convert
convert: "ToUpper"
String format
type: format는 입력에 Go 문자열 포맷팅을 적용합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.field1
toFieldPath: metadata.annotations["stringAnnotation"]
transforms:
- type: string
string:
type: Format
fmt: "the-field-%s"
Join
type: Join은 입력 배열의 모든 값을 지정된 구분자를 사용하여 하나의 문자열로 결합합니다.
이 트랜스폼은 배열 입력에서만 동작합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.parameters.inputList
toFieldPath: spec.targetJoined
transforms:
- type: string
string:
type: Join
join:
separator: ","
정규 표현식 유형 (Regular expression type)
type: Regexp는 정규 표현식과 일치하는 입력 부분을 추출합니다.
선택적으로 group을 사용하여 정규 표현식 캡처 그룹을 일치시킵니다. 기본적으로 크로스플레인은 전체 정규 표현식과 일치합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: metadata.annotations["euRegion"]
transforms:
- type: string
string:
type: Regexp
regexp:
match: '^eu-(.*)-'
group: 1
Trim prefix
type: TrimPrefix는 Go의 TrimPrefix를 사용하여 줄의 시작 부분에서 문자를 제거합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: metadata.annotations["north-1"]
transforms:
- type: string
string:
type: TrimPrefix
trim: `eu-
Trim suffix
type: TrimSuffix는 Go의 TrimSuffix를 사용하여 줄의 끝 부분에서 문자를 제거합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: metadata.annotations["eu"]
transforms:
- type: string
string:
type: TrimSuffix
trim: `-north-1'
Replace
type: Replace는 search 문자열의 모든 발생을 replace 문자열로 바꿉니다. replace가 빈 문자열이면 search 문자열을 제거합니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.location
toFieldPath: spec.forProvider.region
transforms:
- type: string
string:
type: Replace
replace:
search: "europe"
replace: "eu"
패치 정책 (Patch policies)
크로스플레인은 두 가지 유형의 패치 정책을 지원합니다.
- fromFieldPath
- toFieldPath
fromFieldPath 정책
패치에 fromFieldPath: Required 정책을 사용하면 fromFieldPath가 데이터 소스 리소스에 존재해야 합니다.
팁 리소스 패치가 동작하지 않을 때
fromFieldPath: Required정책을 적용하면 복합 리소스에 오류가 발생하여 문제 해결에 도움이 됩니다.
기본적으로 크로스플레인은 fromFieldPath: Optional 정책을 적용합니다. fromFieldPath: Optional에서는 fromFieldPath가 존재하지 않으면 패치를 무시합니다.
fromFieldPath: Required에서는 fromFieldPath가 존재하지 않으면 복합 리소스가 오류를 발생시킵니다.
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: metadata.annotations["eu"]
policy:
fromFieldPath: Required
toFieldPath 정책
기본적으로 패치를 적용할 때 함수는 대상 데이터를 교체합니다. toFieldPath를 사용하여 배열과 객체를 덮어쓰지 않고 병합할 수 있습니다.
toFieldPath 정책은 다음 옵션을 지원합니다:
| 정책 (Policy) | 동작 (Action) | | Replace (기본값) | toFieldPath의 값을 교체합니다. | | MergeObjects | toFieldPath의 값에 재귀적으로 병합합니다. 충돌하는 객체 키는 유지합니다. | | ForceMergeObjects | toFieldPath의 값에 재귀적으로 병합합니다. 충돌하는 객체 키는 교체합니다. | | MergeObjectsAppendArrays | MergeObjects와 같지만 배열 값을 교체하는 대신 추가합니다. | | ForceMergeObjectsAppendArrays | ForceMergeObjects와 같지만 배열 값을 교체하는 대신 추가합니다. |
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.desiredRegion
toFieldPath: metadata.annotations["eu"]
policy:
toFieldPath: MergeObjectsAppendArrays
복합 리소스 연결 정보 (Composite resource connection details)
Function Patch and Transform은 composed resources에서 연결 정보(connection details)를 자동으로 집계합니다. 다른 Composition 함수와 달리 Function Patch and Transform은 관찰된 연결 정보에 접근하여 Secret 리소스를 수동으로 구성할 수 없습니다. 대신 내장된 자동 집계를 제공합니다.
복합 리소스의 연결 정보를 노출하려면:
- 연결 정보를 생성하는 각 composed resource에
writeConnectionSecretToRef설정 - 각 리소스에
connectionDetails를 정의하여 집계된 secret에 포함할 secret 키 지정 - 집계된 연결 정보 secret을 쓸 위치 구성 (아래 옵션 참고)
함수는 집계된 모든 연결 정보를 포함하는 Secret composed resource를 자동으로 생성합니다.
팁 Function Patch and Transform으로 연결 정보 집계의 완전한 예시는 Connection Details Composition 가이드를 참고하세요.
연결 정보를 변환하거나 더 복잡한 로직으로 Secret 리소스를 수동으로 구성해야 한다면 function-go-templating, function-python, function-kcl 같은 다른 함수를 대신 사용하세요. 이 함수들은 관찰된 연결 정보에 접근할 수 있는데, Function Patch and Transform은 이를 제공하지 않습니다.
v1 vs v2 동작
이 함수는 XR이 크로스플레인 v1 방식인지 v2 방식인지에 따라 복합 리소스 연결 정보를 다르게 처리합니다.
- v1: 함수 파이프라인이 연결 정보를 반환하고 크로스플레인이 XR/claim에 대한 별도의 연결 시크릿을 생성합니다.
- v2: 이 함수는 연결 정보를 포함하는
Secret을 자동으로 구성하고 XR의 다른 composed resources와 함께 포함시킵니다.
연결 시크릿 이름과 네임스페이스 설정
함수는 다음 우선순위 순서로 집계된 연결 정보 secret을 쓸 위치를 결정합니다.
복합 리소스 참조 (Composite resource reference)
XR 스키마에 spec.writeConnectionSecretToRef 필드를 포함하고 XR에 이 필드가 설정되어 있으면, 함수는 그 값을 사용하여 연결 정보 secret의 이름과 네임스페이스를 구성합니다.
apiVersion: example.org/v1alpha1
kind: UserAccessKey
metadata:
namespace: default
name: my-keys
spec:
writeConnectionSecretToRef:
name: my-keys-connection-details
Composition에서 다른 것을 구성할 필요는 없습니다.
참고 사용자가 이 필드를 설정하려면 XRD 스키마에
spec.writeConnectionSecretToRef가 포함되어 있어야 합니다.
함수 입력 (Function input)
Composition의 함수 입력에서 writeConnectionSecretToRef 필드를 사용하여 secret의 이름과 네임스페이스를 직접 구성할 수도 있습니다. 이 필드는 정적 값과 패치를 모두 지원합니다.
XR에서 값을 읽으려면 패치를 사용합니다:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
writeConnectionSecretToRef:
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.connection.name
toFieldPath: name
- type: FromCompositeFieldPath
fromFieldPath: spec.team
toFieldPath: namespace
resources:
# ... composed resources with connectionDetails
또는 정적 값을 사용합니다:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
writeConnectionSecretToRef:
name: fixed-secret-name
namespace: fixed-namespace
resources:
# ... composed resources with connectionDetails
이 방법은 완전한 제어를 제공하며, 네임스페이스를 명시적으로 설정해야 하는 Cluster 범위 XR 또는 secret 이름을 변환하고 싶을 때 유용합니다.
자동 생성 (Automatically generated)
함수가 XR 참조나 함수 입력에서 secret 이름을 결정할 수 없으면 XR 이름을 기반으로 -connection 형식을 사용하여 이름을 자동 생성합니다.
Namespaced XR의 경우 함수는 XR과 같은 네임스페이스에 secret을 생성합니다.
Cluster 범위 XR의 경우 XR 참조나 함수 입력 방법 중 하나를 사용하여 네임스페이스를 지정해야 합니다. 함수는 사용할 네임스페이스를 결정할 수 없으므로 Cluster 범위 XR에서는 자동 생성이 동작하지 않습니다.
연결 정보 유형 (Connection detail types)
Function Patch and Transform은 connectionDetails 객체로 composed resource가 생성하는 특정 secret 키를 정의해야 합니다.
| Secret 유형 | 설명 | | FromConnectionSecretKey | 리소스가 생성한 secret의 키와 일치하는 secret 키를 생성합니다. | | FromFieldPath | 리소스의 필드 경로와 일치하는 secret 키를 생성합니다. | | FromValue | 미리 정의된 값으로 secret 키를 생성합니다. |
참고
value유형은 문자열 값을 사용해야 합니다.value는 개별 리소스 secret 객체에 추가되지 않습니다.value는 결합된 복합 리소스 secret에만 나타납니다.
kind: Composition
spec:
mode: Pipeline
pipeline:
- step: patch-and-transform
functionRef:
name: function-patch-and-transform
input:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: key
base:
# Removed for brevity
spec:
forProvider:
# Removed for brevity
writeConnectionSecretToRef:
namespace: docs
name: key1
connectionDetails:
- name: my-username
type: FromConnectionSecretKey
fromConnectionSecretKey: username
- name: my-field-secret
type: FromFieldPath
fromFieldPath: spec.forProvider.user
- name: my-status-secret
type: FromValue
value: "docs.crossplane.io"
리소스의 connectionDetails는 FromConnectionSecretKey로 리소스의 secret을 참조하거나, FromFieldPath로 리소스의 다른 필드, FromValue로 정적으로 정의된 값을 참조할 수 있습니다.
크로스플레인은 secret 키를 name 값으로 설정합니다.
secret을 describe하여 secret 객체 안의 secret 키를 확인할 수 있습니다.
팁 둘 이상의 리소스가 같은 secret 키 이름의 secret을 생성하면 크로스플레인은 하나의 값만 저장합니다. 고유한 secret 키를 만들려면 사용자 정의
name을 사용하세요.
중요 크로스플레인은
connectionDetails에 나열된 연결 정보만 결합된 secret 객체에 추가합니다.connectionDetails에 정의되지 않은 관리 리소스의 연결 secret은 결합된 secret 객체에 추가되지 않습니다.
kubectl describe secret
Name: my-access-key-secret
Namespace: default
Labels:
Annotations:
Type: connection.crossplane.io/v1alpha1
Data
====
myUsername: 20 bytes
myFieldSecret: 24 bytes
myStaticSecret: 18 bytes
참고
CompositeResourceDefinition은v1복합 리소스에 대해 크로스플레인이 저장하는 키를 제한할 수도 있습니다. 기본적으로 XRD는 composed resources의connectionDetails에 나열된 모든 secret 키를 결합된 secret 객체에 씁니다. 연결 시크릿에 대한 자세한 내용은 관리 리소스 문서를 읽어 보세요.
리소스 준비 상태 검사 (Resource readiness checks)
기본적으로 function-patch-and-transform은 생성된 모든 리소스의 상태가 Type: Ready이고 Status: True일 때 복합 리소스를 READY로 간주합니다.
예를 들어 ProviderConfig 같은 일부 리소스는 쿠버네티스 status가 없어 결코 Ready로 간주되지 않습니다.
사용자 정의 준비 상태 검사는 Composition이 리소스가 Ready가 되기 위해 충족해야 하는 사용자 정의 조건을 정의하게 해 줍니다.
팁 리소스가
Ready가 되려면 여러 조건을 충족해야 한다면 여러 준비 상태 검사를 사용하세요.
리소스에 readinessChecks 필드로 사용자 정의 준비 상태 검사를 정의합니다.
검사는 리소스를 어떻게 일치시킬지 정의하는 type과 비교할 리소스의 필드를 나타내는 fieldPath를 가집니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type:
fieldPath:
Composition은 다음과 같은 방법으로 리소스 필드를 일치시킬 수 있습니다.
- 문자열 일치
- 정수 일치
- 비어 있지 않음(non-empty) 일치
- 항상 ready
- 조건(condition) 일치
- boolean 일치
문자열 일치 (Match a string)
MatchString은 리소스의 필드 값이 지정된 문자열과 일치할 때 composed resource를 ready로 간주합니다.
참고 크로스플레인은 정확한 문자열 일치만 지원합니다. 하위 문자열과 정규 표현식은 준비 상태 검사에서 지원되지 않습니다.
예를 들어, 리소스의 status.atProvider.state 필드에서 문자열 Online을 일치시키려면 다음과 같이 합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: MatchString
fieldPath: status.atProvider.state
matchString: "Online"
정수 일치 (Match an integer)
MatchInteger는 리소스의 필드 값이 지정된 정수와 일치할 때 composed resource를 ready로 간주합니다.
참고 크로스플레인은
0일치를 지원하지 않습니다.
예를 들어, 리소스의 status.atProvider.state 필드에서 숫자 4를 일치시키려면 다음과 같이 합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: MatchInteger
fieldPath: status.atProvider.state
matchInteger: 4
필드 존재 일치 (Match that a field exists)
NonEmpty는 값이 있는 필드가 존재할 때 composed resource를 ready로 간주합니다.
참고 크로스플레인은
0값이나 빈 문자열을 empty로 간주합니다.
예를 들어, 리소스의 status.atProvider.state 필드가 비어 있지 않은지 확인하려면 다음과 같이 합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: NonEmpty
fieldPath: status.atProvider.state
팁
NonEmpty를 검사할 때 다른 필드를 설정할 필요는 없습니다.
항상 리소스를 ready로 간주 (Always consider a resource ready)
None은 composed resource가 생성되는 즉시 ready로 간주합니다. 크로스플레인은 리소스를 ready로 선언하기 전에 다른 조건을 기다리지 않습니다.
예를 들어, my-resource를 생성되는 즉시 ready로 간주하려면 다음과 같이 합니다.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: None
조건 일치 (Match a condition)
Condition은 status.conditions에서 예상되는 조건 유형과 그에 대한 예상 상태를 찾으면 composed resource를 ready로 간주합니다.
예를 들어, 유형 MyType의 조건과 Success 상태가 있으면 ready인 my-resource를 생각해 보세요.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: MatchCondition
matchCondition:
type: MyType
status: Success
boolean 일치 (Match a boolean)
boolean 필드를 일치시키는 데 두 가지 유형의 검사가 있습니다.
- MatchTrue
- MatchFalse
MatchTrue는 리소스 안의 필드 값이 true일 때 composed resource를 ready로 간주합니다.
MatchFalse는 리소스 안의 필드 값이 false일 때 composed resource를 ready로 간주합니다.
예를 들어, status.atProvider.manifest.status.ready가 true이면 ready인 my-resource를 생각해 보세요.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: MatchTrue
fieldPath: status.atProvider.manifest.status.ready
팁
MatchTrue를 검사할 때 다른 필드를 설정할 필요는 없습니다.
MatchFalse는 값 false로 ready 상태를 표현하는 필드를 일치시킵니다.
예를 들어, status.atProvider.manifest.status.pending이 false이면 ready인 my-resource를 생각해 보세요.
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: my-resource
base:
# Removed for brevity
readinessChecks:
- type: MatchFalse
fieldPath: status.atProvider.manifest.status.pending
팁
MatchFalse를 검사할 때 다른 필드를 설정할 필요는 없습니다.