Skip to main content

DeploymentRuntimeConfig

El DeploymentRuntimeConfig es un recurso fundamental que permite personalizar completamente cómo los providers de Crossplane son ejecutados en tu clúster. Ofrece control granular sobre aspectos de deployment, recursos computacionales, seguridad e integración con la infraestructura de Kubernetes.

Este es un asunto que muchas veces pasa desapercibido cuando hablamos de providers, pero es esencial para entornos de producción.

Finalidad y Casos de Uso

  • Control de Recursos

    • Definir límites y requests de CPU/memoria específicos para cada provider
    • Configurar diferentes perfiles de recursos (development vs production)
    • Optimizar performance basada en el workload específico de cada provider
  • Configuraciones de Seguridad

    • Aplicar SecurityContexts personalizados
    • Configurar Service Accounts específicos para providers
    • Definir políticas de red y aislamiento de workloads
    • Implementar Pod Identity y Workload Identity para autenticación con servicios de nube
    • Configurar IRSA (IAM Roles for Service Accounts) en AWS EKS
    • Utilizar Azure AD Workload Identity
  • Personalización de Deployment

    • Modificar estrategias de deployment (RollingUpdate, Recreate)
    • Configurar affinity/anti-affinity rules para placement inteligente
    • Aplicar tolerations para ejecución en nodos específicos

¡Y tenemos muchas otras utilidades!

Estructura y Configuración

La estructura es muy simple inicialmente, pero bastante verbosa. Las tres principales secciones son:

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: provider-aws-config
spec:
deploymentTemplate: {} # Personaliza cómo el pod del provider es ejecutado (recursos, volúmenes, etc)
serviceAccountTemplate: {} # Define la service account que el provider usará para autenticación
serviceTemplate: {} # Configura el service que expone métricas y endpoints del provider

Propósito de las Principales Claves

deploymentTemplate

  • Controla aspectos del Deployment/Pod del provider (CPU, memoria, volúmenes, nodeSelector, etc.)
  • Usado para 90% de los casos de personalización
  • Permite configurar todo lo que harías en un Deployment normal de Kubernetes

serviceAccountTemplate

  • Crea/configura automáticamente la ServiceAccount para el provider
  • Esencial para Pod Identity, IRSA, y Workload Identity
  • Evita tener que crear ServiceAccounts manualmente

serviceTemplate

  • Configura el Service que expone métricas del provider
  • Útil para monitoreo y debugging
  • Menos usado que los otros dos templates

Un DeploymentRuntimeConfig típico permite configurar:

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: provider-aws-config
spec:
deploymentTemplate:
spec:
replicas: 2
template:
spec:
containers:
- name: package-runtime
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
securityContext:
runAsNonRoot: true
runAsUser: 65532
nodeSelector:
workload-type: crossplane
tolerations:
- key: "crossplane-dedicated"
operator: "Equal"
value: "true"
effect: "NoSchedule"

Aplicación en los Providers

Para aplicar un DeploymentRuntimeConfig a un provider, lo referencias en la instalación:

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-s3
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1
runtimeConfigRef:
name: provider-aws-config

Affinity y Anti-Affinity

Configura dónde los providers deben o no deben ser ejecutados:

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: provider-ha-config
spec:
deploymentTemplate:
spec:
template:
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
pkg.crossplane.io/provider: provider-aws
topologyKey: kubernetes.io/hostname

Volume Mounts y ConfigMaps

Monta configuraciones específicas en los providers:

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: provider-custom-config
spec:
deploymentTemplate:
spec:
template:
spec:
containers:
- name: package-runtime
volumeMounts:
- name: custom-config
mountPath: /etc/provider-config
readOnly: true
volumes:
- name: custom-config
configMap:
name: provider-configuration

Pod Identity y Workload Identity

Configura autenticación sin credenciales usando identidades gestionadas:

AWS EKS con IRSA (IAM Roles for Service Accounts)

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: aws-irsa-config
spec:
deploymentTemplate:
spec:
template:
spec:
serviceAccountName: crossplane-provider-aws
containers:
- name: package-runtime
env:
- name: AWS_ROLE_ARN
value: "arn:aws:iam::123456789012:role/crossplane-provider-role"
- name: AWS_WEB_IDENTITY_TOKEN_FILE
value: "/var/run/secrets/eks.amazonaws.com/serviceaccount/token"
volumeMounts:
- name: aws-iam-token
mountPath: "/var/run/secrets/eks.amazonaws.com/serviceaccount"
readOnly: true
volumes:
- name: aws-iam-token
projected:
sources:
- serviceAccountToken:
audience: sts.amazonaws.com
expirationSeconds: 86400
path: token
---
# Service Account con annotations para IRSA
apiVersion: v1
kind: ServiceAccount
metadata:
name: crossplane-provider-aws
namespace: crossplane-system
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789012:role/crossplane-provider-role"

