From f8082570a2dbad6360f3f244fda400169ad27fdd Mon Sep 17 00:00:00 2001 From: Vegard Hagen Date: Sun, 29 May 2022 11:21:49 +0200 Subject: [PATCH] feat(cni): Using Terraform to provide Cilium as a CNI using Helm --- COMPONENTS.md | 4 +- README.md | 64 +++++++++++++++++++++++++- RESOURCES.md | 5 ++- main.tf | 122 +++++++++++++++++++++++++++++--------------------- 4 files changed, 140 insertions(+), 55 deletions(-) diff --git a/COMPONENTS.md b/COMPONENTS.md index 7d61bbe..90f7579 100644 --- a/COMPONENTS.md +++ b/COMPONENTS.md @@ -1,8 +1,10 @@ kubespray Argo autopilot +Cilium Traefik cert-manager? ArgoCD Prometheus -Grafana \ No newline at end of file +Grafana + diff --git a/README.md b/README.md index cb91172..f04c2a0 100644 --- a/README.md +++ b/README.md @@ -1 +1,63 @@ -A Terraform script to provision a Kubernetes Cluster with stuff \ No newline at end of file +A Terraform script to provision a Kubernetes Cluster with stuff + +# Setup cluster with kubeadm + +Disable swap for kubelet to work properly +```shell +swapoff -a +``` + +```shell +sudo apt-get update +sudo apt-get install -y apt-transport-https ca-certificates curl + +sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg + +echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list + +sudo apt-get update +sudo apt-get install -y containerd conntrack socat kubelet kubeadm kubectl +``` + +cri-ctl: https://github.com/kubernetes-sigs/cri-tools +nerdctl? + +```shell +sudo kubeadm init +``` + +## Set up kubectl +https://kubernetes.io/docs/tasks/tools/ + +```shell +mkdir -p $HOME/.kube +sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config +sudo chown $(id -u):$(id -g) $HOME/.kube/config +``` + +## Install CNI +We choose Cilium +https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/ + +```shell +helm repo add cilium https://helm.cilium.io/ +helm install cilium cilium/cilium --version 1.11.5 --namespace kube-system +``` + +## (Optional) Remove taint for single node use +```shell +kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master- +``` + +## Deploy using Terraform +https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started +```shell +terraform plan +terraform apply +``` + +## Cleanup +```shell +kubectl drain --delete-emptydir-data --force --ignore-daemonsets +kubeadm reset +``` \ No newline at end of file diff --git a/RESOURCES.md b/RESOURCES.md index 1ea0ae6..1d0f822 100644 --- a/RESOURCES.md +++ b/RESOURCES.md @@ -1 +1,4 @@ -https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started \ No newline at end of file + +https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ + +https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started diff --git a/main.tf b/main.tf index 18ed09b..0048e3e 100644 --- a/main.tf +++ b/main.tf @@ -6,58 +6,76 @@ terraform { } } } -provider "kubernetes" { - config_path = "~/.kube/config" -} -resource "kubernetes_namespace" "test" { - metadata { - name = "nginx" + +#provider "kubernetes" { +# config_path = "~/.kube/config" +#} + +provider "helm" { + kubernetes { + config_path = "~/.kube/config" } } -resource "kubernetes_deployment" "test" { - metadata { - name = "nginx" - namespace = kubernetes_namespace.test.metadata.0.name - } - spec { - replicas = 2 - selector { - match_labels = { - app = "MyTestApp" - } - } - template { - metadata { - labels = { - app = "MyTestApp" - } - } - spec { - container { - image = "nginx" - name = "nginx-container" - port { - container_port = 80 - } - } - } - } - } + +resource "helm_release" "cilium" { + name = "cilium-cni" + + repository = "https://helm.cilium.io/" + chart = "cilium/cilium" + namespace = "kube-system" + version = "1.11.5" + } -resource "kubernetes_service" "test" { - metadata { - name = "nginx" - namespace = kubernetes_namespace.test.metadata.0.name - } - spec { - selector = { - app = kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app - } - type = "NodePort" - port { - node_port = 30201 - port = 80 - target_port = 80 - } - } -} \ No newline at end of file + +#resource "kubernetes_namespace" "test" { +# metadata { +# name = "nginx" +# } +#} +#resource "kubernetes_deployment" "test" { +# metadata { +# name = "nginx" +# namespace = kubernetes_namespace.test.metadata.0.name +# } +# spec { +# replicas = 2 +# selector { +# match_labels = { +# app = "MyTestApp" +# } +# } +# template { +# metadata { +# labels = { +# app = "MyTestApp" +# } +# } +# spec { +# container { +# image = "nginx" +# name = "nginx-container" +# port { +# container_port = 80 +# } +# } +# } +# } +# } +#} +#resource "kubernetes_service" "test" { +# metadata { +# name = "nginx" +# namespace = kubernetes_namespace.test.metadata.0.name +# } +# spec { +# selector = { +# app = kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app +# } +# type = "NodePort" +# port { +# node_port = 30201 +# port = 80 +# target_port = 80 +# } +# } +#} \ No newline at end of file