Fork me on GitHub

Herr Knedel/Большие вещи с контейнерами: кластер Kubenetes и хранилище NFS

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Sat, 02 Apr 2022 16:12:08 +0000 Уровень сложности: Очень спортивный

823 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” с “Сервера 1”, эти узлы, вероятно, будут отображаться в статусе “Не готов”. Здесь также возникает проблема с сетью, которая была и у мастера. Я снова выполняю предыдущую команду, но на этот раз я добавляю “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

См: