Kubernetes-native Infrastructure-as-Code Control Plane zur Komposition von Cloud-Ressourcen.
| Befehl | Beschreibung |
|---|
helm repo add crossplane-stable https://charts.crossplane.io/stable | Crossplane Helm-Repo hinzufügen |
helm repo update | Helm-Repositories aktualisieren |
helm install crossplane crossplane-stable/crossplane -n crossplane-system --create-namespace | Crossplane 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-system | Crossplane aktualisieren |
helm uninstall crossplane -n crossplane-system | Crossplane deinstallieren |
kubectl get pods -n crossplane-system | Überprüfen ob Crossplane läuft |
kubectl get deployments -n crossplane-system | Deployment-Status prüfen |
| Befehl | Beschreibung |
|---|
curl -sL https://raw.githubusercontent.com/crossplane/crossplane/master/install.sh | sh | Crossplane CLI installieren |
brew install crossplane/tap/crossplane | CLI über Homebrew installieren |
crossplane --version | CLI-Version anzeigen |
| Befehl | Beschreibung |
|---|
crossplane xpkg init my-config configuration | Neues Konfigurationspaket initialisieren |
crossplane xpkg init my-provider provider | Neues Provider-Paket initialisieren |
crossplane xpkg build | Crossplane-Paket bauen |
crossplane xpkg build --package-root=./package --examples-root=./examples | Mit bestimmten Verzeichnissen bauen |
crossplane xpkg push index.docker.io/org/config:v1 | Paket in Registry pushen |
crossplane xpkg install provider index.docker.io/org/provider:v1 | Provider-Paket installieren |
crossplane xpkg install configuration index.docker.io/org/config:v1 | Konfigurationspaket installieren |
| Befehl | Beschreibung |
|---|
crossplane beta validate schema.yaml resources/ | Ressourcen gegen Schema validieren |
crossplane beta trace kind/name | Ressourcen-Abhängigkeiten verfolgen |
crossplane beta trace kind/name -o wide | Tracing mit erweiterter Ausgabe |
crossplane beta convert composition comp.yaml | Composition in Pipeline-Modus konvertieren |
crossplane beta render xr.yaml composition.yaml functions.yaml | Komponierte Ressourcen lokal rendern |
| Befehl | Beschreibung |
|---|
kubectl apply -f provider-aws.yaml | AWS-Provider installieren |
kubectl apply -f provider-gcp.yaml | GCP-Provider installieren |
kubectl apply -f provider-azure.yaml | Azure-Provider installieren |
kubectl apply -f provider-kubernetes.yaml | Kubernetes-Provider installieren |
kubectl apply -f provider-helm.yaml | Helm-Provider installieren |
kubectl get providers | Installierte Provider auflisten |
kubectl get provider.pkg provider-aws -o yaml | Provider-Details anzeigen |
kubectl describe providerrevision | Provider-Revision-Status anzeigen |
kubectl get managed | Alle verwalteten Cloud-Ressourcen auflisten |
kubectl get managed -o wide | Verwaltete 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
| Befehl | Beschreibung |
|---|
kubectl apply -f xrd.yaml | CompositeResourceDefinition erstellen |
kubectl get xrd | Alle XRDs auflisten |
kubectl describe xrd xdatabases.custom.example.com | XRD-Details anzeigen |
kubectl get composite | Alle Composite Resources auflisten |
kubectl describe composite | Composite-Resource-Status anzeigen |
kubectl delete xrd xdatabases.custom.example.com | XRD löschen |
spec.claimNames in XRD setzen | Namespace-scoped Claims aktivieren |
spec.versions[].schema in XRD setzen | OpenAPI-Schema für XRD definieren |
spec.connectionSecretKeys setzen | Zu 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
| Befehl | Beschreibung |
|---|
kubectl apply -f composition.yaml | Composition erstellen |
kubectl get compositions | Alle Compositions auflisten |
kubectl describe composition | Composition-Details anzeigen |
spec.compositeTypeRef in Composition setzen | Mit XRD verknüpfen |
spec.resources[] in Composition setzen | Komponierte Ressourcen definieren |
patches in Composition verwenden | Felder 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 setzen | Function-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
| Befehl | Beschreibung |
|---|
kubectl apply -f claim.yaml | Ressourcen-Claim erstellen |
kubectl get claim | Alle Claims im Namespace auflisten |
kubectl get database | Claims vom Typ Database auflisten |
kubectl describe claim my-database | Claim-Status und Events anzeigen |
kubectl delete claim my-database | Claim und verwaltete Ressourcen löschen |
spec.compositionRef.name im Claim setzen | Bestimmte Composition auswählen |
spec.compositionSelector.matchLabels im Claim setzen | Composition per Labels auswählen |
kubectl get events --field-selector involvedObject.name=my-db | Claim-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
| Befehl | Beschreibung |
|---|
kubectl apply -f function.yaml | Composition-Function installieren |
kubectl get functions | Installierte Functions auflisten |
kubectl describe function function-patch-and-transform | Function-Details anzeigen |
crossplane beta render xr.yaml composition.yaml functions.yaml | Pipeline 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
| Befehl | Beschreibung |
|---|
kubectl create secret generic aws-creds -n crossplane-system --from-file=creds=./aws-creds.txt | Provider-Credentials-Secret erstellen |
spec.credentials.source: Secret in ProviderConfig setzen | Credentials-Secret referenzieren |
kubectl apply -f environmentconfig.yaml | EnvironmentConfig erstellen |
kubectl get storeconfig | Store-Konfigurationen auflisten |
spec.publishConnectionDetailsTo in Composition setzen | Connection-Secret-Publishing konfigurieren |
spec.writeConnectionSecretToRef im Claim setzen | Connection-Details in Secret schreiben |
kubectl get secrets -l crossplane.io/claim-name=my-db | Secrets 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
| Befehl | Beschreibung |
|---|
kubectl get managed -o wide | Verwaltete Ressourcen mit Status anzeigen |
kubectl describe managed | Detaillierte Infos zu verwalteten Ressourcen anzeigen |
kubectl logs -n crossplane-system deploy/crossplane | Crossplane-Controller-Logs anzeigen |
kubectl logs -n crossplane-system deploy/crossplane -f | Controller-Logs verfolgen |
kubectl get events --sort-by='.lastTimestamp' | Letzte Cluster-Events anzeigen |
crossplane beta trace xdatabase my-db | Vollständigen Ressourcenbaum verfolgen |
crossplane beta trace xdatabase my-db -o wide | Tracing mit detailliertem Status |
kubectl get managed -l crossplane.io/composite=my-db | Ressourcen für ein Composite finden |
kubectl annotate managed resource.api.example.com/name crossplane.io/paused=true | Ressourcen-Reconciliation pausieren |
kubectl annotate managed resource.api.example.com/name crossplane.io/paused- | Ressourcen-Reconciliation fortsetzen |
| Befehl | Beschreibung |
|---|
kubectl get providerrevision | Prüfen ob Provider gesund ist |
kubectl describe providerrevision | Provider-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 --all | Alle verwalteten Ressourcen löschen (Vorsicht) |
-
Claims statt direkte Composites verwenden — Claims sind Namespace-scoped und bieten ordnungsgemäße RBAC-Grenzen zwischen Teams.
-
Provider-Versionen festpinnen — Immer exakte Provider-Versionen angeben, um unerwartete Änderungen bei Upgrades zu verhindern.
-
Pipeline-Modus für neue Compositions verwenden — Pipeline-Modus mit Functions ist flexibler und testbarer als Resources-Modus.
-
EnvironmentConfigs implementieren — Gemeinsame Umgebungsdaten wie VPC-IDs und Subnetz-Listen speichern, um Duplizierung über Compositions hinweg zu vermeiden.
-
Connection-Secret-Publishing einrichten — Immer writeConnectionSecretToRef in Claims definieren, damit Anwendungen Connection-Details konsumieren können.
-
crossplane beta trace verwenden — Dies ist der schnellste Weg, Probleme zu debuggen, indem der gesamte Ressourcenbaum vom Claim bis zur verwalteten Ressource visualisiert wird.
-
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.
-
Lokal mit crossplane beta render testen — Compositions lokal rendern, bevor sie auf einen Cluster angewendet werden.
-
Readiness-Checks implementieren — function-auto-detect-ready oder benutzerdefinierte Readiness-Checks verwenden, um sicherzustellen, dass Composite Resources einen korrekten Status melden.
-
XRDs versionieren — Mit v1alpha1 starten und über v1beta1 zu v1 aufsteigen, wenn die API stabil wird.