Fork me on GitHub

Herr Knedel/Store ting med containere: Kubenetes klynge og NFS-lagring

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Tue, 29 Mar 2022 17:10:02 +0000 Schwierigkeitsgrad: Sehr sportlich

828 Words

I dag installerer jeg en ny Kubenetes-klynge, og der er meget at gøre!

Jeg har bestilt disse komponenter til den:

Lad os komme af sted!

Jeg har lavet mit eget image til installationen baseret på Raspian Lite-installationen. Min bruger/offentlige nøgle er allerede gemt i dette image, og filen “/boot/config.txt” er blevet tilpasset til mine lysdioder.

# meine Server brauchen kein HDMI, WLAN und Bluetooth
dtoverlay=disable-bt
dtoverlay=disable-wifi
disable_splash=1
hdmi_blanking=1
hdmi_ignore_hotplug=1
hdmi_ignore_composite=1
 
 
# Status-LEDs an GPIO weiterleiten
dtoverlay=act-led,gpio=21
dtparam=act_led_trigger=cpu0

Server 1 - Monter disk

Først installerer jeg en NFS-tjeneste på “Server 1”. Denne lagring kan senere bruges til min containerklynge. Jeg tilsluttede USB-harddisken til “Server 1” og formaterede den med EXT4 ved hjælp af disse instruktioner: https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/ Derefter oprettede jeg et monteringspunkt for USB-disken:

x
+
Terminal

$ sudo mkdir /media/usb-platte

Jeg har indtastet det nye filsystem i filen “/etc/fstab” på følgende måde:

/dev/sda1 /media/usb-platte ext4 defaults 0 2

Indstillingen kan kontrolleres med “sudo mount -a”. Nu skal USB-disken monteres under “/media/usb-disk”.

Installer NFS

Denne pakke er nødvendig for NFS:

x
+
Terminal

$ sudo apt-get install nfs-kernel-server -y

Desuden blev der oprettet en ny mappe på USB-disken

x
+
Terminal

$ sudo mkdir /media/usb-platte/nfsshare
$ sudo chown -R pi:pi /media/usb-platte/nfsshare/
$ sudo find /media/usb-platte/nfsshare/ -type d -exec chmod 755 {} \;
$ sudo find /media/usb-platte/nfsshare/ -type f -exec chmod 644 {} \;

Derpå skal filen “/etc/exports” redigeres. Her angives stien, bruger-id’et og gruppe-id’et:

/media/usb-platte/nfsshare *(rw,all_squash,insecure,async,no_subtree_check,anonuid=1000,anongid=1000)

Indstillingen kan nu indstilles på følgende måde.

x
+
Terminal

$ sudo exportfs -ra

Hvordan kan jeg montere NFS’en?

Jeg kan montere disken som følger:

x
+
Terminal

$ sudo mount -t nfs SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs

Eller indtast permanent i filen “/etc/fstab”:

SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs/ nfs defaults 0 0

Også her kan jeg bruge “sudo mount -a”.

Installer Kubernetes

Følgende kommandoer skal udføres på server 1, server 2 og server 3. Først installerer vi Docker og tilføjer brugeren “PI” til Docker-gruppen.

x
+
Terminal

$ curl -sSL get.docker.com | sh
$ sudo usermod pi -aG docker

Efter dette er indstillingen for swap-størrelse nulstillet på alle servere. Det betyder, at jeg redigerer filen “/etc/dphys-swapfile” og sætter attributten “CONF_SWAPSIZE” til “0”.

Dertil kommer, at “Control-Group”-indstillingerne i filen “/boot/cmdline.txt” skal justeres:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Se:

Nu skal alle Raspberrys genstarte en gang og er derefter klar til Kubernetes-installationen.

x
+
Terminal

$ sudo reboot

Efter genstart installerer jeg disse pakker på server 1, server 2 og server 3:
x
+
Terminal

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
$ sudo apt-get update -q && sudo apt-get install -qy kubeadm

# Kun server 1

Nu kan Kubenetes master initialiseres.

x
+
Terminal

$ sudo kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16

Efter den vellykkede initialisering accepterer jeg indstillingerne. Jeg husker den viste “kubeadm join”-kommando til at forbinde arbejderknudepunkterne.
x
+
Terminal

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Nu skal der desværre gøres noget for netværket.
x
+
Terminal

$ kubectl apply https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
$ sudo systemctl daemon-reload
$ systemctl restart kubelet

Kommandoen “kubectl get nodes” skulle nu vise “Master” i status “Ready”.

Kubernetes - Tilføj knudepunkter

Nu skal vi bruge kommandoen “kubeadm join” fra Kubenetes initialisering. Jeg indtaster denne kommando på “Server 2” og “Server 3”.

x
+
Terminal

$ kubeadm join master-ip:port --token r4fddsfjdsjsdfomsfdoi --discovery-token-ca-cert-hash sha256:1adea3bfxfdfddfdfxfdfsdffsfdsdf946da811c27d1807aa

Hvis jeg nu indtaster kommandoen “kubectl get nodes” fra “Server 1” igen, vises disse knudepunkter sandsynligvis i status “Not Ready” (ikke klar). Også her er der det netværksproblem, som skibsføreren også havde. Jeg kører kommandoen fra før igen, men denne gang tilføjer jeg et “f” for force.
x
+
Terminal

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

Derefter kan jeg se alle noder klar til brug.

Lille testudlevering (Server 1/Kubenetes-Master)

Jeg skriver selv en lille testimplementering og kontrollerer funktionerne. Jeg opretter en “nginx.yml”-fil med følgende indhold:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
 selector:
   matchLabels:
     run: my-nginx
 replicas: 2
 template:
   metadata:
     labels:
       run: my-nginx
   spec:
     containers:
     - name: my-nginx
       image: nginx
       ports:
       - containerPort: 80

Nu starter jeg afleveringen:

x
+
Terminal

$ kubectl apply -f nginx.yml
$ kubectl rollout status deployment/my-nginx
$ kubectl get deplyments

Glimrende!

Jeg opretter en tjeneste og kan kalde min container. Jeg opskalerer en gang til 20 “replikaer”:
x
+
Terminal

$ kubectl scale deployment my-nginx --replicas=0; kubectl scale deployment my-nginx --replicas=20

Se:

Oprydning af testopgaver

For at rydde op, sletter jeg deplymentet og tjenesten igen.

x
+
Terminal

$ kubectl delete service example-service
$ kubectl delete deplyments my-nginx

Se: