Zum Inhalt springen

Crossplane

Kubernetes-native Infrastructure-as-Code Control Plane zur Komposition von Cloud-Ressourcen.

BefehlBeschreibung
helm repo add crossplane-stable https://charts.crossplane.io/stableCrossplane Helm-Repo hinzufügen
helm repo updateHelm-Repositories aktualisieren
helm install crossplane crossplane-stable/crossplane -n crossplane-system --create-namespaceCrossplane auf Kubernetes installieren
helm install crossplane crossplane-stable/crossplane -n crossplane-system --set args='{"--debug"}'Mit Debug-Logging installieren
helm upgrade crossplane crossplane-stable/crossplane -n crossplane-systemCrossplane aktualisieren
helm uninstall crossplane -n crossplane-systemCrossplane deinstallieren
kubectl get pods -n crossplane-systemÜberprüfen ob Crossplane läuft
kubectl get deployments -n crossplane-systemDeployment-Status prüfen
BefehlBeschreibung
curl -sL https://raw.githubusercontent.com/crossplane/crossplane/master/install.sh | shCrossplane CLI installieren
brew install crossplane/tap/crossplaneCLI über Homebrew installieren
crossplane --versionCLI-Version anzeigen
BefehlBeschreibung
crossplane xpkg init my-config configurationNeues Konfigurationspaket initialisieren
crossplane xpkg init my-provider providerNeues Provider-Paket initialisieren
crossplane xpkg buildCrossplane-Paket bauen
crossplane xpkg build --package-root=./package --examples-root=./examplesMit bestimmten Verzeichnissen bauen
crossplane xpkg push index.docker.io/org/config:v1Paket in Registry pushen
crossplane xpkg install provider index.docker.io/org/provider:v1Provider-Paket installieren
crossplane xpkg install configuration index.docker.io/org/config:v1Konfigurationspaket installieren
BefehlBeschreibung
crossplane beta validate schema.yaml resources/Ressourcen gegen Schema validieren
crossplane beta trace kind/nameRessourcen-Abhängigkeiten verfolgen
crossplane beta trace kind/name -o wideTracing mit erweiterter Ausgabe
crossplane beta convert composition comp.yamlComposition in Pipeline-Modus konvertieren
crossplane beta render xr.yaml composition.yaml functions.yamlKomponierte Ressourcen lokal rendern
BefehlBeschreibung
kubectl apply -f provider-aws.yamlAWS-Provider installieren
kubectl apply -f provider-gcp.yamlGCP-Provider installieren
kubectl apply -f provider-azure.yamlAzure-Provider installieren
kubectl apply -f provider-kubernetes.yamlKubernetes-Provider installieren
kubectl apply -f provider-helm.yamlHelm-Provider installieren
kubectl get providersInstallierte Provider auflisten
kubectl get provider.pkg provider-aws -o yamlProvider-Details anzeigen
kubectl describe providerrevisionProvider-Revision-Status anzeigen
kubectl get managedAlle verwalteten Cloud-Ressourcen auflisten
kubectl get managed -o wideVerwaltete Ressourcen mit Status auflisten
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: credentials

