DeploymentRuntimeConfig
O DeploymentRuntimeConfig é um recurso fundamental que permite personalizar completamente como os providers do Crossplane são executados em seu cluster. Ele oferece controle granular sobre aspectos de deployment, recursos computacionais, segurança e integração com a infraestrutura do Kubernetes.
Esse é um assunto que muitas vezes passa despercebido quando falamos de providers, mas é essencial para ambientes de produção.
Finalidade e Casos de Uso
-
Controle de Recursos
- Definir limites e requests de CPU/memória específicos para cada provider
- Configurar diferentes perfis de recursos (development vs production)
- Otimizar performance baseada no workload específico de cada provider
-
Configurações de Segurança
- Aplicar SecurityContexts personalizados
- Configurar Service Accounts específicos para providers
- Definir políticas de rede e isolamento de workloads
- Implementar Pod Identity e Workload Identity para autenticação com serviços de nuvem
- Configurar IRSA (IAM Roles for Service Accounts) no AWS EKS
- Utilizar Azure AD Workload Identity
-
Personalização de Deployment
- Modificar estratégias de deployment (RollingUpdate, Recreate)
- Configurar affinity/anti-affinity rules para placement inteligente
- Aplicar tolerations para execução em nodes específicos
E temos muitas outras utilidades!
Estrutura e Configuração
A estrutura é muito simples inicialmente, mas bastante verbosa. As três principais seções são:
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: provider-aws-config
spec:
deploymentTemplate: {} # Personaliza como o pod do provider é executado (recursos, volumes, etc)
serviceAccountTemplate: {} # Define a service account que o provider usará para autenticação
serviceTemplate: {} # Configura o service que expõe métricas e endpoints do provider
Propósito das Principais Chaves
deploymentTemplate
- Controla aspectos do Deployment/Pod do provider (CPU, memória, volumes, nodeSelector, etc.)
- Usado para 90% dos casos de personalização
- Permite configurar tudo que você faria em um Deployment normal do Kubernetes
serviceAccountTemplate
- Cria/configura automaticamente a ServiceAccount para o provider
- Essencial para Pod Identity, IRSA, e Workload Identity
- Evita ter que criar ServiceAccounts manualmente
serviceTemplate
- Configura o Service que expõe métricas do provider
- Útil para monitoramento e debugging
- Menos usado que os outros dois templates
Um 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"
Aplicação nos Providers
Para aplicar um DeploymentRuntimeConfig a um provider, você referencia-o na instalação:
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 e Anti-Affinity
Configure onde os providers devem ou não devem ser executados:
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 e ConfigMaps
Monte configurações específicas nos 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 e Workload Identity
Configure autenticação sem credenciais usando identidades gerenciadas:
AWS EKS com 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 com 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 com 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 com 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 com 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 com 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]"
Limitação Importante: Cenários Multi-Account
Os exemplos acima funcionam apenas para uma account/subscription/project por provider. Para cenários multi-account/multi-tenant, você precisa de abordagens diferentes:
Abordagem 1: Múltiplos Providers com 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 Produção
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 Desenvolvimento
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"
Abordagem 2: Cross-Account Roles com ProviderConfigs
Para uma solução mais escalável, use um provider único com múltiplos 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 suporta 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"
Abordagem 3: Multi-Tenant com External Secrets
Para cenários complexos, combine com 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
- Cenário Simples (1-3 accounts) Use Múltiplos providers com RuntimeConfigs específicos
- Cenário Médio (4-10 accounts) Use Cross-account roles com ProviderConfigs
- Cenário Enterprise (10+ accounts) Use Multi-tenant com External Secrets + automação
Ainda é possível criar um provider com uma configuração genérica que atende todos os cenários, mas personalizar o ProviderConfig com um XRD. Veremos essa abordagem mais pra frente.
O DeploymentRuntimeConfig é uma ferramenta poderosa para otimizar e personalizar a execução dos providers do Crossplane, permitindo que você adapte o comportamento da plataforma às necessidades específicas de sua organização e infraestrutura.