コンテンツにスキップ

Crossplane

クラウドリソースを組み合わせるためのKubernetesネイティブInfrastructure as Codeコントロールプレーン。

コマンド説明
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スキーマを定義
XRDで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 }複数のフィールドを1つに結合
Compositionでspec.mode: Pipelineを設定関数パイプラインモードを使用

Compositionの例(リソースモード)

Section titled “Compositionの例(リソースモード)”
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

Compositionの例(パイプラインモード)

Section titled “Compositionの例(パイプラインモード)”
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クレームのシークレットを一覧表示

外部シークレットストア用StoreConfig

Section titled “外部シークレットストア用StoreConfig”
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にはパイプラインモードを使用 — 関数付きのパイプラインモードは、リソースモードよりも柔軟でテスト可能です。

  4. EnvironmentConfigを実装 — VPC IDやサブネットリストなどの共有環境データを保存して、Composition間の重複を避けます。

  5. 接続シークレット公開を設定 — アプリケーションが接続詳細を利用できるよう、クレームには常にwriteConnectionSecretToRefを定義します。

  6. crossplane beta traceを使用 — クレームからマネージドリソースまでのリソースツリー全体を可視化して、問題をデバッグする最速の方法です。

  7. 選択用にCompositionにラベルを付けるprovider: awsengine: postgresなどのラベルを使用して、クレームが名前ではなくラベルでCompositionを選択できるようにします。

  8. crossplane beta renderでローカルテスト — クラスターに適用する前にCompositionをローカルでレンダリングします。

  9. レディネスチェックを実装function-auto-detect-readyまたはカスタムレディネスチェックを使用して、コンポジットリソースが正確なステータスを報告するようにします。

  10. XRDをバージョニングv1alpha1から始めて、APIが安定するにつれてv1beta1v1へと昇格させます。