🔴 Advanced

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 workflowterraform apply je 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 kubectl alebo 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:

  1. Vývojár vytvorí PR s Database claim
  2. Review od platformového tímu
  3. Merge → ArgoCD sync → Crossplane vytvorí RDS
  4. 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

  1. Family providers — používajte granulárne providery (provider-aws-s3, nie monolitický provider-aws)
  2. Composition Functions — pre komplexnú logiku namiesto mega-YAML
  3. ProviderConfig per team — rôzne AWS účty/role pre rôzne tímy
  4. Usage resources — zabráňte deletion ak resource používajú iné resources
  5. Observe-only — importujte existujúcu infraštruktúru bez prevzatia správy
  6. Resource limits — nastavte CPU/memory pre provider pods
  7. Testujte Compositionscrossplane beta render pre 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.