Desafio 1: Networking Stack com kro + ACK

Criar um ResourceGraphDefinition (RGD) do kro que provisiona uma stack completa de networking na AWS usando ACK (AWS Controllers for Kubernetes).

O kro permite criar abstrações de alto nível que orquestram múltiplos recursos AWS. Neste desafio, você criará uma VPC com 3 subnets em diferentes AZs e um Security Group.

  • VPC com CIDR 192.168.0.0/16
  • 3 Subnets públicas em AZs diferentes (us-west-2a, us-west-2b, us-west-2c)
  • Security Group associado à VPC
  • Status exportado com IDs dos recursos criados

Crie um RGD chamado NetworkingStack que aceite um parâmetro name e provisione toda a infraestrutura de rede. O status deve expor os IDs da VPC, subnets e security group.

Dica: Use o ACK EC2 controller com recursos VPC, Subnet e SecurityGroup.

apiVersion: kro.run/v1alpha1
kind: ResourceGraphDefinition
metadata:
  name: networkingstack.kro.run
spec:
  schema:
    apiVersion: v1alpha1
    kind: NetworkingStack
    spec:
      name: string
    status:
      networkingInfo:
        vpcID: ${vpc.status.vpcID}
        subnetAZA: ${subnetAZA.status.subnetID}
        subnetAZB: ${subnetAZB.status.subnetID}
        subnetAZC: ${subnetAZC.status.subnetID}
        securityGroup: ${securityGroup.status.id}
  
  resources:
    - id: vpc
      template:
        apiVersion: ec2.services.k8s.aws/v1alpha1
        kind: VPC
        metadata:
          name: vpc-${schema.spec.name}
        spec:
          cidrBlocks:
            - 192.168.0.0/16
          enableDNSHostnames: false
          enableDNSSupport: true
    
    - id: subnetAZA
      template:
        apiVersion: ec2.services.k8s.aws/v1alpha1
        kind: Subnet
        metadata:
          name: subnet-a-${schema.spec.name}
        spec:
          availabilityZone: us-west-2a
          cidrBlock: 192.168.0.0/18
          vpcID: ${vpc.status.vpcID}
    
    - id: subnetAZB
      template:
        apiVersion: ec2.services.k8s.aws/v1alpha1
        kind: Subnet
        metadata:
          name: subnet-b-${schema.spec.name}
        spec:
          availabilityZone: us-west-2b
          cidrBlock: 192.168.64.0/18
          vpcID: ${vpc.status.vpcID}
    
    - id: subnetAZC
      template:
        apiVersion: ec2.services.k8s.aws/v1alpha1
        kind: Subnet
        metadata:
          name: subnet-c-${schema.spec.name}
        spec:
          availabilityZone: us-west-2c
          cidrBlock: 192.168.128.0/18
          vpcID: ${vpc.status.vpcID}
    
    - id: securityGroup
      template:
        apiVersion: ec2.services.k8s.aws/v1alpha1
        kind: SecurityGroup
        metadata:
          name: cluster-security-group-${schema.spec.name}
        spec:
          vpcID: ${vpc.status.vpcID}
          name: my-sg-${schema.spec.name}
          description: Security group for networking stack
# Aplicar o RGD
kubectl apply -f networking-stack.yaml

# Criar uma instância
cat <<EOF | kubectl apply -f -
apiVersion: v1alpha1
kind: NetworkingStack
metadata:
  name: my-app
spec:
  name: my-app
EOF

# Verificar status
kubectl get networkingstack my-app -o yaml
  • ResourceGraphDefinition: Define uma nova API customizada
  • Schema interpolation: ${vpc.status.vpcID} referência outputs de outros recursos
  • Dependency management: kro gerencia automaticamente a ordem de criação
  • Status propagation: Informações dos recursos AWS são expostas no status
  • Adicionar Internet Gateway e Route Tables
  • Parametrizar CIDRs e AZs
  • Adicionar NAT Gateways para subnets privadas