ALT Container OS подветка K8S: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Строка 247: Строка 247:


== Создание kubernet-кластера в среде libvirt ==
== Создание kubernet-кластера в среде libvirt ==
Установите пакеты ''virt-manager'', ''virt-install''.
=== Установка master-узла ===

Версия от 10:58, 23 ноября 2021

Подветка K8S обеспечивает разворачивание серверов для организации kubernetes-кластера.

В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами "движков" (см. Kubernetes):

  • docker;
  • CRI-O (podman)

В текущей реализации был выбран вариант движка CRI-O, обеспечивающий повышенный уровень защиты запускаемых контейнеров. Но, так как подветка K8S наследуется от основной ветки потока, включающей движок docker, в рамках данной подветки можно запускать docker-контейнеры, сервисы под docker-compose и организовывать параллельно (или вместо) с кластером kubernetes и docker swarm кластер.

QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s

В настоящее время реализован образ QCOW2 подветки altcos/x86_64/sisyphus/k8s. Скачать его можно по следующим ссылкам: [Полный] [Сжатый]

Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. Для этого создайте файл необходимого размера (например 30GB):

qemu-img create -f qcow2 hdb.qcow2 30G

Запуск образа в режиме master-узла через qemu-system-x86_64

Подготовка YML butane-файла для master-узла

Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа:

  • форматирование дополнительного диска под файловую систему BTRFS для размещения образов и контейнеров;
  • монтирование его в каталог /var/lib;
  • копирование файлов конфигураций и "перекрытых" при монтировании подкаталогов каталога /var/lib/.
  • создание systemd-сервиса для инициализации master-узла kubernetes-кластера.

Файл конфигурации k8s_master.yml выглядит следующим образом:

variant: fcos
version: 1.3.0
passwd:
  users:
    - name: altcos
      groups:
        - wheel
        - docker
      password_hash: $y$j9T$ZEYmKSGPiNFOZNTjvobEm1$IXLGt5TxdNC/OhJyzFK5NVM.mt6VvdtP6mhhzSmvE94
      ssh_authorized_keys:
        - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1/GiEhIOcqs14pHPU9tNPKmV9XswRK91KEfqnhLtl9wWkojzuFekosSbCiy6g9DKTWK7rps7uZ4HAAGAof78e60kRWFgNWkQQqG/NKe1rrb0Iwv7kWwGhIWysWgZi466suvEGRFy1ysBpP1K0ChMRti+BWOqe8+OVCjSgT0WpguzL4j6onTXT8WJNTInPty6Fcfw2nMeq0JOu6zh49eblKAuB8nYJqUCNXYy5XJVUB5Qg54dKi2V0kBzbUWeKLhSGsHyBWW6HMsuOC5U9PVAX++h1+25vEarLyK1/R1EhTATkFJ2c6AMCTkrbhlkij0KrnpyHWd7G7vMb14+6Ewih kaf@basealt

storage:

  disks:
    -
      device: /dev/sdb
      wipe_table: true
      partitions:
        - number: 1
          label: varlib

  filesystems:
    - path: /var/lib
      device: /dev/sdb1
      format: btrfs
      wipe_filesystem: true
      label: varlib
      with_mount_unit: true

  trees:
    - local: root # скопировать файловое дерево локального каталога root
      path: /

  files:
    - path: /etc/docker/daemon.json # переписав файл конфигурации dockerd с поддержкой overlay-драйвера BTRFS
      overwrite: true

    - path: /etc/containers/storage.conf # переписав файл конфигурации crio/podman с поддержкой overlay-драйвера BTRFS
      overwrite: true

    - path: /etc/profile.d/kube.sh
      mode: 0755

systemd:
  units:
    - name: initk8s.service
      enabled: false
      contents: |
        [Unit]
        Description=Start up kubernetes in master mode
        After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        Environment="KUBECONFIG=/etc/kubernetes/admin.conf"
        ExecStartPre=loadDockerArchiveImages.sh
        ExecStart=kubeadm init --cri-socket=/var/run/crio/crio.sock --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification --kubernetes-version=v1.20.12
        ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-

        [Install]
        WantedBy=multi-user.target

Каталог root имеет следующую структуру:

root/
├── etc
│   ├── containers
│   │   └── storage.conf
│   ├── docker
│   │   └── daemon.json
│   ├── profile.d
│   │   └── kube.sh
│   └── sudoers.d
│       └── altcos
└── var
    └── lib
        └── kubelet

Файлы /etc/containers/storage.conf, /etc/docker/daemon.json являются стандартными файлами конфигурации для CRI-O('podman') и docker с измененными storage-драйверами с overlay на btrfs.

