Crossplane — Kubernetes-natívny Infrastructure as Code
Crossplane je CNCF graduated projekt, ktorý premieňa váš Kubernetes klaster na univerzálny control plane pre infraštruktúru. Namiesto písania Terraform HCL alebo CloudFormation šablón definujete cloudové zdroje ako Kubernetes custom resources — s rovnakým kubectl apply workflow, aký poznáte z deploymentu aplikácií.
Prečo Crossplane
Tradičné IaC nástroje ako Terraform fungujú výborne, ale majú zásadné obmedzenia v cloud-native prostredí:
- Imperatívny workflow —
terraform applyje push-based, vyžaduje manuálne alebo CI-triggered spustenie - State management — remote state, locking, drift detection sú komplexné
- Žiadna self-service — vývojári musia žiadať infra tím o zmeny alebo mať prístup k Terraform
Crossplane tieto problémy rieši:
- Deklaratívny a reconciliation-based — Kubernetes controller neustále zabezpečuje desired state
- Self-service — vývojári vytvárajú infraštruktúru cez
kubectlalebo GitOps - Abstrakcie — platformové tímy definujú
Compositions, vývojári konzumujú jednoduchéClaims - Natívny Kubernetes — RBAC, namespaces, GitOps fungujú automaticky
Crossplane vs Terraform vs Pulumi
| Aspekt | Crossplane | Terraform | Pulumi |
|---|---|---|---|
| Prístup | Kubernetes CRDs | HCL deklaratívny | Imperatívny (kód) |
| Reconciliation | Kontinuálny | Push-based | Push-based |
| Drift detection | Automatický | terraform plan |
pulumi preview |
| Self-service | Natívny (Claims) | Wrapper potrebný | Wrapper potrebný |
| State | Kubernetes etcd | Remote backend | Pulumi Cloud / S3 |
| GitOps | Natívny | Cez CI/CD | Cez CI/CD |
| Krivka učenia | Stredná-Vysoká | Stredná | Nízka-Stredná |
Architektúra
┌─────────────────────────────────────────┐
│ Kubernetes Cluster │
│ │
│ ┌──────────┐ ┌────────────────────┐ │
│ │ Claims │──│ Compositions │ │
│ │ (XRC) │ │ (XR templates) │ │
│ └──────────┘ └────────┬───────────┘ │
│ │ │
│ ┌──────────▼───────────┐ │
│ │ Managed Resources │ │
│ │ (AWS/GCP/Azure) │ │
│ └──────────┬───────────┘ │
│ │ │
│ ┌──────────▼───────────┐ │
│ │ Providers │ │
│ │ (AWS/GCP/Azure) │ │
│ └──────────┬───────────┘ │
└─────────────────────────┼───────────────┘
│
┌───────────▼────────────┐
│ Cloud Provider API │
│ (AWS/GCP/Azure) │
└────────────────────────┘
Kľúčové koncepty
- Provider — plugin pre konkrétny cloud (AWS, GCP, Azure, aj Helm, Kubernetes, SQL...)
- Managed Resource (MR) — 1:1 mapovanie na cloudový zdroj (RDS instance, S3 bucket)
- Composite Resource (XR) — abstrakcia nad viacerými MR
- Composition — šablóna, ako sa XR transformuje na MR
- Claim (XRC) — namespace-scoped request od vývojára
Inštalácia a základný setup
# Inštalácia Crossplane cez Helm
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm install crossplane crossplane-stable/crossplane \
--namespace crossplane-system \
--create-namespace
# Inštalácia AWS providera
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-s3
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1.14.0
EOF
# Konfigurácia credentials
kubectl create secret generic aws-creds \
-n crossplane-system \
--from-file=credentials=$HOME/.aws/credentials
cat <<EOF | kubectl apply -f -
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-creds
key: credentials
EOF
Managed Resources — priame cloudové zdroje
# S3 Bucket ako Kubernetes resource
apiVersion: s3.aws.upbound.io/v1beta2
kind: Bucket
metadata:
name: my-app-data
spec:
forProvider:
region: eu-central-1
tags:
Environment: production
ManagedBy: crossplane
providerConfigRef:
name: default
kubectl apply -f bucket.yaml
kubectl get bucket my-app-data
# NAME READY SYNCED EXTERNAL-NAME AGE
# my-app-data True True my-app-data 2m
Compositions — platforma pre vývojárov
Tu je hlavná sila Crossplane. Platformový tím definuje CompositeResourceDefinition (XRD) a Composition, vývojári používajú jednoduché Claims.
1. CompositeResourceDefinition
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
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
size:
type: string
enum: [small, medium, large]
description: "Veľkosť databázy"
engine:
type: string
enum: [postgres, mysql]
default: postgres
version:
type: string
default: "15"
required:
- size
2. Composition
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: database-aws
labels:
provider: aws
spec:
compositeTypeRef:
apiVersion: platform.example.com/v1alpha1
kind: XDatabase
resources:
- name: rds-instance
base:
apiVersion: rds.aws.upbound.io/v1beta2
kind: Instance
spec:
forProvider:
region: eu-central-1
engine: postgres
publiclyAccessible: false
skipFinalSnapshot: true
dbSubnetGroupName: main
vpcSecurityGroupIdRefs:
- name: db-sg
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.engine
toFieldPath: spec.forProvider.engine
- type: FromCompositeFieldPath
fromFieldPath: spec.version
toFieldPath: spec.forProvider.engineVersion
- type: FromCompositeFieldPath
fromFieldPath: spec.size
toFieldPath: spec.forProvider.instanceClass
transforms:
- type: map
map:
small: db.t3.micro
medium: db.r6g.large
large: db.r6g.2xlarge
- name: db-secret
base:
apiVersion: secretstores.crossplane.io/v1alpha1
kind: StoreConfig
spec:
type: Kubernetes
3. Claim — čo používa vývojár
# Toto je všetko, čo vývojár potrebuje napísať
apiVersion: platform.example.com/v1alpha1
kind: Database
metadata:
name: orders-db
namespace: orders-team
spec:
size: medium
engine: postgres
version: "16"
Drift detection a reconciliation
Na rozdiel od Terraform, Crossplane kontinuálne kontroluje stav:
# Niekto manuálne zmenil niečo v AWS konzole
# Crossplane to deteguje a opraví
kubectl describe bucket my-app-data
# Events:
# Type Reason Age Message
# Normal ExternalObservation 10s Drift detected
# Normal ExternalUpdate 5s Successfully updated managed resource
Polling interval je konfigurovateľný:
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-s3
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1.14.0
runtimeConfigRef:
name: default
---
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: default
spec:
deploymentTemplate:
spec:
selector: {}
template:
spec:
containers:
- name: package-runtime
args:
- --poll=5m # Kontrola každých 5 minút
Integrácia s GitOps
Crossplane a ArgoCD/FluxCD je ideálna kombinácia:
# ArgoCD Application pre infraštruktúru
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: infrastructure
namespace: argocd
spec:
project: platform
source:
repoURL: https://github.com/myorg/infrastructure
path: crossplane/claims/production
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
Workflow:
- Vývojár vytvorí PR s
Databaseclaim - Review od platformového tímu
- Merge → ArgoCD sync → Crossplane vytvorí RDS
- Crossplane kontinuálne reconciluje
Monitoring a troubleshooting
# Stav všetkých managed resources
kubectl get managed
# Detail konkrétneho resource
kubectl describe instance orders-db-rds
# Crossplane logy
kubectl logs -n crossplane-system deploy/crossplane -f
# Provider logy
kubectl logs -n crossplane-system \
$(kubectl get pods -n crossplane-system -l pkg.crossplane.io/revision -o name | head -1) -f
# Stav composites
kubectl get composite
kubectl describe xdatabase orders-db
Bežné problémy
| Symptóm | Príčina | Riešenie |
|---|---|---|
SYNCED=False |
Provider credentials | Overte ProviderConfig a Secret |
READY=False, SYNCED=True |
Cloud resource sa vytvára | Počkajte (RDS trvá 5-10 min) |
Claim Pending |
Chýba Composition | Skontrolujte compositionSelector |
| Drift loop | Externý controller mení resource | Nastavte management policy |
Best practices
- Family providers — používajte granulárne providery (
provider-aws-s3, nie monolitickýprovider-aws) - Composition Functions — pre komplexnú logiku namiesto mega-YAML
- ProviderConfig per team — rôzne AWS účty/role pre rôzne tímy
- Usage resources — zabráňte deletion ak resource používajú iné resources
- Observe-only — importujte existujúcu infraštruktúru bez prevzatia správy
- Resource limits — nastavte CPU/memory pre provider pods
- Testujte Compositions —
crossplane beta renderpre lokálne testovanie
Kedy (ne)použiť Crossplane
Crossplane je ideálny keď:
- Máte Kubernetes-centric infraštruktúru
- Chcete self-service platformu pre vývojárov
- Potrebujete kontinuálny drift detection
- Používate GitOps workflow
Terraform je lepšia voľba keď:
- Nemáte Kubernetes klaster
- Potrebujete one-shot provisioning
- Tím je zbehlý v HCL
- Spravujete infraštruktúru mimo cloud (on-premise hardware)
Zhrnutie
Crossplane posúva Infrastructure as Code do Kubernetes-natívneho sveta. Kombinácia deklaratívnych CRDs, kontinuálnej reconciliation a abstrakčných vrstiev (Compositions/Claims) z neho robí silný nástroj pre platformové tímy, ktoré chcú ponúknuť self-service infraštruktúru bez straty kontroly. S integráciou do GitOps workflow získate plne automatizovaný, auditovateľný a verzionovaný management cloudovej infraštruktúry.