Fork me on GitHub

Herr Knedel/Grandi cose con i container: cluster Kubenetes e storage NFS

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Sat, 02 Apr 2022 15:15:55 +0000 Schwierigkeitsgrad: Sehr sportlich

875 Words

Oggi sto installando un nuovo cluster Kubenetes e c’è molto da fare!

Ho ordinato questi componenti per esso:

Andiamo!

Ho creato la mia immagine per l’installazione basata sull’installazione di Raspian Lite. La mia chiave utente/pubblica è già memorizzata in questa immagine e il file “/boot/config.txt” è stato adattato per i miei LED.

# 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 - Montare il disco

Per prima cosa, installo un servizio NFS sul “Server 1”. Questo storage può essere usato in seguito per il mio cluster di container. Ho collegato il disco rigido USB al “Server 1” e l’ho formattato EXT4 con l’aiuto di queste istruzioni: https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/ Poi ho creato un punto di montaggio per il disco USB:

x
+
Terminal

$ sudo mkdir /media/usb-platte

Ho inserito il nuovo file system nel file “/etc/fstab” come segue:

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

L’impostazione può essere controllata con “sudo mount -a”. Ora il disco USB dovrebbe essere montato sotto “/media/usb-disk”.

Installare NFS

Questo pacchetto è richiesto per NFS:

x
+
Terminal

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

Inoltre, è stata creata una nuova cartella sul disco USB

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 {} \;

Poi il file “/etc/exports” deve essere modificato. Il percorso, l’ID utente e l’ID gruppo sono inseriti lì:

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

Ora l’impostazione può essere adottata come segue.

x
+
Terminal

$ sudo exportfs -ra

Come posso montare l’NFS?

Posso montare il volume come segue:

x
+
Terminal

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

Oppure inserire permanentemente nel file “/etc/fstab”:

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

Anche qui, posso usare “sudo mount -a”.

Installare Kubernetes

I seguenti comandi devono essere eseguiti sul server 1, server 2 e server 3. Prima installiamo Docker e aggiungiamo l’utente “PI” al gruppo Docker.

x
+
Terminal

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

Dopodiché, l’impostazione della dimensione dello swap è azzerata su tutti i server. Questo significa che modifico il file “/etc/dphys-swapfile” e imposto l’attributo “CONF_SWAPSIZE” a “0”.

Inoltre, le impostazioni “Control-Group” nel file “/boot/cmdline.txt” devono essere regolate:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Vedere:

Ora tutti i Raspberry dovrebbero riavviarsi una volta e sono pronti per l’installazione di Kubernetes.

x
+
Terminal

$ sudo reboot

Dopo il riavvio, installo questi pacchetti sul server 1, server 2 e 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

# Solo il server 1

Ora il master Kubenetes può essere inizializzato.

x
+
Terminal

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

Dopo l’inizializzazione riuscita, accetto le impostazioni. Ricordo il comando visualizzato “kubeadm join” per collegare i nodi lavoratori.
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

Ora, purtroppo, bisogna fare qualcosa per la rete.
x
+
Terminal

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

Il comando “kubectl get nodes” dovrebbe ora mostrare il “Master” in stato “Ready”.

Kubernetes - Aggiungere nodi

Ora abbiamo bisogno del comando “kubeadm join” dall’inizializzazione di Kubenetes. Inserisco questo comando su “Server 2” e “Server 3”.

x
+
Terminal

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

Se ora inserisco di nuovo il comando “kubectl get nodes” dal “Server 1”, questi nodi sono probabilmente visualizzati nello stato “Not Ready”. Anche qui c’è il problema della rete che aveva anche il maestro. Eseguo nuovamente il comando di prima, ma questa volta aggiungo una “f” per forza.
x
+
Terminal

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

Dopo di che, vedo tutti i nodi pronti per l’uso.

Piccola distribuzione di test (Server 1/Kubenetes-Master)

Mi scrivo un piccolo deployment di prova e controllo le funzioni. Creo un file “nginx.yml” con il seguente contenuto:

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

Ora inizio il deplyment:

x
+
Terminal

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

Grande!

Creo un servizio e posso richiamare il mio contenitore. Una volta ho scalato fino a 20 “repliche”:
x
+
Terminal

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

Vedi:

Ripulire il depliant dei test

Per riordinare, cancello di nuovo il deplyment e il servizio.

x
+
Terminal

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

Vedi: