feat(LoadBalancer): Adding MetalLB

This commit is contained in:
Vegard Hagen
2022-06-19 16:38:08 +02:00
parent c8561e74c2
commit 5a716387a8
6 changed files with 153 additions and 95 deletions

View File

@@ -1,7 +1,8 @@
kubespray kubespray
Argo autopilot Argo autopilot
Cilium CNI: Cilium
LoadBalancer: MetalLB
Traefik Traefik
cert-manager? cert-manager?
ArgoCD ArgoCD

View File

@@ -35,9 +35,9 @@ cri-ctl: https://github.com/kubernetes-sigs/cri-tools
nerdctl? nerdctl?
We are going to use Cilium kube-proxy We are going to use Cilium kube-proxy (TODO)
```shell ```shell
sudo kubeadm init --skip-phases=addon/kube-proxy sudo kubeadm init --skip-phases=addon/kube-proxy (TODO)
sudo kubeadm init sudo kubeadm init
``` ```
@@ -80,6 +80,12 @@ kubectl -n kube-system get pods --watch
kubectl -n kube-system get pods -l k8s-app=cilium kubectl -n kube-system get pods -l k8s-app=cilium
``` ```
## MetalLB
```shell
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb
```
## Deploy using Terraform ## Deploy using Terraform
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started
```shell ```shell
@@ -87,6 +93,13 @@ terraform plan
terraform apply terraform apply
``` ```
## Traefik IngressRoute CRD
https://doc.traefik.io/traefik/v2.0/routing/providers/kubernetes-crd/
```shell
```
## Cleanup ## Cleanup
```shell ```shell
kubectl drain ratatoskr --delete-emptydir-data --force --ignore-daemonsets kubectl drain ratatoskr --delete-emptydir-data --force --ignore-daemonsets

34
crd.yaml Normal file
View File

@@ -0,0 +1,34 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: ingressroutes.traefik.containo.us
spec:
group: traefik.containo.us
versions:
- name: v1
served: true
storage: true
names:
kind: IngressRoute
plural: ingressroutes
singular: ingressroute
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: ingressroutetcps.traefik.containo.us
spec:
group: traefik.containo.us
versions:
- name: v1
served: true
storage: true
names:
kind: IngressRouteTCP
plural: ingressroutetcps
singular: ingressroutetcp
scope: Namespaced

View File

@@ -7,7 +7,7 @@ spec:
entryPoints: entryPoints:
- web - web
routes: routes:
- match: Host(`traefik.localhost`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`)) - match: Host(`traefik.ratatoskr.myddns.rocks`)
kind: Rule kind: Rule
services: services:
- name: api@internal - name: api@internal

6
helm/metallb-values.yaml Normal file
View File

@@ -0,0 +1,6 @@
configInline:
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250

186
main.tf
View File

@@ -4,7 +4,7 @@ terraform {
source = "hashicorp/kubernetes" source = "hashicorp/kubernetes"
version = ">= 2.0.0" version = ">= 2.0.0"
} }
helm = { helm = {
source = "hashicorp/helm" source = "hashicorp/helm"
version = ">= 2.5.0" version = ">= 2.5.0"
} }
@@ -21,99 +21,103 @@ provider "helm" {
} }
} }
resource "helm_release" "cilium" { #resource "helm_release" "cilium" {
name = "cilium" # name = "cilium"
#
# repository = "https://helm.cilium.io"
# chart = "cilium"
# namespace = "kube-system"
# version = "1.11.5"
#}
repository = "https://helm.cilium.io" resource "kubernetes_namespace" "traefik" {
chart = "cilium" metadata {
namespace = "kube-system" name = "traefik"
version = "1.11.5" }
} }
#resource "kubernetes_namespace" "traefik" { resource "helm_release" "traefik" {
# metadata { name = "traefik"
# name = "traefik"
# }
#}
#resource "helm_release" "traefik" { repository = "https://helm.traefik.io/traefik"
# name = "traefik" chart = "traefik"
# namespace = "traefik"
# repository = "https://helm.traefik.io/traefik" version = "10.20.0"
# chart = "traefik"
# namespace = "traefik"
# version = "10.20.0"
#}
#resource "kubernetes_service" "traefik" { }
# metadata {
# name = "traefik"
# namespace = kubernetes_namespace.traefik.metadata.0.name
# }
# spec {
# selector = {
# app = helm_release.traefik.manifest
# #app = kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app
# }
#
# type = "NodePort"
# port {
# node_port = 9001
# port = 9000
# target_port = 9000
# }
# }
#}
#resource "kubernetes_namespace" "test" { resource "kubernetes_service" "traefik" {
# metadata { metadata {
# name = "nginx" name = "traefik"
# } namespace = kubernetes_namespace.traefik.metadata.0.name
#} }
#resource "kubernetes_deployment" "test" { spec {
# metadata { selector = {
# name = "nginx" # Standard Helm chart label to locate pods
# namespace = kubernetes_namespace.test.metadata.0.name "app.kubernetes.io/name" = helm_release.traefik.name
# } }
# spec {
# replicas = 2 type = "LoadBalancer"
# selector { port {
# match_labels = { protocol = "TCP"
# app = "MyTestApp" port = 80 # External exposed port to reach container
# } target_port = 9000 # Internal exposed port of container
# } }
# template { }
# metadata { }
# labels = {
# app = "MyTestApp" resource "kubernetes_namespace" "test" {
# } metadata {
# } name = "nginx"
# spec { }
# container { }
# image = "nginx"
# name = "nginx-container" resource "kubernetes_deployment" "test" {
# port { metadata {
# container_port = 80 name = "nginx"
# } namespace = kubernetes_namespace.test.metadata.0.name
# } }
# } spec {
# } replicas = 2
# } selector {
#} match_labels = {
#resource "kubernetes_service" "test" { app = "MyTestApp"
# metadata { }
# name = "nginx" }
# namespace = kubernetes_namespace.test.metadata.0.name template {
# } metadata {
# spec { labels = {
# selector = { app = "MyTestApp"
# app = kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app }
# } }
# type = "NodePort" spec {
# port { container {
# node_port = 30201 image = "nginx"
# port = 80 name = "nginx-container"
# target_port = 80 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 = "LoadBalancer"
port {
protocol = "TCP"
port = 80
target_port = 80
}
}
}