콘텐츠로 이동

Crossplane

클라우드 리소스를 구성하기 위한 Kubernetes 네이티브 코드형 인프라 컨트롤 플레인.

명령어설명
helm repo add crossplane-stable https://charts.crossplane.io/stableCrossplane Helm 저장소 추가
helm repo updateHelm 저장소 업데이트
helm install crossplane crossplane-stable/crossplane -n crossplane-system --create-namespaceKubernetes에 Crossplane 설치
helm install crossplane crossplane-stable/crossplane -n crossplane-system --set args='{"--debug"}'디버그 로깅으로 설치
helm upgrade crossplane crossplane-stable/crossplane -n crossplane-systemCrossplane 업그레이드
helm uninstall crossplane -n crossplane-systemCrossplane 제거
kubectl get pods -n crossplane-systemCrossplane 실행 확인
kubectl get deployments -n crossplane-system배포 상태 확인
명령어설명
curl -sL https://raw.githubusercontent.com/crossplane/crossplane/master/install.sh | shCrossplane CLI 설치
brew install crossplane/tap/crossplaneHomebrew로 CLI 설치
crossplane --versionCLI 버전 확인
명령어설명
crossplane xpkg init my-config configuration새 구성 패키지 초기화
crossplane xpkg init my-provider provider새 프로바이더 패키지 초기화
crossplane xpkg buildCrossplane 패키지 빌드
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.yamlComposition을 파이프라인 모드로 변환
crossplane beta render xr.yaml composition.yaml functions.yaml로컬에서 구성된 리소스 렌더링
명령어설명
kubectl apply -f provider-aws.yamlAWS 프로바이더 설치
kubectl apply -f provider-gcp.yamlGCP 프로바이더 설치
kubectl apply -f provider-azure.yamlAzure 프로바이더 설치
kubectl apply -f provider-kubernetes.yamlKubernetes 프로바이더 설치
kubectl apply -f provider-helm.yamlHelm 프로바이더 설치
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.yamlCompositeResourceDefinition 생성
kubectl get xrd모든 XRD 목록 표시
kubectl describe xrd xdatabases.custom.example.comXRD 상세 정보 표시
kubectl get composite모든 복합 리소스 목록 표시
kubectl describe composite복합 리소스 상태 표시
kubectl delete xrd xdatabases.custom.example.comXRD 삭제
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.yamlComposition 생성
kubectl get compositions모든 Composition 목록 표시
kubectl describe compositionComposition 상세 정보 표시
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 databaseDatabase 유형의 클레임 목록 표시
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.yamlComposition 함수 설치
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.yamlEnvironmentConfig 생성
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/crossplaneCrossplane 컨트롤러 로그 보기
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모든 관리형 리소스 삭제 (주의하여 사용)
  1. 직접 Composite 대신 클레임을 사용하세요 — 클레임은 네임스페이스 범위이며 팀 간 적절한 RBAC 경계를 제공합니다.

  2. 프로바이더 버전을 고정하세요 — 업그레이드 중 예기치 않은 변경을 방지하기 위해 항상 정확한 프로바이더 버전을 지정하세요.

  3. 새 Composition에는 Pipeline 모드를 사용하세요 — 함수를 사용한 Pipeline 모드는 Resources 모드보다 더 유연하고 테스트하기 쉽습니다.

  4. EnvironmentConfig를 구현하세요 — VPC ID 및 서브넷 목록과 같은 공유 환경 데이터를 저장하여 Composition 간 중복을 방지하세요.

  5. 연결 시크릿 게시를 설정하세요 — 애플리케이션이 연결 상세 정보를 사용할 수 있도록 항상 클레임에 writeConnectionSecretToRef를 정의하세요.

  6. crossplane beta trace를 사용하세요 — 클레임에서 관리형 리소스까지 전체 리소스 트리를 시각화하여 문제를 가장 빠르게 디버그할 수 있습니다.

  7. 선택을 위해 Composition에 레이블을 지정하세요 — 클레임이 이름 대신 레이블로 Composition을 선택할 수 있도록 provider: awsengine: postgres와 같은 레이블을 사용하세요.

  8. crossplane beta render로 로컬 테스트하세요 — 클러스터에 적용하기 전에 로컬에서 Composition을 렌더링하세요.

  9. 준비 상태 확인을 구현하세요function-auto-detect-ready 또는 사용자 정의 준비 상태 확인을 사용하여 복합 리소스가 정확한 상태를 보고하도록 하세요.

  10. XRD 버전을 관리하세요v1alpha1로 시작하여 API가 안정화됨에 따라 v1beta1에서 v1으로 승격하세요.