Поднимаем кластер kubernetes с помощью утилиты rke в системе виртуализации firecracker

Поднимаем кластер kubernetes с помощью утилиты rke в системе виртуализации firecracker

В этой статье продолжаю исследовать Firecracker. Совместно с утилитой rke можно легко установить кластер Kubernetes.

Firecracker - это технология виртуализации с открытым исходным кодом, предназначенная для создания и управления защищенными, мультитенантными контейнерными и функциональными сервисами, обеспечивающими бессерверные операционные модели. Firecracker запускает рабочие нагрузки в облегченных виртуальных машинах, называемых microVMs, которые сочетают свойства безопасности и изоляции, предоставляемые технологией аппаратной виртуализации, со скоростью и гибкостью контейнеров.

RKE - Rancher Kubernetes Engine (RKE) is a CNCF-certified Kubernetes distribution that runs entirely within Docker containers. It works on bare-metal and virtualized servers. RKE solves the problem of installation complexity, a common issue in the Kubernetes community. With RKE, the installation and operation of Kubernetes is both simplified and easily automated, and it’s entirely independent of the operating system and platform you’re running. As long as you can run a supported version of Docker, you can deploy and run Kubernetes with RKE.

План работ

  • Вступительное слово;
  • Зачем это было сделано?;
  • Обсуждение архитекутуры;
  • Сборка ядра;
  • Сборка корневой системы;
    • Сборка корневой системы Debian Buster;
  • Создание сетевой подсистемы
  • Создание корневой системы из образа для виртуальных машин
  • Установка необходимого ПО
  • Конфигурация rke
  • Запуск виртуальных машин и установка кластера
  • Управление кластером
  • Что делать дальшеВступительное слово.

Вступительное слово

АВТОР ПРЕДОСТАВЛЯЕТ СТАТЬЮ “КАК ЕСТЬ” БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. ВЕСЬ РИСК, СВЯЗАННЫЙ С КАЧЕСТВОМ И ЭФФЕКТИВНОСТЬЮ СТАТЬИ, ЛЕЖИТ НА ВАС. ЕСЛИ СОДЕРЖАНИЕ СТАТЬИ ОКАЖЕТСЯ НЕВЕРНЫМ, ВЫ БЕРЕТЕ НА СЕБЯ РАСХОДЫ НА ВСЕ НЕОБХОДИМОЕ ОБСЛУЖИВАНИЕ, РЕМОНТ ИЛИ ИСПРАВЛЕНИЕ.

Используемое оборудование - это сервер на базе материнской платы AsRock J1900D c 4 ядерным процессором Celeron и 16 Гигабайт ОЗУ. Данный сервер был выбран по причине дешевизны, наличия 4 ядер и пассивного охлаждения, что крайне необходимо для домашнего сервера.

[nurmukhamed@otrs ~]$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 55
Model name:            Intel(R) Celeron(R) CPU  J1900  @ 1.99GHz
Stepping:              8
CPU MHz:               2415.903
CPU max MHz:           2415.7000
CPU min MHz:           1332.8000
BogoMIPS:              3993.60
Virtualization:        VT-x
L1d cache:             24K
L1i cache:             32K
L2 cache:              1024K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt tsc_deadline_timer rdrand lahf_lm 3dnowprefetch epb ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms dtherm ida arat md_clear spec_ctrl intel_stibp

[nurmukhamed@otrs ~]$ free
              total        used        free      shared  buff/cache   available
Mem:       15965700     1002912      278152    10462696    14684636     4161820
Swap:       8126460      142592     7983868

Конфигурация виртуальных машин не является оптимальной и выбрана чтобы уместить на домашнем сервере 5 виртуальных машин в пределах 16 Гигабайт ОЗУ.

Данная конфигурация сервера и виртуальных машин предназначена только для образовательных целях для проверки возможностей. Не является отказоустойчивой и развернута на одном сервере

Для более менее серьезных задач следуете рекомендациям создателей Kubernetes.

Зачем это было сделано?;

Firecracker - это система виртуализации с минимальным количеством функции.

Кластер Kubernetes использует docker, использует расширенные сетевые настойки - bridges, vxvlan, различные типы сетевых модулей. Мне было интересно - а возможно ли поднять рабочий кластер поверх firecracker???

