클라우드 리소스를 구성하기 위한 Kubernetes 네이티브 코드형 인프라 컨트롤 플레인.
| 명령어 | 설명 |
|---|
helm repo add crossplane-stable https://charts.crossplane.io/stable | Crossplane Helm 저장소 추가 |
helm repo update | Helm 저장소 업데이트 |
helm install crossplane crossplane-stable/crossplane -n crossplane-system --create-namespace | Kubernetes에 Crossplane 설치 |
helm install crossplane crossplane-stable/crossplane -n crossplane-system --set args='{"--debug"}' | 디버그 로깅으로 설치 |
helm upgrade crossplane crossplane-stable/crossplane -n crossplane-system | Crossplane 업그레이드 |
helm uninstall crossplane -n crossplane-system | Crossplane 제거 |
kubectl get pods -n crossplane-system | Crossplane 실행 확인 |
kubectl get deployments -n crossplane-system | 배포 상태 확인 |
| 명령어 | 설명 |
|---|
curl -sL https://raw.githubusercontent.com/crossplane/crossplane/master/install.sh | sh | Crossplane CLI 설치 |
brew install crossplane/tap/crossplane | Homebrew로 CLI 설치 |
crossplane --version | CLI 버전 확인 |
| 명령어 | 설명 |
|---|
crossplane xpkg init my-config configuration | 새 구성 패키지 초기화 |
crossplane xpkg init my-provider provider | 새 프로바이더 패키지 초기화 |
crossplane xpkg build | Crossplane 패키지 빌드 |
crossplane xpkg build --package-root=./package --examples-root=./examples | 특정 디렉터리로 빌드 |
crossplane xpkg push index.docker.io/org/config:v1 | 레지스트리에 패키지 푸시 |
crossplane xpkg install provider index.docker.io/org/provider:v1 | 프로바이더 패키지 설치 |
crossplane xpkg install configuration index.docker.io/org/config:v1 | 구성 패키지 설치 |
| 명령어 | 설명 |
|---|
crossplane beta validate schema.yaml resources/ | 스키마에 대해 리소스 검증 |
crossplane beta trace kind/name | 리소스 종속성 추적 |
crossplane beta trace kind/name -o wide | 확장 출력으로 추적 |
crossplane beta convert composition comp.yaml | Composition을 파이프라인 모드로 변환 |
crossplane beta render xr.yaml composition.yaml functions.yaml | 로컬에서 구성된 리소스 렌더링 |
| 명령어 | 설명 |
|---|
kubectl apply -f provider-aws.yaml | AWS 프로바이더 설치 |
kubectl apply -f provider-gcp.yaml | GCP 프로바이더 설치 |
kubectl apply -f provider-azure.yaml | Azure 프로바이더 설치 |
kubectl apply -f provider-kubernetes.yaml | Kubernetes 프로바이더 설치 |
kubectl apply -f provider-helm.yaml | Helm 프로바이더 설치 |
kubectl get providers | 설치된 프로바이더 목록 표시 |
kubectl get provider.pkg provider-aws -o yaml | 프로바이더 상세 정보 표시 |
kubectl describe providerrevision | 프로바이더 리비전 상태 표시 |
kubectl get managed | 모든 관리형 클라우드 리소스 목록 표시 |
kubectl get managed -o wide | 상태와 함께 관리형 리소스 목록 표시 |
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-creds
key: credentials
자격 증명 시크릿 생성:
kubectl create secret generic aws-creds \
-n crossplane-system \
--from-file=credentials=./aws-credentials.txt
apiVersion: gcp.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
projectID: my-gcp-project
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: gcp-creds
key: credentials
apiVersion: azure.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: azure-creds
key: credentials
| 명령어 | 설명 |
|---|
kubectl apply -f xrd.yaml | CompositeResourceDefinition 생성 |
kubectl get xrd | 모든 XRD 목록 표시 |
kubectl describe xrd xdatabases.custom.example.com | XRD 상세 정보 표시 |
kubectl get composite | 모든 복합 리소스 목록 표시 |
kubectl describe composite | 복합 리소스 상태 표시 |
kubectl delete xrd xdatabases.custom.example.com | XRD 삭제 |
XRD에서 spec.claimNames 설정 | 네임스페이스 범위 클레임 활성화 |
XRD에서 spec.versions[].schema 설정 | XRD용 OpenAPI 스키마 정의 |
spec.connectionSecretKeys 설정 | 노출할 연결 키 정의 |
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xdatabases.platform.example.com
spec:
group: platform.example.com
names:
kind: XDatabase
plural: xdatabases
claimNames:
kind: Database
plural: databases
connectionSecretKeys:
- endpoint
- port
- username
- password
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
parameters:
type: object
properties:
engine:
type: string
enum: ["postgres", "mysql", "mariadb"]
description: "Database engine type"
engineVersion:
type: string
description: "Engine version"
storageGB:
type: integer
default: 20
description: "Storage size in GB"
instanceSize:
type: string
enum: ["small", "medium", "large"]
default: "small"
required:
- engine
required:
- parameters
| 명령어 | 설명 |
|---|
kubectl apply -f composition.yaml | Composition 생성 |
kubectl get compositions | 모든 Composition 목록 표시 |
kubectl describe composition | Composition 상세 정보 표시 |
Composition에서 spec.compositeTypeRef 설정 | XRD에 연결 |
Composition에서 spec.resources[] 설정 | 구성된 리소스 정의 |
Composition에서 patches 사용 | 복합과 리소스 간 필드 매핑 |
patch: { type: FromCompositeFieldPath } | 복합에서 리소스로 패치 |
patch: { type: ToCompositeFieldPath } | 리소스에서 복합으로 패치 |
patch: { type: CombineFromComposite } | 여러 필드를 하나로 결합 |
Composition에서 spec.mode: Pipeline 설정 | 함수 파이프라인 모드 사용 |
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: xdatabase-aws
labels:
provider: aws
engine: postgres
spec:
compositeTypeRef:
apiVersion: platform.example.com/v1alpha1
kind: XDatabase
resources:
- name: rds-instance
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: Instance
spec:
forProvider:
engine: postgres
instanceClass: db.t3.micro
allocatedStorage: 20
publiclyAccessible: false
skipFinalSnapshot: true
region: us-east-1
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.parameters.engineVersion
toFieldPath: spec.forProvider.engineVersion
- type: FromCompositeFieldPath
fromFieldPath: spec.parameters.storageGB
toFieldPath: spec.forProvider.allocatedStorage
- type: FromCompositeFieldPath
fromFieldPath: spec.parameters.instanceSize
toFieldPath: spec.forProvider.instanceClass
transforms:
- type: map
map:
small: db.t3.micro
medium: db.t3.medium
large: db.t3.large
connectionDetails:
- type: FromFieldPath
name: endpoint
fromFieldPath: status.atProvider.endpoint
- type: FromFieldPath
name: port
fromFieldPath: status.atProvider.port
- name: subnet-group
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: SubnetGroup
spec:
forProvider:
region: us-east-1
description: "Managed by Crossplane"
writeConnectionSecretsToNamespace: crossplane-system
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: xdatabase-pipeline
spec:
compositeTypeRef:
apiVersion: platform.example.com/v1alpha1
kind: XDatabase
mode: Pipeline
pipeline:
- step: patch-and-transform
functionRef:
name: function-patch-and-transform
input:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: rds-instance
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: Instance
spec:
forProvider:
engine: postgres
instanceClass: db.t3.micro
region: us-east-1
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.parameters.storageGB
toFieldPath: spec.forProvider.allocatedStorage
- step: auto-ready
functionRef:
name: function-auto-detect-ready
| 명령어 | 설명 |
|---|
kubectl apply -f claim.yaml | 리소스 클레임 생성 |
kubectl get claim | 네임스페이스의 모든 클레임 목록 표시 |
kubectl get database | Database 유형의 클레임 목록 표시 |
kubectl describe claim my-database | 클레임 상태 및 이벤트 표시 |
kubectl delete claim my-database | 클레임 및 관리형 리소스 삭제 |
클레임에서 spec.compositionRef.name 설정 | 특정 Composition 선택 |
클레임에서 spec.compositionSelector.matchLabels 설정 | 레이블로 Composition 선택 |
kubectl get events --field-selector involvedObject.name=my-db | 클레임 이벤트 보기 |
kubectl get secret my-db-conn -o jsonpath='{.data.endpoint}' | 연결 상세 정보 읽기 |
apiVersion: platform.example.com/v1alpha1
kind: Database
metadata:
name: my-app-db
namespace: default
spec:
parameters:
engine: postgres
engineVersion: "15"
storageGB: 50
instanceSize: medium
compositionSelector:
matchLabels:
provider: aws
engine: postgres
writeConnectionSecretToRef:
name: my-app-db-conn
| 명령어 | 설명 |
|---|
kubectl apply -f function.yaml | Composition 함수 설치 |
kubectl get functions | 설치된 함수 목록 표시 |
kubectl describe function function-patch-and-transform | 함수 상세 정보 표시 |
crossplane beta render xr.yaml composition.yaml functions.yaml | 로컬에서 파이프라인 테스트 |
# function-patch-and-transform 설치
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
name: function-patch-and-transform
spec:
package: xpkg.upbound.io/crossplane-contrib/function-patch-and-transform:v0.7.0
---
# function-auto-detect-ready 설치
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
name: function-auto-detect-ready
spec:
package: xpkg.upbound.io/crossplane-contrib/function-auto-detect-ready:v0.2.1
---
# function-go-templating 설치
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
name: function-go-templating
spec:
package: xpkg.upbound.io/crossplane-contrib/function-go-templating:v0.6.0
apiVersion: apiextensions.crossplane.io/v1alpha1
kind: EnvironmentConfig
metadata:
name: production
data:
region: us-east-1
environment: production
vpcId: vpc-0abc123def456
subnetIds:
- subnet-0abc123
- subnet-0def456
- subnet-0ghi789
tags:
team: platform
costCenter: engineering
| 명령어 | 설명 |
|---|
kubectl create secret generic aws-creds -n crossplane-system --from-file=creds=./aws-creds.txt | 프로바이더 자격 증명 시크릿 생성 |
ProviderConfig에서 spec.credentials.source: Secret 설정 | 자격 증명 시크릿 참조 |
kubectl apply -f environmentconfig.yaml | EnvironmentConfig 생성 |
kubectl get storeconfig | 스토어 구성 목록 표시 |
Composition에서 spec.publishConnectionDetailsTo 설정 | 연결 시크릿 게시 구성 |
클레임에서 spec.writeConnectionSecretToRef 설정 | 시크릿에 연결 상세 정보 쓰기 |
kubectl get secrets -l crossplane.io/claim-name=my-db | 클레임의 시크릿 목록 표시 |
apiVersion: secrets.crossplane.io/v1alpha1
kind: StoreConfig
metadata:
name: vault
spec:
type: Vault
defaultScope: crossplane-system
vault:
mountPath: secret
version: v2
auth:
method: Token
token:
source: Secret
secretRef:
namespace: crossplane-system
name: vault-token
key: token
| 명령어 | 설명 |
|---|
kubectl get managed -o wide | 상태와 함께 관리형 리소스 표시 |
kubectl describe managed | 관리형 리소스 상세 정보 표시 |
kubectl logs -n crossplane-system deploy/crossplane | Crossplane 컨트롤러 로그 보기 |
kubectl logs -n crossplane-system deploy/crossplane -f | 컨트롤러 로그 팔로우 |
kubectl get events --sort-by='.lastTimestamp' | 최근 클러스터 이벤트 보기 |
crossplane beta trace xdatabase my-db | 전체 리소스 트리 추적 |
crossplane beta trace xdatabase my-db -o wide | 상세 상태로 추적 |
kubectl get managed -l crossplane.io/composite=my-db | 복합 리소스의 리소스 찾기 |
kubectl annotate managed resource.api.example.com/name crossplane.io/paused=true | 리소스 조정 일시 중지 |
kubectl annotate managed resource.api.example.com/name crossplane.io/paused- | 리소스 조정 재개 |
| 명령어 | 설명 |
|---|
kubectl get providerrevision | 프로바이더 상태 확인 |
kubectl describe providerrevision | 프로바이더 설치 오류 보기 |
kubectl get managed -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.conditions[*].reason}{"\n"}{end}' | 모든 관리형 리소스의 빠른 상태 확인 |
kubectl patch managed resource.api.example.com/name --type merge -p '{"metadata":{"annotations":{"crossplane.io/paused":"true"}}}' | 패치를 통한 일시 중지 |
kubectl delete managed --all | 모든 관리형 리소스 삭제 (주의하여 사용) |
-
직접 Composite 대신 클레임을 사용하세요 — 클레임은 네임스페이스 범위이며 팀 간 적절한 RBAC 경계를 제공합니다.
-
프로바이더 버전을 고정하세요 — 업그레이드 중 예기치 않은 변경을 방지하기 위해 항상 정확한 프로바이더 버전을 지정하세요.
-
새 Composition에는 Pipeline 모드를 사용하세요 — 함수를 사용한 Pipeline 모드는 Resources 모드보다 더 유연하고 테스트하기 쉽습니다.
-
EnvironmentConfig를 구현하세요 — VPC ID 및 서브넷 목록과 같은 공유 환경 데이터를 저장하여 Composition 간 중복을 방지하세요.
-
연결 시크릿 게시를 설정하세요 — 애플리케이션이 연결 상세 정보를 사용할 수 있도록 항상 클레임에 writeConnectionSecretToRef를 정의하세요.
-
crossplane beta trace를 사용하세요 — 클레임에서 관리형 리소스까지 전체 리소스 트리를 시각화하여 문제를 가장 빠르게 디버그할 수 있습니다.
-
선택을 위해 Composition에 레이블을 지정하세요 — 클레임이 이름 대신 레이블로 Composition을 선택할 수 있도록 provider: aws 및 engine: postgres와 같은 레이블을 사용하세요.
-
crossplane beta render로 로컬 테스트하세요 — 클러스터에 적용하기 전에 로컬에서 Composition을 렌더링하세요.
-
준비 상태 확인을 구현하세요 — function-auto-detect-ready 또는 사용자 정의 준비 상태 확인을 사용하여 복합 리소스가 정확한 상태를 보고하도록 하세요.
-
XRD 버전을 관리하세요 — v1alpha1로 시작하여 API가 안정화됨에 따라 v1beta1에서 v1으로 승격하세요.