Credentials-Secret erstellen:

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
BefehlBeschreibung
kubectl apply -f xrd.yamlCompositeResourceDefinition erstellen
kubectl get xrdAlle XRDs auflisten
kubectl describe xrd xdatabases.custom.example.comXRD-Details anzeigen
kubectl get compositeAlle Composite Resources auflisten
kubectl describe compositeComposite-Resource-Status anzeigen
kubectl delete xrd xdatabases.custom.example.comXRD löschen
spec.claimNames in XRD setzenNamespace-scoped Claims aktivieren
spec.versions[].schema in XRD setzenOpenAPI-Schema für XRD definieren
spec.connectionSecretKeys setzenZu exponierende Connection-Keys definieren
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
BefehlBeschreibung
kubectl apply -f composition.yamlComposition erstellen
kubectl get compositionsAlle Compositions auflisten
kubectl describe compositionComposition-Details anzeigen
spec.compositeTypeRef in Composition setzenMit XRD verknüpfen
spec.resources[] in Composition setzenKomponierte Ressourcen definieren
patches in Composition verwendenFelder zwischen Composite und Ressourcen mappen
patch: { type: FromCompositeFieldPath }Patch von Composite zu Ressource
patch: { type: ToCompositeFieldPath }Patch von Ressource zu Composite
patch: { type: CombineFromComposite }Mehrere Felder zu einem kombinieren
spec.mode: Pipeline in Composition setzenFunction-Pipeline-Modus verwenden
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
BefehlBeschreibung
kubectl apply -f claim.yamlRessourcen-Claim erstellen
kubectl get claimAlle Claims im Namespace auflisten
kubectl get databaseClaims vom Typ Database auflisten
kubectl describe claim my-databaseClaim-Status und Events anzeigen
kubectl delete claim my-databaseClaim und verwaltete Ressourcen löschen
spec.compositionRef.name im Claim setzenBestimmte Composition auswählen
spec.compositionSelector.matchLabels im Claim setzenComposition per Labels auswählen
kubectl get events --field-selector involvedObject.name=my-dbClaim-Events anzeigen
kubectl get secret my-db-conn -o jsonpath='{.data.endpoint}'Connection-Details lesen
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
BefehlBeschreibung
kubectl apply -f function.yamlComposition-Function installieren
kubectl get functionsInstallierte Functions auflisten
kubectl describe function function-patch-and-transformFunction-Details anzeigen
crossplane beta render xr.yaml composition.yaml functions.yamlPipeline lokal testen
# function-patch-and-transform installieren
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 installieren
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 installieren
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
BefehlBeschreibung
kubectl create secret generic aws-creds -n crossplane-system --from-file=creds=./aws-creds.txtProvider-Credentials-Secret erstellen
spec.credentials.source: Secret in ProviderConfig setzenCredentials-Secret referenzieren
kubectl apply -f environmentconfig.yamlEnvironmentConfig erstellen
kubectl get storeconfigStore-Konfigurationen auflisten
spec.publishConnectionDetailsTo in Composition setzenConnection-Secret-Publishing konfigurieren
spec.writeConnectionSecretToRef im Claim setzenConnection-Details in Secret schreiben
kubectl get secrets -l crossplane.io/claim-name=my-dbSecrets für einen Claim auflisten
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
BefehlBeschreibung
kubectl get managed -o wideVerwaltete Ressourcen mit Status anzeigen
kubectl describe managedDetaillierte Infos zu verwalteten Ressourcen anzeigen
kubectl logs -n crossplane-system deploy/crossplaneCrossplane-Controller-Logs anzeigen
kubectl logs -n crossplane-system deploy/crossplane -fController-Logs verfolgen
kubectl get events --sort-by='.lastTimestamp'Letzte Cluster-Events anzeigen
crossplane beta trace xdatabase my-dbVollständigen Ressourcenbaum verfolgen
crossplane beta trace xdatabase my-db -o wideTracing mit detailliertem Status
kubectl get managed -l crossplane.io/composite=my-dbRessourcen für ein Composite finden
kubectl annotate managed resource.api.example.com/name crossplane.io/paused=trueRessourcen-Reconciliation pausieren
kubectl annotate managed resource.api.example.com/name crossplane.io/paused-Ressourcen-Reconciliation fortsetzen
BefehlBeschreibung
kubectl get providerrevisionPrüfen ob Provider gesund ist
kubectl describe providerrevisionProvider-Installationsfehler anzeigen
kubectl get managed -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.conditions[*].reason}{"\n"}{end}'Schnellstatus aller verwalteten Ressourcen
kubectl patch managed resource.api.example.com/name --type merge -p '{"metadata":{"annotations":{"crossplane.io/paused":"true"}}}'Per Patch pausieren
kubectl delete managed --allAlle verwalteten Ressourcen löschen (Vorsicht)
  1. Claims statt direkte Composites verwenden — Claims sind Namespace-scoped und bieten ordnungsgemäße RBAC-Grenzen zwischen Teams.

  2. Provider-Versionen festpinnen — Immer exakte Provider-Versionen angeben, um unerwartete Änderungen bei Upgrades zu verhindern.

  3. Pipeline-Modus für neue Compositions verwenden — Pipeline-Modus mit Functions ist flexibler und testbarer als Resources-Modus.

  4. EnvironmentConfigs implementieren — Gemeinsame Umgebungsdaten wie VPC-IDs und Subnetz-Listen speichern, um Duplizierung über Compositions hinweg zu vermeiden.

  5. Connection-Secret-Publishing einrichten — Immer writeConnectionSecretToRef in Claims definieren, damit Anwendungen Connection-Details konsumieren können.

  6. crossplane beta trace verwenden — Dies ist der schnellste Weg, Probleme zu debuggen, indem der gesamte Ressourcenbaum vom Claim bis zur verwalteten Ressource visualisiert wird.

  7. Compositions per Labels selektierbar machen — Labels wie provider: aws und engine: postgres verwenden, damit Claims Compositions per Label statt per Name auswählen können.

  8. Lokal mit crossplane beta render testen — Compositions lokal rendern, bevor sie auf einen Cluster angewendet werden.

  9. Readiness-Checks implementierenfunction-auto-detect-ready oder benutzerdefinierte Readiness-Checks verwenden, um sicherzustellen, dass Composite Resources einen korrekten Status melden.

  10. XRDs versionieren — Mit v1alpha1 starten und über v1beta1 zu v1 aufsteigen, wenn die API stabil wird.