Как оказалось возможно, но с некоторыми ограничениям.

Обсуждение архитекутуры

Кластер kubernetes состоит из 5 узлов - виртуальные машины со следующими параметрами:

NameRoleCPURAM, MBHDD, GBIP
k8s01etcd1216192.168.1.5
k8s02control-plane1216192.168.1.6
k8s03control-plane1216192.168.1.7
k8s04worker1216192.168.1.8
k8s05worker1216192.168.1.9

Сборка ядра

Нам понадобится ядро Linux. Особенность firecracker - используется ядро со встроенными модулями. Без поддержки initrd.

Также существуют требования к модулям ядра. Поэтому мы должны собрать новое ядро со встроенными модулями, чтобы не нарушать требования.

По данной ссылке подготовим рабочее окружение и загрузим последнею версию ядра.

sudo yum install flex flex-devel bison bison-devel ncurses-devel make gcc bc openssl-devel elfutils-libelf-devel rpm-build

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.6.13.tar.xz
tar xvf linux-5.6.13.tar.xz

cd linux-5.6.13
curl https://gist.githubusercontent.com/Nurmukhamed/033eacdc00ea20f5d3dd8d60d8ebea7b/raw/beae09d4984c84a8b335cb2f3dcdbb3ec2a179cc/firecracker-microvm-kubernetes-ready-kernel-config -o .config

make menuconfig

Ничего не выбираем, просто сохраняем конфиг как .config

make vmlinux

Скопируем полученный файл в каталог /var/lib/firecracker/kernels/

sudo cp ./vmlinux /var/lib/firecracker/kernels/k8s-5.6.13

Сборка корневой системы

ВНИМАНИЕ: Я потерял очень много времени пытаясь почему же у меня возникают ошибки, не проходит установка кластера. Виной всему оказалась ошибка в CentOS / Docker / iptables. Из-за чего не было возможности прокинуть порты из Docker наружу. Пока советую не использовать CentOS 7|8

ВНИМАНИЕ: В Debian Buster установка прошла успешно. Рекомендую использовать Debian Buster

Нам понадобится образ корневой системы.

Сборка корневой системы Debian Buster

В данной сборке будет минимальная система Debian. Основной послужила следующая статья.

Создадим ключ для openssh для доступа на сервера.

ВНИМАНИЕ - ED25519 поддерживается версией OpenSSH 8.2 и позже. Если вы будете использовать иную версию Debian, используйте поддерживаемый тип публичных ключей.

ssh-keygen -o -a 256 -t ed25519 -C "$(hostname)-$(date +'%d-%m-%Y')" -t ~/.ssh/rke
cat ~/.ssh/rke.pub

Подготовим рабочее окружение

sudo yum install debootstrap -y
mkdir ~/debian

sudo debootstrap --include=sudo,nano,wget --arch amd64 buster ~/debian http://mirror.neolabs.kz/debian/

sudo mount -o bind /dev ~/debian/dev
sudo mount -o bind /sys ~/debian/sys
sudo mount -o bind /proc ~/debian/proc

cat<<EOF | sudo tee ~/debian/etc/resolv.conf
search lan
nameserver 192.168.1.1
EOF

Рабочий вариант /etc/apt/source.list

cat<<EOF| sudo tee ~/debian/etc/apt/source.list
deb http://mirror.neolabs.kz/debian/ buster main contrib non-free
deb-src http://mirror.neolabs.kz/debian/ stretch main contrib non-free

deb http://mirror.neolabs.kz/debian/ buster-updates main contrib non-free
deb-src http://mirror.neolabs.kz/debian/ buster-updates main contrib non-free

deb http://security.debian.org/debian-security/ buster/updates main contrib non-free
deb https://download.docker.com/linux/debian buster stable
deb-src http://security.debian.org/debian-security/ buster/updates main contrib non-free

deb http://deb.debian.org/debian buster-backports main
EOF

Запустим chroot

env LANG=C env HOME=/root sudo -E chroot ~/debian /bin/bash /postinstall.sh

Выполняем

cat<<EOF| sudo tee ~/debian/postinstall.sh
#!/bin/bash

## обновление индекса репозитария
apt-get update

## настройка часовых поясов
dpkg-reconfigure tzdata

## участие в опросе популярности пакетов
apt-get -y install popularity-contest

