Skip to content

Cluster API - AWS on ec2 instances#

This example demonstrates how k0smotron can be used with CAPA (Cluster API Provider Amazon Web Services) to deploy a cluster with hosted control plane and workers in AWS.

Prerequisites#

Before starting this example, ensure that you have met the general prerequisites. In addition to those, you should also have appropriate AWS credentials available and the AWS CLI configured on your local machine.

Prepare the AWS infra provider#

Before launching a cluster, it's crucial to set up your infrastructure provider. Each provider has its unique prerequisites and configuration steps.

Follow the AWS Provider installation guide for detailed steps.

Creating a child cluster#

Once all the controllers are up and running, you can apply the cluster manifests containing the specifications of the cluster you want to provision.

AWS limits userdata to 16kb

AWS has a limit of 16kb for userdata. As k0smotron generates certificates and other files it might reach the limit, so you may need to compress it. This can be done by setting AWSMachineTemplate.spec.template.spec.uncompressedUserData to false in the AWSMachineTemplate manifest.

Here is an example:

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: aws-test-cluster
  namespace: default
spec:
  clusterNetwork:
    pods:
      cidrBlocks:
        - 192.168.0.0/16
    serviceDomain: cluster.local
    services:
      cidrBlocks:
        - 10.128.0.0/12
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: K0sControlPlane
    name: aws-test
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
    kind: AWSCluster
    name: k0s-aws-test
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSMachineTemplate
metadata:
  name: k0s-aws-test-mt
  namespace: default
spec:
  template:
    spec:
      uncompressedUserData: false 
      ami:
        # Replace with your AMI ID
        id: ami-0008aa5cb0cde3400 # Ubuntu 20.04 in eu-west-1
      instanceType: t3.large
      publicIP: true
      iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io # Instance Profile created by `clusterawsadm bootstrap iam create-cloudformation-stack`
      cloudInit:
        # Makes CAPA use k0s bootstrap cloud-init directly and not via SSM
        # Simplifies the VPC setup as we do not need custom SSM endpoints etc.
        insecureSkipSecretsManager: true
      sshKeyName: <your-ssh-key-name>
---
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: K0sControlPlane
metadata:
  name: aws-test
spec:
  replicas: 3
  version: v1.30.3+k0s.0
  updateStrategy: Recreate
  k0sConfigSpec:
    args:
      - --enable-worker
    k0s:
      apiVersion: k0s.k0sproject.io/v1beta1
      kind: ClusterConfig
      metadata:
        name: k0s
      spec:
        api:
          extraArgs:
            anonymous-auth: "true"
        telemetry:
          enabled: false
  machineTemplate:
    infrastructureRef:
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
      kind: AWSMachineTemplate
      name: k0s-aws-test-mt
      namespace: default
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSCluster
metadata:
  name: k0s-aws-test
  namespace: default
spec:
  region: eu-west-1
  sshKeyName: <your-ssh-key-name>
  controlPlaneLoadBalancer:
    healthCheckProtocol: TCP
  network:
    additionalControlPlaneIngressRules:
      - description: "k0s controller join API"
        protocol: tcp
        fromPort: 9443
        toPort: 9443
% kubectl get cluster,machine
NAME                                        CLUSTERCLASS   PHASE         AGE   VERSION
cluster.cluster.x-k8s.io/aws-test-cluster                  Provisioned   24h   

NAME                                     CLUSTER            NODENAME        PROVIDERID                              PHASE      AGE    VERSION
machine.cluster.x-k8s.io/aws-test-0      aws-test-cluster   aws-test-0      aws:///eu-west-1c/i-04ea1b27f52210bec   Running    24h    v1.30.3+k0s.0
machine.cluster.x-k8s.io/aws-test-1      aws-test-cluster   aws-test-1      aws:///eu-west-1a/i-0c34ca4e0450acd64   Running    23h    v1.30.3+k0s.0
machine.cluster.x-k8s.io/aws-test-2      aws-test-cluster   aws-test-2      aws:///eu-west-1b/i-0ac2d7fb7ad92dff6   Running    23h    v1.30.3+k0s.0