Desafio 2: Pod com RDS usando kro + ACK

Criar um RGD que provisiona um Pod Kubernetes conectado a uma instância RDS PostgreSQL, com as credenciais injetadas automaticamente.

Platform Engineers precisam abstrair a complexidade de conectar aplicações a bancos de dados gerenciados. Com kro + ACK, você pode criar uma API simples que provisiona tanto o banco quanto a aplicação.

  • RDS DBInstance PostgreSQL (db.t3.micro, 20GB)
  • Pod com imagem customizável
  • Variável de ambiente POSTGRES_ENDPOINT injetada automaticamente
  • Parâmetros: applicationName, image, location

Crie um RGD chamado DeploymentAndAWSPostgres que aceite nome da aplicação e imagem Docker, e provisione o banco + pod com conexão configurada.

Dica: Use interpolação ${dbinstance.status.endpoint.address} para injetar o endpoint.

apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: deploymentandawspostgres
spec:
  schema:
    apiVersion: v1alpha1
    kind: DeploymentAndAWSPostgres
    spec:
      applicationName: string
      image: string
      location: string

  resources:
    - id: dbinstance
      template:
        apiVersion: rds.services.k8s.aws/v1alpha1
        kind: DBInstance
        metadata:
          name: ${schema.spec.applicationName}-dbinstance
        spec:
          engine: postgres
          dbInstanceIdentifier: ${schema.spec.applicationName}-dbinstance
          allocatedStorage: 20
          dbInstanceClass: db.t3.micro
          masterUsername: admin
          masterUserPassword:
            name: ${schema.spec.applicationName}-db-secret
            key: password

    - id: pod
      template:
        apiVersion: v1
        kind: Pod
        metadata:
          name: ${schema.spec.applicationName}-pod
        spec:
          containers:
            - name: app
              image: ${schema.spec.image}
              env:
                - name: POSTGRES_ENDPOINT
                  value: ${dbinstance.status.endpoint.address}
                - name: POSTGRES_PORT
                  value: ${dbinstance.status.endpoint.port}
                - name: POSTGRES_USER
                  value: admin
                - name: POSTGRES_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: ${schema.spec.applicationName}-db-secret
                      key: password

Criar secret com senha do banco:

kubectl create secret generic my-app-db-secret \
  --from-literal=password='SuaSenhaSegura123!'
# Aplicar o RGD
kubectl apply -f deployment-postgres.yaml

# Criar aplicação com banco
cat <<EOF | kubectl apply -f -
apiVersion: v1alpha1
kind: DeploymentAndAWSPostgres
metadata:
  name: my-app
spec:
  applicationName: my-app
  image: postgres:15-alpine
  location: us-east-1
EOF

# Verificar recursos criados
kubectl get dbinstance
kubectl get pod my-app-pod

# Ver logs do pod
kubectl logs my-app-pod
  • Cross-resource dependencies: Pod aguarda RDS estar pronto
  • Status interpolation: Endpoint do RDS injetado automaticamente
  • Secret management: Credenciais gerenciadas via Kubernetes Secrets
  • Declarative infrastructure: Tudo definido em YAML
  • Usar Deployment ao invés de Pod
  • Adicionar readiness probe que testa conexão com banco
  • Criar DBSubnetGroup para controlar placement
  • Adicionar backup retention e maintenance window
  • Adicionar connection pooling (RDS Proxy)
  • Implementar read replicas
  • Configurar automated backups