## русский язык в консоли, русская локаль
## при настройке console-cyrillic лучше выбрать, как шрифт, UniCyr, а на последний вопрос ответить «Да»

apt-get -y install locales console-cyrillic
dpkg-reconfigure locales
dpkg-reconfigure console-cyrillic

# установим произвольный пароль для root
usermod -p ! root

# создадим нового пользователя rke
useradd rke

# set random password for user
usermod -p ! rke
  
# create .ssh folder and put authorized_keys
mkdir /home/rke/.ssh
chmod 700 /home/rke/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOYyQl0aVdv88oTRKuG6HvTJ6uQ5EaN7/dHkO1P3vdvv otrs.edenprime.kz-13-08-2020" > /home/rke/.ssh/authorized_keys
chmod 600 /home/rke/.ssh/authorized_keys
chown rke:rke -R /home/rke/.ssh
  
#create sudoers file for user
echo "rke  ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/rke
EOF

# установим рекомендуемую версию Docker
curl https://releases.rancher.com/install-docker/18.09.2.sh | sh

# добавим пользователя rke в группу Docker
usermod -aG docker rke

Отключаем разделы

sudo rm ~/debian/etc/resolv.conf
sudo umount ~/debian/dev
sudo umount ~/debian/sys
sudo umount ~/debian/proc

Произведем упаковку образа

sudo tar -Jcvf /var/lib/firecracker/rootfs/k8s-debian-buster-$(/bin/date +%Y%m%d).tar.xz -C ~/debian .

Теперь у нас имеется образ ОС Debian, готовый для развертывания Kubernetes.

Создание сетевой подсистемы

Настроем сетевую подсистему для виртуальных машин.

ВНИМАНИЕ: Я использую systemd-networkd и не использую NetworkManager.

ВНИМАНИЕ: br0 - это наименование моста для виртуальных машин, в данной конфигурации машины имеют прямой доступ к локальной сети.

for i in {1..5}; do
  sudo ip tuntap add tap${i} mode tap
   ip link set tap${i} master br0
  sudo ip link set tap${i} up

  sudo tee /etc/systemd/network/90-tap${i}.netdev << EOF
[NetDev]
Name=tap${i}
Kind=tap
EOF

  sudo tee /etc/systemd/network/90-tap${i}.network << EOF
[Match]
Name=tap${i}

[Network]
Bridge=br0
EOF

done

Создание корневой системы из образа для виртуальных машин

Написал небольшой скрипт для развертывания образа виртуальной машины.

VMDATA="/opt/k8s"
MOUNTDIR="/tmp/testmount"

declare -A servers
servers["k8s01"]=5
servers["k8s02"]=6
servers["k8s03"]=7
servers["k8s04"]=8
servers["k8s05"]=9

for server in "${!servers[@]}"; do

  ip=${servers[${server}]}

  sudo dd if=/dev/zero of=${VMDATA}/${server}.ext4 bs=1M count=16384
  sudo mkfs.ext4 ${VMDATA}/${server}.ext4
  sudo mkdir ${MOUNTDIR}
  sudo mount -o loop ${VMDATA}/${server}.ext4 ${MOUNTDIR}
  sudo tar -Jxvf /var/lib/firecracker/rootfs/k8s-debian-buster-$(/bin/date +%Y%m%d).tar.xz -C ${MOUNTDIR}

  cat<<EOF| sudo tee ${MOUNTDIR}/etc/resolv.conf
search lan
nameserver 192.168.1.1
EOF

  cat<<EOF | sudo tee ${MOUNTDIR}/etc/hostname
${server}.lan
EOF

  cat<<EOF| sudo tee ${MOUNTDIR}/etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
      address 192.168.1.${ip}
      netmask 255.255.255.0
      gateway 192.168.1.1
EOF

  cat<<EOF| sudo tee ${MOUNTDIR}/etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
192.168.1.5     k8s01.lan
192.168.1.6     k8s02.lan
192.168.1.7     k8s03.lan
192.168.1.8     k8s04.lan
192.168.1.9     k8s05.lan
EOF

  sudo umount ${MOUNTDIR}
done

Образ развернут, конфигурация виртуальной машины будет выглядет так:

