Fork me on GitHub

Herr Knedel/Страхотни неща с контейнери: Kubenetes клъстер и NFS съхранение

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Mon, 28 Mar 2022 18:17:18 +0000 Schwierigkeitsgrad: Sehr sportlich

854 Words

Днес инсталирам нов клъстер на Kubenetes и имам много работа!

Поръчах тези компоненти за него:

Хайде!

Създадох свой собствен образ за инсталацията, базиран на инсталацията на Raspian Lite. Моят потребителски/публичен ключ вече е съхранен в това изображение, а файлът “/boot/config.txt” е адаптиран за моите светодиоди.

# 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

Сървър 1 - Монтиране на диск

Първо, инсталирам услугата NFS на “Сървър 1”. Това хранилище може да се използва по-късно за моя контейнерен клъстер. Свързах USB твърдия диск към “Сървър 1” и го форматирах EXT4 с помощта на тези инструкции: https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/ След това създадох точка за монтиране за USB диска:

x
+
Terminal

$ sudo mkdir /media/usb-platte

Въведох новата файлова система във файла “/etc/fstab” по следния начин:

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

Настройката може да се провери с “sudo mount -a”. Сега USB дискът трябва да бъде монтиран в “/media/usb-disk”.

Инсталиране на NFS

Този пакет е необходим за NFS:

x
+
Terminal

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

В допълнение, на 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 {} \;

Тогава трябва да се редактира файлът “/etc/exports”. Там се въвеждат пътят, идентификаторът на потребителя и идентификаторът на групата:

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

Настройката може да бъде приета по следния начин.

x
+
Terminal

$ sudo exportfs -ra

Как мога да монтирам NFS?

Мога да монтирам тома по следния начин:

x
+
Terminal

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

Или въведете за постоянно във файла “/etc/fstab”:

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

И тук мога да използвам “sudo mount -a”.

Инсталиране на Kubernetes

Следните команди трябва да се изпълнят на сървър 1, сървър 2 и сървър 3. Първо инсталираме Docker и добавяме потребителя “PI” към групата Docker.

x
+
Terminal

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

След това настройката за размера на подмяната се нулира на всички сървъри. Това означава, че редактирам файла “/etc/dphys-swapfile” и задавам атрибута “CONF_SWAPSIZE” на “0”.

В допълнение трябва да се коригират настройките на “Control-Group” във файла “/boot/cmdline.txt”:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Вижте:

След това всички Raspberry трябва да се рестартират веднъж и да са готови за инсталацията на Kubernetes.

x
+
Terminal

$ sudo reboot

След рестартирането инсталирам тези пакети на сървър 1, сървър 2 и сървър 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

# Само сървър 1

Сега главният модул на Kubenetes може да бъде инициализиран.

x
+
Terminal

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

След успешното инициализиране приемам настройките. Спомням си показаната команда “kubeadm join” за свързване на работните възли.
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

Сега, за съжаление, трябва да се направи нещо за мрежата.
x
+
Terminal

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

Командата “kubectl get nodes” вече трябва да показва “Master” в състояние “Ready”.

Kubernetes - Добавяне на възли

Сега ни е необходима командата “kubeadm join” от инициализацията на Kubenetes. Въвеждам тази команда на “Сървър 2” и “Сървър 3”.

x
+
Terminal

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

Ако сега въведа командата “kubectl get nodes” от “Server 1” отново, тези възли вероятно ще се покажат в състояние “Not Ready”. И тук се появява проблемът с мрежата, с който се сблъсква и капитанът. Изпълнявам отново командата отпреди, но този път добавям “f” за force.
x
+
Terminal

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

След това виждам всички възли готови за използване.

Малка тестова демонстрация (Сървър 1/Kubenetes-Master)

Написах си малък тест за внедряване и проверих функциите. Създавам файл “nginx.yml” със следното съдържание:

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

Сега започвам деплантацията:

x
+
Terminal

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

Великолепно!

Създавам услуга и мога да извикам контейнера си. Веднъж увеличих мащаба до 20 “реплики”:
x
+
Terminal

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

Вижте:

Почистване на тестовия модул

За да приключа, изтривам отново депото и услугата.

x
+
Terminal

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

Вижте: