From d0543cabedc200c8c5aaf8e82fd5fea0815cc04a Mon Sep 17 00:00:00 2001 From: Dalton Hubble Date: Fri, 14 Jan 2022 09:59:11 -0800 Subject: [PATCH] Add experimental Flatcar Linux arm64 support on AWS * Add `arch` variable to Flatcar Linux AWS `kubernetes` and `workers` modules. Accept `amd64` (default) or `arm64` to support native arm64/aarch64 clusters or mixed/hybrid clusters with arm64 workers * Requires `flannel` or `cilium` CNI Similar to https://github.com/poseidon/typhoon/pull/875 --- CHANGES.md | 9 +++++++ README.md | 4 ++++ aws/flatcar-linux/kubernetes/ami.tf | 24 ++++++++++++++++++- aws/flatcar-linux/kubernetes/variables.tf | 11 +++++++++ aws/flatcar-linux/kubernetes/workers.tf | 1 + aws/flatcar-linux/kubernetes/workers/ami.tf | 23 +++++++++++++++++- .../kubernetes/workers/variables.tf | 13 ++++++++++ docs/advanced/arm64.md | 9 +++---- docs/index.md | 4 ++++ 9 files changed, 90 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 054b7b158..44ec97ade 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,15 @@ Notable changes between versions. * Switch Kubernetes Container Runtime from `docker` to `containerd` ([#1101](https://github.com/poseidon/typhoon/pull/1101)) +### Flatcar Linux + +#### AWS + +* Add experimental Flatcar Linux ARM64 support + * Add `arch` variable to AWS `kubernetes` and `workers` modules + * Allow arm64 full-cluster or mixed/hybrid cluster with arm64 workers + * Requires `flannel` or `cilium` CNI provider + ## v1.23.1 * Kubernetes [v1.23.1](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md#v1231) diff --git a/README.md b/README.md index a674c4bea..7fd066e37 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,10 @@ Typhoon is available for [Flatcar Linux](https://www.flatcar-linux.org/releases/ | DigitalOcean | Flatcar Linux | [digital-ocean/flatcar-linux/kubernetes](digital-ocean/flatcar-linux/kubernetes) | beta | | Google Cloud | Flatcar Linux | [google-cloud/flatcar-linux/kubernetes](google-cloud/flatcar-linux/kubernetes) | beta | +| Platform | Operating System | Terraform Module | Status | +|---------------|------------------|------------------|--------| +| AWS | Flatcar Linux (ARM64) | [aws/flatcar-linux/kubernetes](aws/flatcar-linux/kubernetes) | alpha | + ## Documentation * [Docs](https://typhoon.psdn.io) diff --git a/aws/flatcar-linux/kubernetes/ami.tf b/aws/flatcar-linux/kubernetes/ami.tf index 6e28a661f..43eb9f592 100644 --- a/aws/flatcar-linux/kubernetes/ami.tf +++ b/aws/flatcar-linux/kubernetes/ami.tf @@ -1,7 +1,7 @@ locals { # Pick a Flatcar Linux AMI # flatcar-stable -> Flatcar Linux AMI - ami_id = data.aws_ami.flatcar.image_id + ami_id = var.arch == "arm64" ? data.aws_ami.flatcar-arm64[0].image_id : data.aws_ami.flatcar.image_id channel = split("-", var.os_image)[1] } @@ -25,3 +25,25 @@ data "aws_ami" "flatcar" { } } +data "aws_ami" "flatcar-arm64" { + count = var.arch == "arm64" ? 1 : 0 + + most_recent = true + owners = ["075585003325"] + + filter { + name = "architecture" + values = ["arm64"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } + + filter { + name = "name" + values = ["Flatcar-${local.channel}-*"] + } +} + diff --git a/aws/flatcar-linux/kubernetes/variables.tf b/aws/flatcar-linux/kubernetes/variables.tf index 94a861738..10d5ed5e1 100644 --- a/aws/flatcar-linux/kubernetes/variables.tf +++ b/aws/flatcar-linux/kubernetes/variables.tf @@ -160,6 +160,17 @@ variable "cluster_domain_suffix" { default = "cluster.local" } +variable "arch" { + type = string + description = "Container architecture (amd64 or arm64)" + default = "amd64" + + validation { + condition = var.arch == "amd64" || var.arch == "arm64" + error_message = "The arch must be amd64 or arm64." + } +} + variable "daemonset_tolerations" { type = list(string) description = "List of additional taint keys kube-system DaemonSets should tolerate (e.g. ['custom-role', 'gpu-role'])" diff --git a/aws/flatcar-linux/kubernetes/workers.tf b/aws/flatcar-linux/kubernetes/workers.tf index e8b57e620..64a46cab9 100644 --- a/aws/flatcar-linux/kubernetes/workers.tf +++ b/aws/flatcar-linux/kubernetes/workers.tf @@ -9,6 +9,7 @@ module "workers" { worker_count = var.worker_count instance_type = var.worker_type os_image = var.os_image + arch = var.arch disk_size = var.disk_size spot_price = var.worker_price target_groups = var.worker_target_groups diff --git a/aws/flatcar-linux/kubernetes/workers/ami.tf b/aws/flatcar-linux/kubernetes/workers/ami.tf index 6e28a661f..e60dc97e0 100644 --- a/aws/flatcar-linux/kubernetes/workers/ami.tf +++ b/aws/flatcar-linux/kubernetes/workers/ami.tf @@ -1,7 +1,7 @@ locals { # Pick a Flatcar Linux AMI # flatcar-stable -> Flatcar Linux AMI - ami_id = data.aws_ami.flatcar.image_id + ami_id = var.arch == "arm64" ? data.aws_ami.flatcar-arm64[0].image_id : data.aws_ami.flatcar.image_id channel = split("-", var.os_image)[1] } @@ -25,3 +25,24 @@ data "aws_ami" "flatcar" { } } +data "aws_ami" "flatcar-arm64" { + count = var.arch == "arm64" ? 1 : 0 + + most_recent = true + owners = ["075585003325"] + + filter { + name = "architecture" + values = ["arm64"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } + + filter { + name = "name" + values = ["Flatcar-${local.channel}-*"] + } +} diff --git a/aws/flatcar-linux/kubernetes/workers/variables.tf b/aws/flatcar-linux/kubernetes/workers/variables.tf index b31332bee..26bd2c1de 100644 --- a/aws/flatcar-linux/kubernetes/workers/variables.tf +++ b/aws/flatcar-linux/kubernetes/workers/variables.tf @@ -119,3 +119,16 @@ variable "node_taints" { description = "List of initial node taints" default = [] } + +# unofficial, undocumented, unsupported + +variable "arch" { + type = string + description = "Container architecture (amd64 or arm64)" + default = "amd64" + + validation { + condition = var.arch == "amd64" || var.arch == "arm64" + error_message = "The arch must be amd64 or arm64." + } +} diff --git a/docs/advanced/arm64.md b/docs/advanced/arm64.md index 5908cd6b3..e1284933d 100644 --- a/docs/advanced/arm64.md +++ b/docs/advanced/arm64.md @@ -1,12 +1,9 @@ # ARM64 -!!! warning - ARM64 support is experimental - -Typhoon has experimental support for ARM64 with Fedora CoreOS on AWS. Full clusters can be created with ARM64 controller and worker nodes. Or worker pools of ARM64 nodes can be attached to an AMD64 cluster to create a hybrid/mixed architecture cluster. +Typhoon has experimental support for ARM64 on AWS, with Fedora CoreOS or Flatcar Linux. Clusters can be created with ARM64 controller and worker nodes. Or worker pools of ARM64 nodes can be attached to an AMD64 cluster to create a hybrid/mixed architecture cluster. !!! note - Currently, CNI networking must be set to flannel or Cilium. + Currently, CNI networking must be set to `flannel` or `cilium`. ## Cluster @@ -35,7 +32,7 @@ module "gravitas" { } ``` -Verify the cluster has only arm64 (`aarch64`) nodes. +Verify the cluster has only arm64 (`aarch64`) nodes. For Flatcar Linux, describe nodes. ``` $ kubectl get nodes -o wide diff --git a/docs/index.md b/docs/index.md index cebaa6ea7..81f9895c3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -45,6 +45,10 @@ Typhoon is available for [Flatcar Linux](https://www.flatcar-linux.org/releases/ | DigitalOcean | Flatcar Linux | [digital-ocean/flatcar-linux/kubernetes](flatcar-linux/digitalocean.md) | beta | | Google Cloud | Flatcar Linux | [google-cloud/flatcar-linux/kubernetes](flatcar-linux/google-cloud.md) | beta | +| Platform | Operating System | Terraform Module | Status | +|---------------|------------------|------------------|--------| +| AWS | Flatcar Linux (ARM64) | [aws/flatcar-linux/kubernetes](advanced/arm64.md) | alpha | + ## Documentation * Architecture [concepts](architecture/concepts.md) and [operating-systems](architecture/operating-systems.md)