for i in {1..5}; do
  macaddress=$(echo 00:60:2F:$[RANDOM%10]$[RANDOM%10]:$[RANDOM%10]$[RANDOM%10]:$[RANDOM%10]$[RANDOM%10])

  cat<<EOF | sudo tee /etc/firecracker/k8s0${i}.json
{
  "boot-source": {
    "kernel_image_path": "/var/lib/firecracker/kernels/k8s-5.6.13",
    "boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
  },
  "drives": [
    {
      "drive_id": "rootfs",
      "path_on_host": "/opt/k8s/k8s0${i}.ext4",
      "is_root_device": true,
      "is_read_only": false
    }
  ],
  "machine-config": {
    "vcpu_count": 2,
    "mem_size_mib": 2048,
    "ht_enabled": false
  },
  "network-interfaces": [ 
      {
      "iface_id": "eth0",
      "guest_mac": "${macaddress}",
      "host_dev_name": "k8s0${i}"
    }
  ],
  "actions": {
      "action_type": "InstanceStart"
  }
}
EOF
done

Установка необходимого ПО

Нам необходимо дополнительное программное обеспечение для управления кластером Kubernetes

kubectl:

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version --client

rke

curl -s https://api.github.com/repos/rancher/rke/releases/latest | grep download_url | grep amd64 | cut -d '"' -f 4 | wget -qi -
chmod +x rke_linux-amd64
sudo mv rke_linux-amd64 /usr/local/bin/rke
rke --version

helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Конфигурация rke

Более подробно можно почитать здесь.

У меня получилась следующая конфигурация.

mkdir ~/rke
cd ~/rke

cat<<EOF| tee cluster.yml
# If you intened to deploy Kubernetes in an air-gapped environment,
# please consult the documentation on how to configure custom RKE images.
nodes:
- address: 192.168.1.5
  port: "22"
  internal_address: ""
  role:
  - etcd
  hostname_override: ""
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: /home/nurmukhamed/.ssh/rke
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
- address: 192.168.1.6
  port: "22"
  internal_address: ""
  role:
  - controlplane
  hostname_override: ""
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: /home/nurmukhamed/.ssh/rke
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
- address: 192.168.1.7
  port: "22"
  internal_address: ""
  role:
  - controlplane
  hostname_override: ""
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: /home/nurmukhamed/.ssh/rke
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
- address: 192.168.1.8
  port: "22"
  internal_address: ""
  role:
  - worker
  hostname_override: ""
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: /home/nurmukhamed/.ssh/rke
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
- address: 192.168.1.9
  port: "22"
  internal_address: ""
  role:
  - worker
  hostname_override: ""
  user: rke
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: /home/nurmukhamed/.ssh/rke
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
services:
  etcd:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    external_urls: []
    ca_cert: ""
    cert: ""
    key: ""
    path: ""
    uid: 0
    gid: 0
    snapshot: null
    retention: ""
    creation: ""
    backup_config: null
  kube-api:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    service_cluster_ip_range: 10.43.0.0/16
    service_node_port_range: ""
    pod_security_policy: false
    always_pull_images: false
    secrets_encryption_config: null
    audit_log: null
    admission_configuration: null
    event_rate_limit: null
  kube-controller:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    cluster_cidr: 10.42.0.0/16
    service_cluster_ip_range: 10.43.0.0/16
  scheduler:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
  kubelet:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    cluster_domain: cluster.local
    infra_container_image: ""
    cluster_dns_server: 10.43.0.10
    fail_swap_on: false
    generate_serving_certificate: false
  kubeproxy:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
network:
  plugin: canal
  options: {}
  mtu: 0
  node_selector: {}
  update_strategy: null
authentication:
  strategy: x509
  sans: []
  webhook: null
