Microk8s cluster installálása proxmoxra, vagy fizikai gépre
Miért proxmox? Mert nincs erre a célra fizikai géped , vagy csak ki szeretnéd próbálni a clustert.
Miért fizikai gép? A microk8s “production ready” , éles üzemre alkalmas. A többi a hardvereden múlik.
Kiindulás: Proxmox, 3 db VM-mel, min 4 GB Ram VM-enként,valamint 1 db VM pfsense-nek 1 GB rammal.
vmbr0: ide csatlakozik a pfsenese WAN , ezt látja a külvilág. Ebben van a fizikai ethernet kártya
vmbr1: ide csatlakozok a pfsense LAN és szintén, ebbe jön a 3 db microk8s VM network interfésze,
vmbr1 a külvilággal nem érintkezik.
A 3 db VM -en (hostnevük: as201,as202,as203) installált ubuntu 22.04LTS az alábbi 3 fix ip-vel,
IP címek:
pfsense WAN : 192.168.4.4 (vagy publikus ip)
pfsense LAN : 192.168.1.1
microk8s VM-ek (3 db)
as201 : 192.168.1.201
as202 : 192.168.1.202
as203 : 192.168.1.203
gateway: 192.168.1.1 (pfsense LAN IP-je )
A pfsense fog NAT-olni a 3 VM-nek.
1. pfsense installálásához egy link:
https://i12bretro.github.io/tutorials/0689.html
Ha kész a pfsense installálása , be kell lépni az admin felületére, de ez default beállításokkal nem lehetséges, mert kívülről csak a WAN interface látszik, csapdahelyzet, WAN felől nem enged bejelentkezni, a LAN meg belül van, nem látjuk. Be kell állítani , hogy be lehessen lépni WAN oldalról, Proxmox dashboardban meg kell nyitni a pfsense vm konzolját, majd:
- 8. pont megadása a terminál ablakban -> Shell. Ezután kikapcsoljuk a packetfilter kezelést : pfctl -d. A legvégén ne felejtsd el visszakapcsolni, mert enélkül nem működik a pfsense.
- Proxmox dashboardban meg kell nyitni a pfsense vm konzolját, 2 es menüpont , beállítani fixre a WAN és a LAN portot:
WAN: (ez lehet publikus, vagy a helyi háló egy címe) : 192.168.4.4 - LAN: 192.168.1.1 (ez lesz a microk8s VM ek gateway-e.)
- Beléphetünk a pfsense adminjába http://192.168.4.4 user : admin / default jelszó : pfsense
Ha a WAN privát ip-t kapott engedélyezni kell , hogy a privát ip-ket ne blokkolja pfsense
5 Pfsenese beállítása, tűzfalszabályok megadása:
Webgui átállítása 80 portról 89-re, fontos! webgui redirect kipipálása, enélkül megmaradna a 80 -as porton is.
Ez egy iyen pfsense sajátosság, hogy ne tudd magad kizárni véletlenül.
Ezután a pfsense elérése: http://192.168.4.4:89 lesz.
Pfsense NAT szabályok:
– microk8s gépek(as201,as202,as203) elérése ssh-n keresztül,
– as201 elérése ftp-n (ez nem feltétlenül kell , én beállítottam magamnak)
– és egy új szabály ami a később beállításra kerülő metallb load balancer “lebegő ip”-jéhez
tartozik (most éppen 192.168.1.220)
A NAT-hoz tartozó tűzfal engedélyek: ( legelső szabály disable, a pfsense-t már a 89-es porton érjük el)
Ha még nem tettük meg, akkor az interfaces->WAn menüpont alatt ezt a két pipát ki kell venni, hogy engedélyezze a wan-on keresztül a privát ip címek áthaladását. Ha publikus IP-d van akkor nem kell.
Host fájlok kiegészítése a mind a három vm-ben:
A 3 vm-ben a host fájlokba be kell írni a VM-ek ip címeit, microk8s cluster nem működik enélkül.
as201 192.168.1.201
as202 192.168.1.202
as203.192.168.1.203
ezt mind a három VM /etc/hosts fájljába be kell írni. Ubuntu reboot után átirkálja néha a resolv.conf-ot , ezért reboot
után ellenőrizni kell , nslookuppal , illetve pinggel a beállításokat. Ha nslookup a hosts fájlnak megfelelően adja vissza az ip-ket illetve ip alapján a host neveket a 3 gépen akkor jöhet a microk8s.
Microk8s installálás:
https://microk8s.io/docs/getting-started
vagy :
SSH-val be kell lépni mind a 3 gépbe : (192.168.4.4 :5901, 192.168.4.4 :5902, 192.168.4.4 :5903)
Mind a 3 gépen az alábbi parancsokat kell kiadni
snap install microk8s --classic
microk8s status --wait-ready
microk8s kubectl version --short
Ezzel van 3darab egy gépes microk8s-ünk, de nincs clusterünk.
Jöhet a clusterbe kapcsolás:
swap kikapcsolása mind a három gépen:
$ swapoff -a
$ free -h
https://microk8s.io/docs/getting-started
vagy:
as201 es gépen (192.168.1.201):
$ microk8s add-node
Ezzel saját magát hozzáadta a clusterhez as201.
jöhet az as202 és as203
az as201 add-node parancs lefutásakor megkapjuk a másik két gép clusterhez csatolásának parancsát tokennel együtt. Ezt le kell futtatni mind a két gépen:
$ microk8s join 192.168.1.201:25000/92b2db237428470dc4...fcfc4ebbd9dc81/2c0cb3284b05
Ha időközben lejár a token azt az as201-es gépen újra lehet kérni:
$ microk8s add-node --token-ttl 360
jöhet az ellenörzés:
$ microk8s kubectl get nodes
NAME STATUS ROLES AGE VERSION
as202 Ready <none> 4d v1.26.1
as203 Ready <none> 4d v1.26.1
as201 Ready <none> 4d3h v1.26.1
A metallb loadbalancer telepítése:
Van egy clusterünk 3 node-dal , NodePorttal már kilátnánk belőle, de jöjjön egy LoadBalancer, a microk8s “beépitett” loadbalancere a Metallb.
Engedélyezzük a metallb-t :
microk8s enable metallb:192.168.1.220-230
A kettőspont utáni ip tartomány a metallb address pool-ja lesz majd.
A telepített/telepíthető addon-ok:
> microk8s status
microk8s is running
high-availability: yes
datastore master nodes: 192.168.1.201:19001 192.168.1.202:19001 192.168.1.203:19001
datastore standby nodes: none
addons:
enabled:
dns # (core) CoreDNS
ha-cluster # (core) Configure high availability on the current node
helm # (core) Helm - the package manager for Kubernetes
helm3 # (core) Helm 3 - the package manager for Kubernetes
ingress # (core) Ingress controller for external access
metallb # (core) Loadbalancer for your Kubernetes cluster
disabled:
cert-manager # (core) Cloud native certificate management
community # (core) The community addons repository
dashboard # (core) The Kubernetes dashboard
gpu # (core) Automatic enablement of Nvidia CUDA
host-access # (core) Allow Pods connecting to Host services smoothly
hostpath-storage # (core) Storage class; allocates storage from host directory
kube-ovn # (core) An advanced network fabric for Kubernetes
mayastor # (core) OpenEBS MayaStor
metrics-server # (core) K8s Metrics Server for API access to service metrics
minio # (core) MinIO object storage
observability # (core) A lightweight observability stack for logs, traces and metrics
prometheus # (core) Prometheus operator for monitoring and logging
rbac # (core) Role-Based Access Control for authorisation
registry # (core) Private image registry exposed on localhost:32000
storage # (core) Alias to hostpath-storage add-on, deprecated
root@as201:~#
Próbáljuk ki a loadbalancer:-t
A loadbalancer “külső ip-je legyen az első az ip pool-jából: 192.168.1.220
Elindítunk 3 podot 3 példányban és 3 service-t , ezek csak a nevükben különböznek: service1, service2, service3
dp1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service1
spec:
replicas: 3
selector:
matchLabels:
app: service1
template:
metadata:
labels:
app: service1
spec:
containers:
- name: service1
image: docker.io/dontrebootme/microbot:v1
#image: dontrebootme/microbot:v1
ports:
- name: http
containerPort: 80
imagePullSecrets:
- name: ghcr-secret
nodeSelector:
kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
name: service1
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: service1
type: ClusterIP
dp2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service2
spec:
replicas: 3
selector:
matchLabels:
app: service2
template:
metadata:
labels:
app: service2
spec:
containers:
- name: service2
#image: dontrebootme/microbot:v1
image: docker.io/dontrebootme/microbot:v1
ports:
- name: http
containerPort: 80
imagePullSecrets:
- name: ghcr-secret
nodeSelector:
kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
name: service2
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: service2
type: ClusterIP
dp3.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service3
spec:
replicas: 3
selector:
matchLabels:
app: service3
template:
metadata:
labels:
app: service3
spec:
containers:
- name: service3
image: docker.io/dontrebootme/microbot:v1
#image: dontrebootme/microbot:v1
ports:
- name: http
containerPort: 80
imagePullSecrets:
- name: ghcr-secret
nodeSelector:
kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
name: service3
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: service2
type: ClusterIP
lb.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress-microk8s
labels:
app: nginx-ingress-microk8s
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
spec:
rules:
- host: valami.local.net
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: valami1.local.net
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
- host: akarmi3.local.net
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service3
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: ingress
namespace: ingress
spec:
selector:
name: nginx-ingress-microk8s
type: LoadBalancer
loadBalancerIP: 192.168.1.220
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
Le kell “futtatni” a 4 yamlt:
mickrok8s.kubectl dp1.yaml
mickrok8s.kubectl dp2.yaml
mickrok8s.kubectl dp3.yaml
mickrok8s.kubectl lb.yaml
Ez a végeredmény:
>microk8s kubectl get all
NAME READY STATUS RESTARTS AGE
pod/service2-c6866c986-9w7fc 1/1 Running 1 (2d2h ago) 3d23h
pod/service3-67b5bd46cf-2zk5m 1/1 Running 1 (2d2h ago) 3d23h
pod/service2-c6866c986-v6skj 1/1 Running 1 (2d2h ago) 3d23h
pod/service3-67b5bd46cf-xg6d4 1/1 Running 1 (2d2h ago) 3d23h
pod/service3-67b5bd46cf-pcn5d 1/1 Running 7 (2d1h ago) 4d3h
pod/service2-c6866c986-w766c 1/1 Running 7 (2d1h ago) 4d3h
pod/service1-7f6b5f8664-p2c2z 1/1 Running 0 44m
pod/service1-7f6b5f8664-9ngbp 1/1 Running 0 44m
pod/service1-7f6b5f8664-6b46w 1/1 Running 0 44m
pod/service1-7f6b5f8664-nc75r 1/1 Running 0 44m
pod/service1-7f6b5f8664-wzsk2 1/1 Running 0 44m
pod/service1-7f6b5f8664-pckd7 1/1 Running 0 44m
pod/service1-7f6b5f8664-qsppl 1/1 Running 0 44m
pod/service1-7f6b5f8664-5cp8d 1/1 Running 0 44m
pod/service1-7f6b5f8664-bxsmx 1/1 Running 0 44m
pod/service1-7f6b5f8664-2bhtz 1/1 Running 0 44m
pod/service1-7f6b5f8664-chw6r 1/1 Running 0 44m
pod/service1-7f6b5f8664-cggwx 1/1 Running 0 44m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 4d6h
service/service1 ClusterIP 10.152.183.38 <none> 80/TCP 4d3h
service/service2 ClusterIP 10.152.183.89 <none> 80/TCP 4d3h
service/service3 ClusterIP 10.152.183.23 <none> 80/TCP 4d3h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/service3 3/3 3 3 4d3h
deployment.apps/service2 3/3 3 3 4d3h
deployment.apps/service1 12/12 12 12 4d3h
NAME DESIRED CURRENT READY AGE
replicaset.apps/service3-67b5bd46cf 3 3 3 4d3h
replicaset.apps/service2-c6866c986 3 3 3 4d3h
replicaset.apps/service1-7f6b5f8664 12 12 12 44m
replicaset.apps/service1-6f98784d45 0 0 0 4d3h
Ha pl. egy laptop böngészőjébe beírjuk a – host: bejegyzés utáni domain valamelyikét , a valami.local.net , valami1.local.net, akarmi.local.net-et, akkor a service1. service2 , service3 pod fog válaszolni, minden egyes böngészőfrissítéskor valamelyik másik pod :
A valami.local.net valami1.local.net és az akarmi.local.net domaineket a tesztelés idejére , a helyi hálón, ha van dns akkor ott, ha nincs akkor a laptop hosts fájljábe be kell jegyezni, hogy érvényes domain legyen. A domain ip-je a loadbalancer ip-je legyen, vagyis amit az lb.yaml fájlban megadtunk:
A hosts fájl:
192.168.1.220 valami.local.net
192.168.1.220 valami1.local.net
192.168.1.220 akarmi.local.net
És ha minden sikerült:
Leave a Reply