Microk8s cluster telepítése:

Written in

by

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:

  1. 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.
  2. 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
  3. LAN: 192.168.1.1 (ez lesz a microk8s VM ek gateway-e.)
  4. 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:


Tags

Leave a Reply

Your email address will not be published. Required fields are marked *