addons: ""
addons_include: []
system_images:
  etcd: rancher/coreos-etcd:v3.4.3-rancher1
  alpine: rancher/rke-tools:v0.1.59
  nginx_proxy: rancher/rke-tools:v0.1.59
  cert_downloader: rancher/rke-tools:v0.1.59
  kubernetes_services_sidecar: rancher/rke-tools:v0.1.59
  kubedns: rancher/k8s-dns-kube-dns:1.15.2
  dnsmasq: rancher/k8s-dns-dnsmasq-nanny:1.15.2
  kubedns_sidecar: rancher/k8s-dns-sidecar:1.15.2
  kubedns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1
  coredns: rancher/coredns-coredns:1.6.9
  coredns_autoscaler: rancher/cluster-proportional-autoscaler:1.7.1
  nodelocal: rancher/k8s-dns-node-cache:1.15.7
  kubernetes: rancher/hyperkube:v1.18.6-rancher1
  flannel: rancher/coreos-flannel:v0.12.0
  flannel_cni: rancher/flannel-cni:v0.3.0-rancher6
  calico_node: rancher/calico-node:v3.13.4
  calico_cni: rancher/calico-cni:v3.13.4
  calico_controllers: rancher/calico-kube-controllers:v3.13.4
  calico_ctl: rancher/calico-ctl:v3.13.4
  calico_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4
  canal_node: rancher/calico-node:v3.13.4
  canal_cni: rancher/calico-cni:v3.13.4
  canal_flannel: rancher/coreos-flannel:v0.12.0
  canal_flexvol: rancher/calico-pod2daemon-flexvol:v3.13.4
  weave_node: weaveworks/weave-kube:2.6.4
  weave_cni: weaveworks/weave-npc:2.6.4
  pod_infra_container: rancher/pause:3.1
  ingress: rancher/nginx-ingress-controller:nginx-0.32.0-rancher1
  ingress_backend: rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1
  metrics_server: rancher/metrics-server:v0.3.6
  windows_pod_infra_container: rancher/kubelet-pause:v0.1.4
ssh_key_path: ~/.ssh/id_rsa
ssh_cert_path: ""
ssh_agent_auth: false
authorization:
  mode: rbac
  options: {}
ignore_docker_version: null
kubernetes_version: ""
private_registries: []
ingress:
  provider: ""
  options: {}
  node_selector: {}
  extra_args: {}
  dns_policy: ""
  extra_envs: []
  extra_volumes: []
  extra_volume_mounts: []
  update_strategy: null
cluster_name: ""
cloud_provider:
  name: ""
prefix_path: ""
addon_job_timeout: 600
bastion_host:
  address: ""
  port: ""
  user: ""
  ssh_key: ""
  ssh_key_path: ""
  ssh_cert: ""
  ssh_cert_path: ""
monitoring:
  provider: ""
  options: {}
  node_selector: {}
  update_strategy: null
  replicas: null
restore:
  restore: false
  snapshot_name: ""
dns: null
EOF

Запуск виртуальных машин и установка кластера

Запускаем виртуальные машины

for i in {1..5}; do
  sudo systemctl enable --now firecracker@k8s0${i}
  sudo systemctl status firecracker@k8s0${i}
done

Проверим удаленный доступ к серверам

for i in {5..9}; do
  slogin -i ~/.ssh/rke rke@192.168.1.${i} "uname -r; uptime"
done

Запускаем установку кластера, через минут 10 (на моем железе) будет готовый кластер.

cd ~/rke
rke up

Если появились ошибки, нужно делать troubleshooting.

Управление кластером

Теперь можем проверить состояние кластера.

cd ~/rke/
export KUBECONFIG=./kube_config_cluster.yml
kubectl get nodes
NAME          STATUS   ROLES          AGE   VERSION
192.168.1.5   Ready    etcd           24h   v1.18.6
192.168.1.6   Ready    controlplane   24h   v1.18.6
192.168.1.7   Ready    controlplane   24h   v1.18.6
192.168.1.8   Ready    worker         24h   v1.18.6
192.168.1.9   Ready    worker         24h   v1.18.6

Вы можете скопировать этот файл в $HOME/.kube/config, если у вас нет другого кластера kubernetes.

mkdir ~/.kube
cp kube_config_rancher-cluster.yml ~/.kube/config

Потребление памяти в режиме простоя

Решил выяснить, сколько памяти потребляется в режиме простоя

