Fork me on GitHub

Herr Knedel/Wspaniałe rzeczy z kontenerami: klaster Kubenetes i pamięć masowa NFS

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

810 Words

Dzisiaj instaluję nowy klaster Kubenetes i jest wiele do zrobienia!

Zamówiłem do niego te elementy:

Ruszamy!

Stworzyłem własny obraz instalacji oparty na instalacji Raspian Lite. Mój klucz użytkownika/publiczny jest już zapisany w tym obrazie, a plik “/boot/config.txt” został dostosowany do moich diod 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

Serwer 1 - zamontuj dysk

Najpierw instaluję usługę NFS na “Serwerze 1”. Ta pamięć masowa może być później użyta w moim klastrze kontenerów. Podłączyłem dysk twardy USB do “Server 1” i sformatowałem go EXT4 za pomocą następujących instrukcji: https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/ Następnie utworzyłem punkt montowania dla dysku USB:

x
+
Terminal

$ sudo mkdir /media/usb-platte

Wprowadziłem nowy system plików do pliku “/etc/fstab” w następujący sposób:

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

Ustawienie to można sprawdzić za pomocą polecenia “sudo mount -a”. Teraz dysk USB powinien być zamontowany pod adresem “/media/usb-disk”.

Zainstaluj NFS

Pakiet ten jest wymagany dla systemu NFS:

x
+
Terminal

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

Ponadto na dysku USB został utworzony nowy folder

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

Następnie należy edytować plik “/etc/exports”. Wprowadza się tam ścieżkę, identyfikator użytkownika i identyfikator grupy:

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

Teraz ustawienia można wprowadzić w następujący sposób.

x
+
Terminal

$ sudo exportfs -ra

Jak zamontować system NFS?

Wolumin można zamontować w następujący sposób:

x
+
Terminal

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

Można też wpisać na stałe do pliku “/etc/fstab”:

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

Również w tym przypadku mogę użyć polecenia “sudo mount -a”.

Zainstaluj Kubernetes

Poniższe polecenia muszą być wykonane na serwerach 1, 2 i 3. Najpierw instalujemy Dockera i dodajemy użytkownika “PI” do grupy Dockera.

x
+
Terminal

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

Następnie na wszystkich serwerach zostanie wyzerowane ustawienie rozmiaru wymiany. Oznacza to, że edytujemy plik “/etc/dphys-swapfile” i ustawiamy atrybut “CONF_SWAPSIZE” na “0”.

Ponadto należy dostosować ustawienia “Control-Group” w pliku “/boot/cmdline.txt”:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Zobacz:

Teraz wszystkie komputery Raspberry powinny się zrestartować i są gotowe do instalacji Kubernetes.

x
+
Terminal

$ sudo reboot

Po ponownym uruchomieniu komputera instaluję te pakiety na serwerach 1, 2 i 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

# Tylko serwer 1

Teraz można zainicjować główny serwer Kubenetes.

x
+
Terminal

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

Po pomyślnej inicjalizacji akceptuję ustawienia. Pamiętam wyświetlane polecenie “kubeadm join” służące do łączenia węzłów robotniczych.
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

Teraz, niestety, trzeba coś zrobić dla sieci.
x
+
Terminal

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

Polecenie “kubectl get nodes” powinno teraz pokazać węzły “Master” w stanie “Ready”.

Kubernetes - dodawanie węzłów

Teraz potrzebujemy polecenia “kubeadm join” z inicjalizacji Kubenetes. Wprowadzam to polecenie na “Serwerze 2” i “Serwerze 3”.

x
+
Terminal

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

Jeśli teraz ponownie wpiszę polecenie “kubectl get nodes” z “Server 1”, węzły te zostaną prawdopodobnie wyświetlone w statusie “Not Ready”. Również w tym przypadku występuje problem z siecią, który miał również mistrz. Ponownie uruchamiam poprzednie polecenie, ale tym razem dodaję literę “f” oznaczającą siłę.
x
+
Terminal

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

Następnie widzę wszystkie węzły gotowe do użycia.

Mała instalacja testowa (Serwer 1/Kubenetes-Master)

Piszę sobie małe wdrożenie testowe i sprawdzam działanie funkcji. Tworzę plik “nginx.yml” o następującej zawartości:

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

Teraz rozpoczynam depilację:

x
+
Terminal

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

Świetnie!

Tworzę usługę i mogę wywoływać mój kontener. Jednorazowo skaluję do 20 “replik”:
x
+
Terminal

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

Zobacz:

Uporządkowanie stanowiska badawczego

W celu uporządkowania usuwam ponownie wpłatę i usługę.

x
+
Terminal

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

Zobacz: