├── .github └── workflows │ ├── commitsar.yaml │ └── release-please.yml ├── .gitignore ├── CHANGELOG.md ├── README.md ├── kubeconfig.sh ├── main.tf ├── modules └── worker_group │ ├── main.tf │ ├── variables.tf │ └── versions.tf ├── outputs.tf ├── variables.tf └── versions.tf /.github/workflows/commitsar.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "Linters" 3 | 4 | on: ["pull_request"] 5 | 6 | jobs: 7 | validate-commits: 8 | runs-on: "ubuntu-latest" 9 | steps: 10 | - name: "Check out code into the Go module directory" 11 | uses: "actions/checkout@v1" 12 | - name: "Commitsar check" 13 | uses: "docker://aevea/commitsar" 14 | -------------------------------------------------------------------------------- /.github/workflows/release-please.yml: -------------------------------------------------------------------------------- 1 | --- 2 | on: 3 | push: 4 | branches: 5 | - "master" 6 | 7 | name: "release-please" 8 | 9 | jobs: 10 | release-please: 11 | runs-on: "ubuntu-latest" 12 | steps: 13 | - uses: "GoogleCloudPlatform/release-please-action@v2" 14 | with: 15 | release-type: "terraform-module" 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .terraform/ 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ### [1.0.1](https://www.github.com/camptocamp/terraform-docker-k3s/compare/v1.0.0...v1.0.1) (2021-08-25) 4 | 5 | 6 | ### Bug Fixes 7 | 8 | * set worker_groups type ([4a384f0](https://www.github.com/camptocamp/terraform-docker-k3s/commit/4a384f0a2805fadfb4450d94c434cb767037c193)) 9 | 10 | ## [1.0.0](https://www.github.com/camptocamp/terraform-docker-k3s/compare/v0.11.1...v1.0.0) (2021-08-24) 11 | 12 | 13 | ### ⚠ BREAKING CHANGES 14 | 15 | * allow to have multiple worker groups 16 | 17 | ### Features 18 | 19 | * allow to have multiple worker groups ([b9bd484](https://www.github.com/camptocamp/terraform-docker-k3s/commit/b9bd484d2589c3a4c33e6ac7896d9cc73b536fe8)) 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # terraform-docker-k3s 2 | 3 | A terraform module to create a K3s cluster on Docker. Available through the [Terraform registry](https://registry.terraform.io/modules/camptocamp/k3s/docker). 4 | Inspired by and adapted from [this docker composition](https://github.com/k3s-io/k3s/blob/master/docker-compose.yml). 5 | -------------------------------------------------------------------------------- /kubeconfig.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | eval "$(jq -r '@sh "CONTAINER_NAME=\(.container_name) CONTAINER_IP_ADDRESS=\(.container_ip_address)"')" 6 | 7 | kubeconfig=$(docker exec "$CONTAINER_NAME" sed -e "s/127.0.0.1/$CONTAINER_IP_ADDRESS/" /etc/rancher/k3s/k3s.yaml) 8 | 9 | jq -n --arg kubeconfig "$kubeconfig" '{"kubeconfig":$kubeconfig}' 10 | -------------------------------------------------------------------------------- /main.tf: -------------------------------------------------------------------------------- 1 | locals { 2 | network_name = var.network_name == null ? docker_network.k3s.0.name : var.network_name 3 | cluster_endpoint = coalesce(var.cluster_endpoint, docker_container.k3s_server.ip_address) 4 | server_config = var.cluster_endpoint == null ? var.server_config : concat(["--tls-san", var.cluster_endpoint], var.server_config) 5 | } 6 | 7 | # Mimics https://github.com/rancher/k3s/blob/master/docker-compose.yml 8 | resource "docker_volume" "k3s_server" { 9 | name = "k3s-server-${var.cluster_name}" 10 | } 11 | 12 | resource "docker_network" "k3s" { 13 | count = var.network_name == null ? 1 : 0 14 | 15 | name = "k3s-${var.cluster_name}" 16 | } 17 | 18 | resource "docker_image" "registry" { 19 | name = "registry:2" 20 | keep_locally = true 21 | } 22 | 23 | resource "docker_container" "registry_mirror" { 24 | for_each = var.registry_mirrors 25 | 26 | image = docker_image.registry.latest 27 | name = format("registry-%s-%s", replace(each.key, ".", "-"), var.cluster_name) 28 | 29 | restart = var.restart 30 | 31 | networks_advanced { 32 | name = local.network_name 33 | } 34 | 35 | env = each.value 36 | 37 | mounts { 38 | target = "/var/lib/registry" 39 | source = "registry" 40 | type = "volume" 41 | } 42 | } 43 | 44 | resource "local_file" "registries_yaml" { 45 | content = <