[nurmukhamed@otrs ~]$ for i in {1..5}; do
> sudo systemctl stop firecracker@k8s0${i}
> sudo systemctl start firecracker@k8s0${i}
> sudo systemctl status firecracker@k8s0${i}
> done
● firecracker@k8s01.service - Firecracker starting microvm k8s01
   Loaded: loaded (/usr/lib/systemd/system/firecracker@.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-08-14 10:39:48 +06; 140ms ago
  Process: 29477 ExecStartPre=/bin/rm /var/run/firecracker/%I.socket (code=exited, status=0/SUCCESS)
  Process: 29474 ExecStartPre=/usr/bin/mkdir /var/run/firecracker (code=exited, status=1/FAILURE)
 Main PID: 29480 (firecracker)
   CGroup: /system.slice/system-firecracker.slice/firecracker@k8s01.service
           └─29480 /usr/sbin/firecracker --api-sock /var/run/firecracker/k8s01.socket --config-file /etc/firecracker/k8s01.json

Aug 14 10:39:48 otrs.edenprime.kz mkdir[29474]: /usr/bin/mkdir: cannot create directory ‘/var/run/firecracker’: File exists
Aug 14 10:39:48 otrs.edenprime.kz firecracker[29480]: 2020-08-14T10:39:48.652013740 [anonymous-instance:WARN:src/vmm/src/lib.rs:216] Could not add stdin event to epoll. Operation not permitted (os error 1)
● firecracker@k8s02.service - Firecracker starting microvm k8s02
   Loaded: loaded (/usr/lib/systemd/system/firecracker@.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-08-14 10:39:49 +06; 66ms ago
  Process: 29510 ExecStartPre=/bin/rm /var/run/firecracker/%I.socket (code=exited, status=0/SUCCESS)
  Process: 29507 ExecStartPre=/usr/bin/mkdir /var/run/firecracker (code=exited, status=1/FAILURE)
 Main PID: 29512 (firecracker)
   CGroup: /system.slice/system-firecracker.slice/firecracker@k8s02.service
           └─29512 /usr/sbin/firecracker --api-sock /var/run/firecracker/k8s02.socket --config-file /etc/firecracker/k8s02.json
● firecracker@k8s03.service - Firecracker starting microvm k8s03
   Loaded: loaded (/usr/lib/systemd/system/firecracker@.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-08-14 10:39:49 +06; 255ms ago
  Process: 29541 ExecStartPre=/bin/rm /var/run/firecracker/%I.socket (code=exited, status=0/SUCCESS)
  Process: 29539 ExecStartPre=/usr/bin/mkdir /var/run/firecracker (code=exited, status=1/FAILURE)
 Main PID: 29544 (firecracker)
   CGroup: /system.slice/system-firecracker.slice/firecracker@k8s03.service
           └─29544 /usr/sbin/firecracker --api-sock /var/run/firecracker/k8s03.socket --config-file /etc/firecracker/k8s03.json
● firecracker@k8s04.service - Firecracker starting microvm k8s04
   Loaded: loaded (/usr/lib/systemd/system/firecracker@.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-08-14 10:39:50 +06; 64ms ago
  Process: 29574 ExecStartPre=/bin/rm /var/run/firecracker/%I.socket (code=exited, status=0/SUCCESS)
  Process: 29571 ExecStartPre=/usr/bin/mkdir /var/run/firecracker (code=exited, status=1/FAILURE)
 Main PID: 29577 (firecracker)
   CGroup: /system.slice/system-firecracker.slice/firecracker@k8s04.service
           └─29577 /usr/sbin/firecracker --api-sock /var/run/firecracker/k8s04.socket --config-file /etc/firecracker/k8s04.json

Aug 14 10:39:50 otrs.edenprime.kz mkdir[29571]: /usr/bin/mkdir: cannot create directory ‘/var/run/firecracker’: File exists
Aug 14 10:39:49 otrs.edenprime.kz systemd[1]: Stopping Firecracker starting microvm k8s04...
Aug 14 10:39:50 otrs.edenprime.kz systemd[1]: Stopped Firecracker starting microvm k8s04.
Aug 14 10:39:50 otrs.edenprime.kz systemd[1]: Starting Firecracker starting microvm k8s04...
Aug 14 10:39:50 otrs.edenprime.kz systemd[1]: Started Firecracker starting microvm k8s04.
● firecracker@k8s05.service - Firecracker starting microvm k8s05
   Loaded: loaded (/usr/lib/systemd/system/firecracker@.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-08-14 10:39:50 +06; 52ms ago
  Process: 29602 ExecStartPre=/bin/rm /var/run/firecracker/%I.socket (code=exited, status=0/SUCCESS)
  Process: 29599 ExecStartPre=/usr/bin/mkdir /var/run/firecracker (code=exited, status=1/FAILURE)
 Main PID: 29604 (firecracker)
   CGroup: /system.slice/system-firecracker.slice/firecracker@k8s05.service
           └─29604 /usr/sbin/firecracker --api-sock /var/run/firecracker/k8s05.socket --config-file /etc/firecracker/k8s05.json

Aug 14 10:39:50 otrs.edenprime.kz systemd[1]: Starting Firecracker starting microvm k8s05...
Aug 14 10:39:50 otrs.edenprime.kz mkdir[29599]: /usr/bin/mkdir: cannot create directory ‘/var/run/firecracker’: File exists
Aug 14 10:39:50 otrs.edenprime.kz systemd[1]: Started Firecracker starting microvm k8s05.
[nurmukhamed@otrs ~]$ sleep 5m
[nurmukhamed@otrs ~]$ free
              total        used        free      shared  buff/cache   available
Mem:       15965700      828476      213860     7939680    14923364     6859272
Swap:       8126460      364288     7762172

Но Htop не врет, система уже загружена.

Что делать дальше

Кластер поднят, теперь можно настраивать приложения по данной статье

kubectl get pods -w --namespace kubeapps
NAME                                                          READY   STATUS             RESTARTS   AGE
apprepo-kubeapps-sync-bitnami-1597317600-lslkt                0/1     Completed          0          28m
apprepo-kubeapps-sync-bitnami-1597318200-mb5xr                0/1     Completed          1          18m
apprepo-kubeapps-sync-bitnami-1597318800-vs5d9                0/1     Completed          0          8m25s
apprepo-kubeapps-sync-bitnami-grnf9-mz5nj                     0/1     Completed          2          24h
apprepo-kubeapps-sync-incubator-1597317600-9mzr7              0/1     Completed          0          28m
apprepo-kubeapps-sync-incubator-1597318200-mxgtz              0/1     Completed          0          18m
apprepo-kubeapps-sync-incubator-1597318800-2w5bp              0/1     Completed          0          8m24s
apprepo-kubeapps-sync-incubator-mld2z-r8t2f                   0/1     Completed          0          24h
apprepo-kubeapps-sync-stable-1597317600-lp84k                 0/1     Completed          0          28m
apprepo-kubeapps-sync-stable-1597318200-hjhqb                 0/1     Completed          1          18m
apprepo-kubeapps-sync-stable-1597318800-tqmcm                 0/1     Completed          1          8m23s
apprepo-kubeapps-sync-svc-cat-1597317600-j4gxj                0/1     Completed          0          28m
apprepo-kubeapps-sync-svc-cat-1597318200-fbtxf                0/1     Completed          0          18m
apprepo-kubeapps-sync-svc-cat-1597318800-n8ct9                0/1     Completed          0          8m22s
apprepo-kubeapps-sync-svc-cat-kwhcc-5ccj5                     0/1     Completed          0          24h
kubeapps-774c79fdd7-fmwkv                                     1/1     Running            0          24h
kubeapps-774c79fdd7-lqm85                                     1/1     Running            0          24h
kubeapps-internal-apprepository-controller-75548b76d8-m5jdm   1/1     Running            0          24h
kubeapps-internal-assetsvc-5f6cc69646-8n59w                   1/1     Running            0          24h
kubeapps-internal-assetsvc-5f6cc69646-k2gf4                   1/1     Running            0          24h
kubeapps-internal-dashboard-57cfbcfc9b-7zh8m                  1/1     Running            0          24h
kubeapps-internal-dashboard-57cfbcfc9b-phvbd                  1/1     Running            0          24h
kubeapps-internal-tiller-proxy-69f596b886-66z9b               0/1     CrashLoopBackOff   280        24h
kubeapps-internal-tiller-proxy-69f596b886-xpspw               0/1     CrashLoopBackOff   281        24h
kubeapps-postgresql-master-0                                  1/1     Running            0          24h
kubeapps-postgresql-slave-0                                   1/1     Running            0          24h

В случае ошибки, можно посмотреть логи системы.

Не забудьте обновить свое резюме, впишите в него строку “Kubernetes, Rancher, RKE” и просите прибавку к зарплате +50 тысяч рублей РФ.