Файл /etc/profile.d/kube.sh' обеспечивает инициализацию переменной KUBECONFIG при работе под суперпользователем или инициализацию каталога ~/.kube/ при работе под пользователем altcos.

Файл /etc/sudoers.d/altcos обеспечивает беспарольный запуск sudo для удаленной инициализации узла кластера по протоколу ssh.

Каталог /var/lib/kubelet пересоздает каталог входяший в пакет kubelet который пропадает при монтировании каталога /var/lib на форматированный BTRFS том.

Архив каталога root: Файл:Kuber root.tar

Если Вы планируете использовать стандартный storage-драйвер overlay то в в YML-файле,

  • секции storage.trees, 'storage.files' можно опустить
  • в секции storage.filesystem.format указать ext4;

Каталог root в этом случае не нужен.

Запуск образа как master-узла

Запуск образа производится скриптом:

#!/bin/sh
if ! butane -d . -p k8s_master.yml > k8s_master.ign
then
  exit 1;
fi
sudo qemu-system-x86_64 \
	-m 2048 \
	-machine accel=kvm \
	-cpu host \
	-smp 2 \
	-hda k8s.20211118.0.0.qcow2 \
	-hdb hdb.qcow2 \
	-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \
	-net user,hostfwd=tcp::10222-:22 -net nic

Обратите внимание, что для работы узла kubernetes требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти. Каталог root, содержащий файлы конфигурации /etc/containers/storage.conf, /etc/docker/daemon.json, должен находиться в каталоге запуска скрипта. Если это не так укажите при запуска команды butane после флага -d каталог месторасположение каталога root.

Доступ по протоколу ssh обеспечивается через порт 10222 HOST-компьютера localhost.

Запуск kubernetes на master-узле

Для того, чтобы запустить сервис:

  • зайдите через консоль или через ssh под пользователем altcos;
  • выполните запуск сервиса initk8s:
$ sudo systemctl start initk8s

Данные действия можно сделать и "удаленно" по протоколу ssh:

ssh -p 10222 altcos@localhost sudo systemctl start initk8s

Во время запуска длительностью менее минуты:

  • производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;
  • запуск их как сервисов;
  • инициализация master-узла кластера;

Логи запуска можно посмотреть командой:

$ journalctl -u initk8s
Starting Start up kubernetes in master mode...
...
Loaded image(s): k8s.gcr.io/coredns:1.7.0
...
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0
...
Your Kubernetes control-plane has initialized successfully!
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \
    --discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc
...
node/localhost untainted
Finished Start up kubernetes in master mode.

Рабочие (worker) узлы можно присоединять к кластеру указанной командой

kubeadm join ...

Работа с master-узлом кластера

Вы можете работать с мастер узлом как под обычным пользователем (например altcos), так и от имени суперпользователя.

Файл ~/.kube/config в домашнем каталоге пользователя altcos автоматически создается скриптом /etc/profile.d/kube.sh, описанным в YML-butane файле, при входе в пользователя altcos после инициализации узла кластера.

Для работы с master-узлом кластера из суперпользователя выполните команду:

export KUBECONFIG=/etc/kubernetes/admin.conf

Проверка работы master-узла

Для проверки работы узла наберите команду

# kubectl get nodes
NAME        STATUS   ROLES                  AGE   VERSION
localhost   Ready    control-plane,master   41m   v1.20.8

Для проверки работы всего функционала наберите команду:

$ kubectl get all -A
NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE
kube-system   pod/coredns-74ff55c5b-b4rxp             1/1     Running   0          9h
kube-system   pod/coredns-74ff55c5b-kfsxv             1/1     Running   0          9h
kube-system   pod/etcd-localhost                      1/1     Running   0          9h
kube-system   pod/kube-apiserver-localhost            1/1     Running   0          9h
kube-system   pod/kube-controller-manager-localhost   1/1     Running   0          9h
kube-system   pod/kube-proxy-4t95d                    1/1     Running   0          9h
kube-system   pod/kube-scheduler-localhost            1/1     Running   0          9h

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  9h
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   9h

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           kubernetes.io/os=linux   9h

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   2/2     2            2           9h

NAMESPACE     NAME                                DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-74ff55c5b   2         2         2       9h

Должен быть:

  • развернут deployment 'coredns' с двумя репликами (replicaset coredns-xxx, pods-xxx-yyy;
  • запушен daemonset 'kube-proxy' с одной (по числу узлов) репликой;

Все перечисленные POD'ы должны иметь состояние READY 1/1.

Действия после перезагрузке системы

После перезагрузки системы никаких дополнительных действий не требуется. master-узел kubernetes-кластера поднимается автоматически.

Создание kubernet-кластера в среде libvirt

Установите пакеты virt-manager, virt-install.

Установка master-узла