Azure AKS con Workload Identity

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: azure-workload-identity-config
spec:
deploymentTemplate:
spec:
template:
spec:
serviceAccountName: crossplane-provider-azure
containers:
- name: package-runtime
env:
- name: AZURE_CLIENT_ID
value: "12345678-1234-1234-1234-123456789012"
- name: AZURE_TENANT_ID
value: "87654321-4321-4321-4321-210987654321"
- name: AZURE_FEDERATED_TOKEN_FILE
value: "/var/run/secrets/azure/tokens/azure-identity-token"
volumeMounts:
- name: azure-identity-token
mountPath: "/var/run/secrets/azure/tokens"
readOnly: true
volumes:
- name: azure-identity-token
projected:
sources:
- serviceAccountToken:
audience: api://AzureADTokenExchange
expirationSeconds: 3600
path: azure-identity-token
---
# Service Account con labels para Workload Identity
apiVersion: v1
kind: ServiceAccount
metadata:
name: crossplane-provider-azure
namespace: crossplane-system
annotations:
azure.workload.identity/client-id: "12345678-1234-1234-1234-123456789012"
labels:
azure.workload.identity/use: "true"

GCP GKE con Workload Identity

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: gcp-workload-identity-config
spec:
deploymentTemplate:
spec:
template:
spec:
serviceAccountName: crossplane-provider-gcp
containers:
- name: package-runtime
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: "/var/run/secrets/tokens/gcp-ksa/token"
volumeMounts:
- name: gcp-ksa-token
mountPath: "/var/run/secrets/tokens/gcp-ksa"
readOnly: true
volumes:
- name: gcp-ksa-token
projected:
sources:
- serviceAccountToken:
audience: https://gcp.googleapis.com/
expirationSeconds: 3600
path: token
---
# Service Account con annotation para Workload Identity
apiVersion: v1
kind: ServiceAccount
metadata:
name: crossplane-provider-gcp
namespace: crossplane-system
annotations:
iam.gke.io/gcp-service-account: "[email protected]"

Limitación Importante: Escenarios Multi-Account

Los ejemplos arriba funcionan apenas para una account/subscription/project por provider. Para escenarios multi-account/multi-tenant, necesitas enfoques diferentes:

Enfoque 1: Múltiples Providers con DeploymentRuntimeConfigs Específicos

# Provider para AWS Account Production
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-production
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1
runtimeConfigRef:
name: aws-production-config
---
# Provider para AWS Account Development
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-development
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1
runtimeConfigRef:
name: aws-development-config
---
# RuntimeConfig para Producción
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: aws-production-config
spec:
serviceAccountTemplate:
metadata:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789012:role/crossplane-prod-role"
---
# RuntimeConfig para Desarrollo
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: aws-development-config
spec:
serviceAccountTemplate:
metadata:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::987654321098:role/crossplane-dev-role"

Enfoque 2: Cross-Account Roles con ProviderConfigs

Para una solución más escalable, usa un provider único con múltiples ProviderConfigs:

# Provider único
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1
runtimeConfigRef:
name: aws-cross-account-config
---
# RuntimeConfig que soporta assume role
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: aws-cross-account-config
spec:
serviceAccountTemplate:
metadata:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::111111111111:role/crossplane-master-role"
---
# ProviderConfig para Production Account
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: aws-production
spec:
credentials:
source: IRSA
assume_role:
role_arn: "arn:aws:iam::123456789012:role/crossplane-target-role"
session_name: "crossplane-production"
---
# ProviderConfig para Development Account
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: aws-development
spec:
credentials:
source: IRSA
assume_role:
role_arn: "arn:aws:iam::987654321098:role/crossplane-target-role"
session_name: "crossplane-development"

Enfoque 3: Multi-Tenant con External Secrets

Para escenarios complejos, combina con External Secrets Operator:

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: multi-tenant-config
spec:
deploymentTemplate:
spec:
template:
spec:
containers:
- name: package-runtime
volumeMounts:
- name: multi-account-secrets
mountPath: "/etc/crossplane/accounts"
readOnly: true
volumes:
- name: multi-account-secrets
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: crossplane-accounts
  • Escenario Simple (1-3 accounts) Usa Múltiples providers con RuntimeConfigs específicos
  • Escenario Medio (4-10 accounts) Usa Cross-account roles con ProviderConfigs
  • Escenario Enterprise (10+ accounts) Usa Multi-tenant con External Secrets + automatización

Aún es posible crear un provider con una configuración genérica que atiende todos los escenarios, pero personalizar el ProviderConfig con un XRD. Veremos este enfoque más adelante.

El DeploymentRuntimeConfig es una herramienta poderosa para optimizar y personalizar la ejecución de los providers de Crossplane, permitiendo que adaptes el comportamiento de la plataforma a las necesidades específicas de tu organización e infraestructura.