mirror of
https://github.com/optim-enterprises-bv/homelab.git
synced 2025-11-01 18:37:52 +00:00
feat(LoadBalancer): Adding MetalLB
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
kubespray
|
kubespray
|
||||||
Argo autopilot
|
Argo autopilot
|
||||||
|
|
||||||
Cilium
|
CNI: Cilium
|
||||||
|
LoadBalancer: MetalLB
|
||||||
Traefik
|
Traefik
|
||||||
cert-manager?
|
cert-manager?
|
||||||
ArgoCD
|
ArgoCD
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -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
34
crd.yaml
Normal 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
|
||||||
@@ -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
6
helm/metallb-values.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
configInline:
|
||||||
|
address-pools:
|
||||||
|
- name: default
|
||||||
|
protocol: layer2
|
||||||
|
addresses:
|
||||||
|
- 192.168.1.240-192.168.1.250
|
||||||
186
main.tf
186
main.tf
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user