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
Argo autopilot
Cilium
CNI: Cilium
LoadBalancer: MetalLB
Traefik
cert-manager?
ArgoCD

View File

@@ -35,9 +35,9 @@ cri-ctl: https://github.com/kubernetes-sigs/cri-tools
nerdctl?
We are going to use Cilium kube-proxy
We are going to use Cilium kube-proxy (TODO)
```shell
sudo kubeadm init --skip-phases=addon/kube-proxy
sudo kubeadm init --skip-phases=addon/kube-proxy (TODO)
sudo kubeadm init
```
@@ -80,6 +80,12 @@ kubectl -n kube-system get pods --watch
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
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/guides/getting-started
```shell
@@ -87,6 +93,13 @@ terraform plan
terraform apply
```
## Traefik IngressRoute CRD
https://doc.traefik.io/traefik/v2.0/routing/providers/kubernetes-crd/
```shell
```
## Cleanup
```shell
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:
- web
routes:
- match: Host(`traefik.localhost`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
- match: Host(`traefik.ratatoskr.myddns.rocks`)
kind: Rule
services:
- 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"
version = ">= 2.0.0"
}
helm = {
helm = {
source = "hashicorp/helm"
version = ">= 2.5.0"
}
@@ -21,99 +21,103 @@ provider "helm" {
}
}
resource "helm_release" "cilium" {
name = "cilium"
#resource "helm_release" "cilium" {
# name = "cilium"
#
# repository = "https://helm.cilium.io"
# chart = "cilium"
# namespace = "kube-system"
# version = "1.11.5"
#}
repository = "https://helm.cilium.io"
chart = "cilium"
namespace = "kube-system"
version = "1.11.5"
resource "kubernetes_namespace" "traefik" {
metadata {
name = "traefik"
}
}
#resource "kubernetes_namespace" "traefik" {
# metadata {
# name = "traefik"
# }
#}
resource "helm_release" "traefik" {
name = "traefik"
#resource "helm_release" "traefik" {
# name = "traefik"
#
# repository = "https://helm.traefik.io/traefik"
# chart = "traefik"
# namespace = "traefik"
# version = "10.20.0"
#}
repository = "https://helm.traefik.io/traefik"
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" {
# 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
# }
# }
#}
resource "kubernetes_service" "traefik" {
metadata {
name = "traefik"
namespace = kubernetes_namespace.traefik.metadata.0.name
}
spec {
selector = {
# Standard Helm chart label to locate pods
"app.kubernetes.io/name" = helm_release.traefik.name
}
type = "LoadBalancer"
port {
protocol = "TCP"
port = 80 # External exposed port to reach container
target_port = 9000 # Internal exposed port of container
}
}
}
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 = "LoadBalancer"
port {
protocol = "TCP"
port = 80
target_port = 80
}
}
}