Fork me on GitHub

Herr Knedel/Великі справи з контейнерами: кластер Kubenetes та NFS-сховище

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Sat, 01 Oct 2022 10:51:02 +0000 Schwierigkeitsgrad: Sehr sportlich

806 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”.

Кубернети - додавання вузлів

Тепер нам потрібна команда “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” для сили.
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

Бачиш: