https://www.altlinux.org/api.php?action=feedcontributions&user=Keremet&feedformat=atom
ALT Linux Wiki - Вклад [ru]
2024-03-29T07:29:34Z
Вклад
MediaWiki 1.38.2
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57524
ALT Container OS подветка K8S
2021-12-01T10:36:29Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8smaster<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру взятой из лога командой<br />
<br />
kubeadm join ...<br />
<br />
После запуска initk8smaster следует перелогиниться, чтобы в домашнем каталоге появился файл ''~/.kube/config''. Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster01'':<br />
journalctl -u initk8smaster01<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Join node to cluster<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57523
ALT Container OS подветка K8S
2021-12-01T10:17:06Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8smaster<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру взятой из лога командой<br />
<br />
kubeadm join ...<br />
<br />
После запуска initk8smaster следует перелогиниться, чтобы в домашнем каталоге появился файл ''~/.kube/config''. Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster01'':<br />
journalctl -u initk8smaster01<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Join node to cluster<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57521
ALT Container OS подветка K8S
2021-12-01T09:30:47Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8smaster<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру взятой из лога командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster01'':<br />
journalctl -u initk8smaster01<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Join node to cluster<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57520
ALT Container OS подветка K8S
2021-12-01T09:29:31Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8smaster<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster01'':<br />
journalctl -u initk8smaster01<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Join node to cluster<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57519
ALT Container OS подветка K8S
2021-12-01T09:20:21Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster01'':<br />
journalctl -u initk8smaster01<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Join node to cluster<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57507
ALT Container OS подветка K8S
2021-11-30T09:00:49Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster01'':<br />
journalctl -u initk8smaster01<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Join node to cluster<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57505
ALT Container OS подветка K8S
2021-11-30T08:15:02Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течение минуты вывод команды должен стать следующим:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57504
ALT Container OS подветка K8S
2021-11-30T07:24:52Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernetes- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install'', ''qemu-device-display-qxl'', ''qemu-device-usb-redirect'', ''libvirt-daemon'', ''qemu-system-x86-core'', ''libvirt-daemon-driver-qemu'', ''libvirt-daemon-config-network'', ''virt-viewer'' и ''qemu-ui-spice-app''.<br />
<br />
Включите сервис libvirtd<br />
sudo systemctl enable --now libvirtd<br />
<br />
Запустите ''virt-manager'', выделите подключение ''QEMU/KVM'', выберите пункт меню ''Правка/Свойства подключения'', на вкладке ''Виртуальные сети'' включите сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
Чтобы виртуальные машины могли подключиться к сети default подключения QEMU/KVM, надо запускать этот скрипт создания виртуальной машины и последующие от имени пользователя root. Удалить ошибочно созданную виртуальную машину можно через графический интерфейс в приложении virt-manager.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57459
ALT Container OS подветка K8S
2021-11-26T08:26:45Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml, изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'', изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57458
ALT Container OS подветка K8S
2021-11-26T08:08:27Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее, добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57457
ALT Container OS подветка K8S
2021-11-26T08:07:49Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Залогинившись под пользователем altcos master-узла, наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57456
ALT Container OS подветка K8S
2021-11-26T08:01:06Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и сохранение открытого ключа ====<br />
<br />
Залогинившись под пользователем ''altcos'' master-узла, сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57455
ALT Container OS подветка K8S
2021-11-26T07:57:44Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле, раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57453
ALT Container OS подветка K8S
2021-11-26T07:36:31Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односерверного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57452
ALT Container OS подветка K8S
2021-11-26T07:35:18Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односервеного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию, сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57451
ALT Container OS подветка K8S
2021-11-26T07:21:20Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'', объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге, и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односервеного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57450
ALT Container OS подветка K8S
2021-11-26T07:17:49Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'' объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односервеного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57449
ALT Container OS подветка K8S
2021-11-26T07:16:36Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', меняя тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'' объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односервеного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57448
ALT Container OS подветка K8S
2021-11-26T07:06:46Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов, размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', указывая тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'' объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односервеного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса worker-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57446
ALT Container OS подветка K8S
2021-11-26T06:16:58Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2 Полный]]<br />
[[https://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211125.0.0.qcow2.xz Сжатый]]<br />
<br />
В данной документации используется образ ''k8s.20211125.0.0.qcow2''. Каталог расположения образа хранится во внешней переменной ''IMAGEHOME''.<br />
<br />
Образ включает в себя архив docker-образов, необходимых для разворачивания kubernetes-кластера.<br />
Так что для разворачивания кластера доступ в Интернет не нужен.<br />
<br />
== Запуск образа в режиме master-узла через qemu-system-x86_64==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа: <br />
* обеспечение доступа без пароля администратора по открытому ключу под пользователем altcos (''passwd.users.ssh_authorized_keys'')<br />
* получение без пароля прав администратора (''sudo'') для пользователя ''altcos'' (файл ''/etc/sudoers.d/altcos'');<br />
* формирование переменных окружения для вызова команды ''kubectl'' (файл ''/etc/profile.d/kube.sh''); <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации ''k8s_master.yml '' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: root<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ...<br />
ssh_authorized_keys:<br />
- ssh-rsa ... <br />
storage:<br />
files:<br />
- path: /etc/sudoers.d/altcos<br />
contents:<br />
inline: |<br />
altcos ALL=NOPASSWD: ALL<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
contents:<br />
inline: |<br />
# Set kube environment<br />
if [ `id -u ` = 0 ]<br />
then<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
else<br />
if [ -f /etc/kubernetes/admin.conf ]<br />
then<br />
if [ ! -d ~/.kube ]<br />
then<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
kubectl completion bash >> ~/.bashrc<br />
fi<br />
fi<br />
fi<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
systemd:<br />
units:<br />
- name: initk8smaster.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом ''run_master.sh'':<br />
<br />
#!/bin/sh<br />
if ! butane -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Команда ''butane'' производит конвертацию butane-файла YML ''k8s_master.yml'' в JSON-формате ''ignition'' в файл ''k8s_master.ign''. <br />
<br />
Команда ''cp'' копирует образ ядра в файл '' k8s.qcow2''.<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8smaster'':<br />
$ sudo systemctl start initk8smaster<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8smaster<br />
<br />
Во время запуска длительностью менее минуты:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
==== Работа с master-узлом кластера ====<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя укажите при вызове ''sudo'' флаг ''-i''. Например:<br />
sudo -i kubectl get all -A<br />
<br />
==== Проверка работы master-узла ====<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Для проверки работы всего функционала наберите команду:<br />
<br />
$ kubectl get all -A<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-b4rxp 1/1 Running 0 9h<br />
kube-system pod/coredns-74ff55c5b-kfsxv 1/1 Running 0 9h<br />
kube-system pod/etcd-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-apiserver-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-controller-manager-localhost 1/1 Running 0 9h<br />
kube-system pod/kube-proxy-4t95d 1/1 Running 0 9h<br />
kube-system pod/kube-scheduler-localhost 1/1 Running 0 9h<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 9h<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 9h<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 9h<br />
<br />
Должен быть:<br />
* развернут ''deployment'' 'coredns' с двумя репликами (''replicaset coredns-xxx'', ''pods-xxx-yyy'';<br />
* запушен ''daemonset'' 'kube-proxy' с одной (по числу узлов) репликой;<br />
<br />
Все перечисленные POD'ы должны иметь состояние READY ''1/1''.<br />
<br />
В ''kubernetes'' по умолчанию на ''master-узле'' не могут запускаться поды в ''namespace'' ''default''.<br />
В одноузловом варианте в данном примере для снятия этого ограничения (см. YML-файл выше) запускается команда<br />
kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
Для проверки запуска POD'ов на master-узле в ''namespace'' ''default'' наберите команду:<br />
kubectl apply -f https://k8s.io/examples/application/deployment.yaml<br />
<br />
Поcле загрузки образа ''nginx'' проверьте запуск POD'а на master-узле:<br />
# kubectl get pods <br />
NAME READY STATUS RESTARTS AGE<br />
nginx-deployment-66b6c48dd5-5nfc6 1/1 Running 0 8m16s<br />
nginx-deployment-66b6c48dd5-j8mww 1/1 Running 0 8m16s<br />
<br />
==== Действия после перезагрузке системы ====<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.<br />
<br />
=== Подключение дополнительного BTRFS диска ===<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. <br />
В приведенных ниже примерах для хранения каталогов образов, контейнеров, ... в ''docker'' и ''CRI-O''<br />
создается и монтируется отдельный диск с файловой системой ''BTRFS''.<br />
<br />
==== Формирование YML butane-файла ====<br />
<br />
Сформируем YML butane-файл ''k8s_master_btrfs.yml'' для форматирования, подключения тома ''BTRFS'', изменения каталогов размещения данных ''docker-демона'' и ''CRI-O''/''podman'':<br />
variant: fcos<br />
version: 1.3.0<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master.ign<br />
storage:<br />
disks:<br />
- device: /dev/sdb # создадим на диске /dev/sdb партицию /dev/sdb1<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: docker<br />
filesystems:<br />
- device: /dev/sdb1 # создадим в партиции /dev/sdb1 файловую систему BTRFS<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: docker<br />
with_mount_unit: false<br />
directories:<br />
- path: /var/mnt/docker # создадим каталог монтирования тома<br />
overwrite: true<br />
files:<br />
- path: /etc/fstab # добавим строку монтирования btrfs-тома на каталог /var/mnt/docker<br />
append:<br />
- inline: |<br />
LABEL=docker /var/mnt/docker btrfs defaults 0 2<br />
# заменим в конфигурации dockerd-демона:<br />
# тип storage-driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/docker на /var/mnt/docker/docker/<br />
- path: /etc/docker/daemon.json<br />
overwrite: true<br />
contents:<br />
inline: |<br />
{<br />
"init-path": "/usr/bin/tini",<br />
"userland-proxy-path": "/usr/bin/docker-proxy",<br />
"default-runtime": "docker-runc",<br />
"live-restore": false,<br />
"log-driver": "journald",<br />
"runtimes": {<br />
"docker-runc": {<br />
"path": "/usr/bin/runc"<br />
}<br />
},<br />
"default-ulimits": {<br />
"nofile": {<br />
"Name": "nofile",<br />
"Hard": 64000,<br />
"Soft": 64000<br />
}<br />
},<br />
"data-root": "/var/mnt/docker/docker/",<br />
"storage-driver": "btrfs"<br />
}<br />
# заменим в конфигурации CRI-O, podman:<br />
# тип driver с overlay2 на btrfs<br />
# изменим каталог размещения данных docker-демона с /var/lib/containers/storage на /var/mnt/docker/containers/storage<br />
- path: /etc/containers/storage.conf<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[storage]<br />
driver = "btrfs"<br />
runroot = "/var/run/containers/storage"<br />
graphroot = "/var/mnt/docker/containers/storage"<br />
<br />
[storage.options]<br />
additionalimagestores = [<br />
]<br />
[storage.options.overlay]<br />
mountopt = "nodev,metacopy=on"<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master.ign'' описанную выше в файле ''k8s_master.yml'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* создает раздел ''/dev/sdb1'';<br />
* создает в разделе файловую систему типа ''BTRFS'';<br />
* создает каталог монтирования ''/var/mnt/docker'';<br />
* добавляет в ''/etc/fstab'' строку монтирования файловой системы раздела ''/dev/sdb1'' в каталог ''/var/mnt/docker'';<br />
* заменяет файлы конфигурации ''docker-демона'' и ''CRI-O/podman'', указывая тип драйвера с ''overlay2'' на ''btrfs'' и перемещая каталоги хранения слоев образов и контейнеров из каталога ''/var/lib'' диска ''/dev/sda1'' в каталог ''/var/mnt/docker'' диска ''/dev/sdb1''.<br />
<br />
==== Запуск образа как master-узла с хранилищем образов и контейнеров на BTRFS-диске ====<br />
<br />
Запуск образа производится скриптом ''run_master_btrfs.sh''<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_btrfs.yml > k8s_master_btrfs.ign<br />
then<br />
exit 1;<br />
fi<br />
cp $IMAGEHOME/k8s.20211118.0.0.qcow2 k8s.qcow2<br />
qemu-img create -f qcow2 hdb.qcow2 10G<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master_btrfs.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic <br />
<br />
Данный скрипт аналогичен вышеописанному ''run_master.sh'' за исключением:<br />
* используется файл конфигурации '' k8s_master_btrfs.yml'' объединяющий свои описания с описанием ignition-файла конфигурации ''k8s_master.ign'', сформированного на предыдущем шаге и записывающий объединенную конфигурация в файл ''k8s_master.ign''.<br />
* формируется файл ''hdb.qcow2'' размером ''10GB'' для тома с файловой системой ''BTRFS'';<br />
* при вызове ''qemu-system-x86_64'' данный файл указывается как второй том в параметре ''-hdb''.<br />
<br />
Все остальные действия по инициализации одноузлового кластера ''kubetnetes'' и работе с ним аналогичны описанным в предыдущем разделе.<br />
<br />
== Создание kubernet- и docker swarm кластеров в среде libvirt ==<br />
<br />
Установите пакеты ''virt-manager'', ''virt-install''. Запустите ''virt-manager'' и включите в ''Правка/Свойства подключения/Виртуальные сети'' сеть ''default'', изменив значение ''Диапазон DHCP-'' c ''192.168.122.2 - 192.168.122.254'' на ''192.168.122.129 - 192.168.122.254''.<br />
<br />
В описанном выше примере создается kubernetes кластер из 3-х узлов:<br />
* ''master01'' с IP-адресом ''192.168.122.65'';<br />
* ''worker01'' с IP-адресом ''192.168.122.66'';<br />
* ''worker02'' с IP-адресом ''192.168.122.67''.<br />
<br />
=== Установка master-узла master01 ===<br />
<br />
==== Формирование YML butane-файла для узла master01 ====<br />
<br />
Cформируем YML butane-файл ''k8s_master_1.yml'' для master-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
master01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.65/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
<br />
systemd:<br />
units:<br />
- name: initk8smaster01.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
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<br />
ExecStartPost=kubectl apply -f /usr/share/k8s/flannel/kube-flannel.yml<br />
#ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''master01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''initk8smaster01.service'' для инициализации узла ''master01''.<br />
<br />
В отличие от односервеного варианта unit-сервис ''initk8smaster01.service'':<br />
* загружает и конфигурирует overlay-сеть ''flannel'' для маршрутизации трафика между узлами;<br />
* не снимает ограничение (''taint'') на запуск на master-узле POD'ов из namespace ''default''.<br />
Если Вы планируете запускать POD'ы из namespace ''default'' на master-узле раскомментируйте:<br />
ExecStartPost=kubectl taint nodes master01 node-role.kubernetes.io/master-<br />
<br />
==== Запуск образа как master01 ====<br />
<br />
Запуск образа производится скриптом ''createMaster1.sh'':<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master_1.yml > k8s_master_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_master_1.qcow2<br />
qemu-img create -f qcow2 master01_hdb.qcow2 10G<br />
virt-install --name k8s_master_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_master_1.qcow2 \<br />
--disk master01_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_master_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_master_1''.<br />
<br />
После запуска виртуальной машины ''k8s_master_1''(появления промптера ''login'' для входа):<br />
* зайдите на нее по протоколу ssh:<br />
ssh altcos@192.168.122.65<br />
* запустите сервис инициализации master-узла:<br />
sudo systemctl start initk8smaster01<br />
* проверьте работу всех необходимых сервисов:<br />
sudo -i kubectl get all -A<br />
<br />
В течении минуты вывод команды должен быть следующий:<br />
NAMESPACE NAME READY STATUS RESTARTS AGE<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 82s<br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 82s<br />
kube-system pod/etcd-master01 1/1 Running 0 16s<br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 16s<br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 13s<br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 82s<br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 82s<br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 31s<br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98s<br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE<br />
kube-system daemonset.apps/kube-flannel-ds 1 1 1 1 1 <none> 97s<br />
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 97s<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE<br />
kube-system deployment.apps/coredns 2/2 2 2 97s<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 2 2 82s<br />
<br />
==== Генерация ssh-ключей и запоминание открытого ключа ====<br />
<br />
Находясь в пользователя ''altcos'' master-узла сгенерируйте ssh-ключи для беспарольного доступа на остальные узла кластера.<br />
<br />
$ ssh-keygen <br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/var/home/altcos/.ssh/id_rsa): <br />
Enter passphrase (empty for no passphrase): <br />
Enter same passphrase again: <br />
Your identification has been saved in /var/home/altcos/.ssh/id_rsa<br />
Your public key has been saved in /var/home/altcos/.ssh/id_rsa.pub<br />
The key fingerprint is:<br />
SHA256:21N0WApmbf9bk61SK9NMMYRO00MCUhhxHmgc28zbYxk altcos@master01<br />
The key's randomart image is:<br />
+---[RSA 3072]----+<br />
| .=BOo.+o |<br />
| =@ o*=+ |<br />
| .. =+E+.. |<br />
| +.++ |<br />
| S . * +o|<br />
| o o .oo+|<br />
| . o = o+|<br />
| .+ =. |<br />
| + |<br />
+----[SHA256]-----+<br />
<br />
Скопируйте открытый ключ из файла ''/var/home/altcos/.ssh/id_rsa.pub''.<br />
Он будет использовать при формировании YML butane-файла для worker-узлов.<br />
<br />
==== Формирование строки подключения worker-узла к кластеру ====<br />
<br />
Находясь в пользователя altcos master-узла наберите команду просмотра логов сервиса ''initk8smaster0'':<br />
journalctl -u initk8smaster0<br />
<br />
Найдите в логах строку подключения к кластеру:<br />
kubeadm join 192.168.122.65:6443 --token ... --discovery-token-ca-cert-hash sha256:...<br />
<br />
Скопируйте ее добавив к ней параметр ''--cri-socket=/var/run/crio/crio.sock ''.<br />
Данная строка будет использоваться при формировании YML butane-файла для worker-узлов.<br />
<br />
=== Установка worker-узла worker01 ===<br />
<br />
==== Формирование YML butane-файла для узла worker01 ====<br />
Cформируем YML butane-файл ''k8s_worker_1.yml'' для 1-го worker-узла:<br />
variant: fcos<br />
version: 1.3.0<br />
<br />
ignition:<br />
config:<br />
merge:<br />
- local: k8s_master_btrfs.ign<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: ..<br />
ssh_authorized_keys:<br />
- ssh-rsa ...<br />
# Открытый RSA-ключ master-узла <br />
- ssh-rsa ... altcos@master01<br />
storage:<br />
files:<br />
- path: /etc/hostname<br />
overwrite: true<br />
contents:<br />
inline:<br />
worker01<br />
- path: /etc/hosts<br />
append:<br />
- inline: |<br />
192.168.122.65 master01<br />
192.168.122.66 worker01<br />
192.168.122.67 worker02<br />
- path: /etc/systemd/network/20-wired.network<br />
overwrite: true<br />
contents:<br />
inline: |<br />
[Match]<br />
Name=eth0<br />
[Network]<br />
DHCP=no<br />
Address=192.168.122.66/24<br />
Gateway=192.168.122.1<br />
DNS=192.168.122.1<br />
systemd:<br />
units:<br />
- name: joink8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm join 192.168.122.65:6443 --cri-socket=/var/run/crio/crio.sock --token ... --discovery-token-ca-cert-hash ...<br />
[Install]<br />
WantedBy=multi-user.target<br />
<br />
Данный YML-файл: <br />
* в элементе ''ignition.config.merge.local'' импортирует из файла ''k8s_master_btrfs.ign'' описанную выше в файле ''k8s_master_btrfs.ign'' конфигурацию сливая(''merge'') ее с нижеописанной конфигурацией;<br />
* в элемент ''passwd.users[0].ssh_authorized_keys'' добавлен открытый ключ пользователя ''altcos'' master-узла;<br />
* заменяет в файле ''/etc/hosts'' имя узла на ''worker01'';<br />
* добавляет в файл ''/etc/hosts'' привязку имен узлов ''master01'', ''worker01'', ''worker02'' к их IP-адресам;<br />
* перезаписывает файл конфигурации интерфейса ''eth0'', указывая в ней IP-адреса master-узла, шлюза и DNS-сервера;<br />
* создает unit-сервис ''joink8s.service'' для подключения узла ''worker01'' к кластеру.<br />
В описании ''ExecStart'' запишите параметры (''--token'', ''--discovery-token-ca-cert-hash'') подключения к кластеру, взятыми из логов сервиса ''initk8smaster01'' master-узла.<br />
<br />
==== Запуск образа как worker01 ====<br />
<br />
Запуск образа производится скриптом ''createWorker1.sh'': <br />
#!/bin/sh<br />
if ! butane -d . -p k8s_worker_1.yml > k8s_worker_1.ign<br />
then<br />
exit 1<br />
fi<br />
cp $IMAGEHOME/k8s.20211125.0.0.qcow2 k8s_worker_1.qcow2<br />
qemu-img create -f qcow2 worker_1_hdb.qcow2 10G<br />
virt-install --name k8s_worker_1 \<br />
--vcpus 2 \<br />
--ram 2048 \<br />
--os-variant altlinux1.0 \<br />
--import \<br />
--disk k8s_worker_1.qcow2 \<br />
--disk worker_1_hdb.qcow2 \<br />
--vnc \<br />
--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=$PWD/k8s_worker_1.ign"<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_1''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_1'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_1'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker01 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h17m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 30m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
kube-system pod/coredns-74ff55c5b-c9z4j 1/1 Running 0 3h22m 10.85.0.2 master01 <none> <none><br />
kube-system pod/coredns-74ff55c5b-s8ntc 1/1 Running 0 3h22m 10.85.0.3 master01 <none> <none><br />
kube-system pod/etcd-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-apiserver-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-controller-manager-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 35m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h22m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-scheduler-master01 1/1 Running 0 3h21m 192.168.122.65 master01 <none> <none><br />
<br />
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR<br />
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h22m <none><br />
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h22m k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 2 2 2 2 2 <none> 3h22m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 3h22m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR<br />
kube-system deployment.apps/coredns 2/2 2 2 3h22m coredns k8s.gcr.io/coredns:1.7.0 k8s-app=kube-dns<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR<br />
kube-system replicaset.apps/coredns-74ff55c5b 2 <br />
<br />
Количество работающих POD'ов ''kube-proxy'' и ''kube-flannel-ds'' должно быть равно двум - по одному на каждом узле кластера<br />
<br />
=== Установка worker-узла worker02 ===<br />
<br />
Установка worker-узла worker02 производится аналогичным образом:<br />
* скопируйте YML butane файл 'k8s_worker_1.yml' в k8s_worker_2.yml изменив в нем:<br />
* имя узла в файле ''/etc/hosts'' с ''worker01'' на ''worker02'';<br />
* IP-адрес сетевого интерфейса в файле ''/etc/systemd/network/20-wired.network'' с ''192.168.122.66'' на ''192.168.122.67'';<br />
* скопируйте стартовый скрипт ''createWorker1.sh'' в скрипт ''createWorker2.sh'' изменив в нем<br />
''worker_1'' на ''worker_2''.<br />
<br />
После запуска образа перейдите в одно ''Менеджера виртуальных машин'' и проверьте запуск виртуальной машины ''k8s_worker_2''.<br />
<br />
После запуска виртуальной машины ''k8s_worker_2'' (появления промптера ''login'' для входа)<br />
перейдите в терминальный интерфейс пользователя ''altcos'' виртуальной машины master-узла (''k8s_master_1'')<br />
и наберите команду удаленного вызова на виртуальной машине ''k8s_worker_2'' сервиса подключения к kubernetes-кластеру:<br />
ssh worker02 sudo systemctl start joink8s<br />
<br />
После завершения работы сервиса проверьте текущий список узлов кластера:<br />
$ kubectl get nodes -o wide<br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
master01 Ready control-plane,master 3h46m v1.20.8 192.168.122.65 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker01 Ready <none> 58m v1.20.8 192.168.122.66 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
worker02 Ready <none> 26s v1.20.8 192.168.122.67 <none> ALT Starterkit (Hypericum) 5.10.77-std-def-alt1 cri-o://1.20.0<br />
<br />
Проверьте вывод команды<br />
$ kubectl get all -A -o wide<br />
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES<br />
...<br />
kube-system pod/kube-flannel-ds-tgw4l 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-flannel-ds-xlkwf 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
kube-system pod/kube-flannel-ds-xv264 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-4xwm6 1/1 Running 0 61m 192.168.122.66 worker01 <none> <none><br />
kube-system pod/kube-proxy-rww95 1/1 Running 0 2m54s 192.168.122.67 worker02 <none> <none><br />
kube-system pod/kube-proxy-x4pwc 1/1 Running 0 3h48m 192.168.122.65 master01 <none> <none><br />
...<br />
<br />
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR<br />
kube-system daemonset.apps/kube-flannel-ds 3 3 3 3 3 <none> 3h48m kube-flannel quay.io/coreos/flannel:v0.15.1 app=flannel<br />
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 3h48m kube-proxy k8s.gcr.io/kube-proxy:v1.20.12 k8s-app=kube-proxy<br />
<br />
Количество работающих POD'ов kube-proxy и kube-flannel-ds должно быть равно трем - по одному на каждом узле кластера.<br />
<br />
Аналогичным образом добавляются и остальные рабочие узла kubernetes_кластера.<br />
<br />
=== Создание docker swarm кластера ===<br />
<br />
Для создания ''docker swarm'' кластера зайдите под пользователем ''altcos'' на master-узел ''master01'' и наберите команду инициализации кластера:<br />
$ sudo docker swarm init<br />
Swarm initialized: current node (...) is now a manager.<br />
<br />
To add a worker to this swarm, run the following command:<br />
<br />
docker swarm join --token ... 192.168.122.65:2377<br />
<br />
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<br />
<br />
Скопируйте строку подключения ''docker swarm join ...'' и запустите ее удаленно на рабочих узлах кластера: <br />
$ ssh worker01 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
$ ssh worker02 sudo docker swarm join --token ... 192.168.122.65:2377<br />
This node joined a swarm as a worker.<br />
<br />
Проверьте подключение узлов к ''docker swarm'' -кластеру:<br />
$ docker node ls<br />
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION<br />
78lkzptg0o3zlgmoz0dnxrevx * master01 Ready Active Leader 20.10.10<br />
ssdv63wtxm3ytom54fia93kg1 worker01 Ready Active 20.10.10<br />
1isza4rwiw3q2fykxdnuxp4pp worker02 Ready Active 20.10.10</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57154
ALT Container OS подветка K8S
2021-11-17T07:45:58Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[http://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211116.0.0.qcow2 Полный]]<br />
[[http://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211116.0.0.qcow2.xz Сжатый]]<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. Для этого создайте файл необходимого размера (например 30GB):<br />
<br />
qemu-img create -f qcow2 hdb.qcow2 30G<br />
<br />
== Запуск образа в режиме master-узла ==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа:<br />
* форматирование дополнительного диска под файловую систему ''BTRFS'' для размещения образов и контейнеров;<br />
* монтирование его в каталог ''/var/lib'';<br />
* копирование файлов конфигураций и "перекрытых" при монтировании подкаталогов каталога ''/var/lib/''. <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации '''k8s_master.yml ''' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: $y$j9T$ZEYmKSGPiNFOZNTjvobEm1$IXLGt5TxdNC/OhJyzFK5NVM.mt6VvdtP6mhhzSmvE94<br />
ssh_authorized_keys:<br />
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1/GiEhIOcqs14pHPU9tNPKmV9XswRK91KEfqnhLtl9wWkojzuFekosSbCiy6g9DKTWK7rps7uZ4HAAGAof78e60kRWFgNWkQQqG/NKe1rrb0Iwv7kWwGhIWysWgZi466suvEGRFy1ysBpP1K0ChMRti+BWOqe8+OVCjSgT0WpguzL4j6onTXT8WJNTInPty6Fcfw2nMeq0JOu6zh49eblKAuB8nYJqUCNXYy5XJVUB5Qg54dKi2V0kBzbUWeKLhSGsHyBWW6HMsuOC5U9PVAX++h1+25vEarLyK1/R1EhTATkFJ2c6AMCTkrbhlkij0KrnpyHWd7G7vMb14+6Ewih kaf@basealt<br />
<br />
storage:<br />
<br />
disks:<br />
-<br />
device: /dev/sdb<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: varlib<br />
<br />
filesystems:<br />
- path: /var/lib<br />
device: /dev/sdb1<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: varlib<br />
with_mount_unit: true<br />
<br />
trees:<br />
- local: root # скопировать файловое дерево локального каталога root<br />
path: /<br />
<br />
files:<br />
- path: /etc/docker/daemon.json # переписав файл конфигурации dockerd с поддержкой overlay-драйвера BTRFS<br />
overwrite: true<br />
<br />
- path: /etc/containers/storage.conf # переписав файл конфигурации crio/podman с поддержкой overlay-драйвера BTRFS<br />
overwrite: true<br />
<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
<br />
systemd:<br />
units:<br />
- name: initk8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm init --cri-socket=/var/run/crio/crio.sock --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
[Install]<br />
WantedBy=multi-user.target <br />
<br />
Каталог '''root''' имеет следующую структуру:<br />
<br />
root/<br />
└── etc<br />
├── containers<br />
│ └── storage.conf<br />
├── docker<br />
│ └── daemon.json<br />
├── profile.d<br />
│ └── kube.sh<br />
└── sudoers.d<br />
└── altcos<br />
<br />
Файлы ''/etc/containers/storage.conf'', ''/etc/docker/daemon.json'' являются стандартными файлами конфигурации для <br />
''CRI-O''('podman') и ''docker'' с измененными storage-драйверами с ''overlay'' на ''btrfs''.<br />
<br />
Файл ''/etc/profile.d/kube.sh' обеспечивает инициализацию переменной ''KUBECONFIG'' при работе под суперпользователем или инициализацию каталога ''~/.kube/'' при работе под пользователем ''altcos''.<br />
<br />
Файл ''/etc/sudoers.d/altcos'' обеспечивает беспарольный запуск ''sudo'' для удаленной инициализации узла кластера по протоколу ''ssh''. <br />
<br />
Архив каталога ''root'':<br />
[[Файл:Kuber root.tar|мини]]<br />
<br />
Если Вы планируете использовать стандартный storage-драйвер ''overlay'' то в в YML-файле, <br />
* секции ''storage.trees'', 'storage.files' можно опустить<br />
* в секции ''storage.filesystem.format'' указать ''ext4'';<br />
Каталог ''root'' в этом случае не нужен.<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом:<br />
<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.20211116.0.0.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
Каталог ''root'', содержащий файлы конфигурации ''/etc/containers/storage.conf'', ''/etc/docker/daemon.json'',<br />
должен находиться в каталоге запуска скрипта. <br />
Если это не так укажите при запуска команды butane после флага ''-d'' каталог месторасположение каталога ''root''.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8s'':<br />
$ sudo systemctl start initk8s<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8s<br />
<br />
Во время запуска длительностью пару минут:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
=== Работа с master-узлом кластера ===<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Файл ''~/.kube/config'' в домашнем каталоге пользователя ''altcos'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файле, <br />
при входе в пользователя ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя выполните команду:<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
<br />
=== Проверка работы master-узла ===<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Примеры запуска POD'ов смотрите в документе [[Kubernetes]].<br />
<br />
=== Действия после перезагрузке системы ===<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS_%D0%BF%D0%BE%D0%B4%D0%B2%D0%B5%D1%82%D0%BA%D0%B0_K8S&diff=57153
ALT Container OS подветка K8S
2021-11-17T06:51:52Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
Подветка '''K8S''' обеспечивает разворачивание серверов для организации kubernetes-кластера.<br />
<br />
В настоящее время (16.11.2021) дистрибутив ALTLinux обеспечивает разворачивание kubernetes-кластера под двумя типами <br />
"движков" (см. [[Kubernetes]]):<br />
* ''docker'';<br />
* ''CRI-O'' (''podman'')<br />
<br />
В текущей реализации был выбран вариант движка ''CRI-O'', обеспечивающий повышенный уровень защиты запускаемых контейнеров. <br />
Но, так как подветка ''K8S'' наследуется от основной ветки потока, включающей движок ''docker'',<br />
в рамках данной подветки можно запускать ''docker-контейнеры'', сервисы под ''docker-compose'' и организовывать <br />
параллельно (или вместо) с кластером ''kubernetes'' и ''docker swarm'' кластер. <br />
<br />
== QCOW2 образ подветки altcos/x86_64/Sisyphus/k8s ==<br />
<br />
В настоящее время реализован образ ''QCOW2'' подветки '''altcos/x86_64/sisyphus/k8s'''.<br />
Скачать его можно по следующим ссылкам:<br />
[[http://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211116.0.0.qcow2 Полный]]<br />
[[http://altcos.altlinux.org/ALTCOS/streams/altcos/x86_64/sisyphus/k8s/images/qcow2/k8s.20211116.0.0.qcow2.xz Сжатый]]<br />
<br />
Так как размер основного диска достаточно небольшой (около 4GB) для хранения образов и запуска pod'ов необходимо создать дополнительный диск. Для этого создайте файл необходимого размера (например 30GB):<br />
<br />
qemu-img create -f qcow2 hdb.qcow2 30G<br />
<br />
== Запуск образа в режиме master-узла ==<br />
<br />
=== Подготовка YML butane-файла для master-узла ===<br />
<br />
Для запуска необходимо подготовить YML butane-файл, обеспечивающий следующий функционал при запуске образа:<br />
* форматирование дополнительного диска под файловую систему ''BTRFS'' для размещения образов и контейнеров;<br />
* монтирование его в каталог ''/var/lib'';<br />
* копирование файлов конфигураций и "перекрытых" при монтировании подкаталогов каталога ''/var/lib/''. <br />
* создание systemd-сервиса для инициализации master-узла kubernetes-кластера.<br />
<br />
Файл конфигурации '''k8s_master.yml ''' выглядит следующим образом:<br />
variant: fcos<br />
version: 1.3.0<br />
passwd:<br />
users:<br />
- name: altcos<br />
groups:<br />
- wheel<br />
- docker<br />
password_hash: $y$j9T$ZEYmKSGPiNFOZNTjvobEm1$IXLGt5TxdNC/OhJyzFK5NVM.mt6VvdtP6mhhzSmvE94<br />
ssh_authorized_keys:<br />
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1/GiEhIOcqs14pHPU9tNPKmV9XswRK91KEfqnhLtl9wWkojzuFekosSbCiy6g9DKTWK7rps7uZ4HAAGAof78e60kRWFgNWkQQqG/NKe1rrb0Iwv7kWwGhIWysWgZi466suvEGRFy1ysBpP1K0ChMRti+BWOqe8+OVCjSgT0WpguzL4j6onTXT8WJNTInPty6Fcfw2nMeq0JOu6zh49eblKAuB8nYJqUCNXYy5XJVUB5Qg54dKi2V0kBzbUWeKLhSGsHyBWW6HMsuOC5U9PVAX++h1+25vEarLyK1/R1EhTATkFJ2c6AMCTkrbhlkij0KrnpyHWd7G7vMb14+6Ewih kaf@basealt<br />
<br />
storage:<br />
<br />
disks:<br />
-<br />
device: /dev/sdb<br />
wipe_table: true<br />
partitions:<br />
- number: 1<br />
label: varlib<br />
<br />
filesystems:<br />
- path: /var/lib<br />
device: /dev/sdb1<br />
format: btrfs<br />
wipe_filesystem: true<br />
label: varlib<br />
with_mount_unit: true<br />
<br />
trees:<br />
- local: root # скопировать файловое дерево локального каталога root<br />
path: /<br />
<br />
files:<br />
- path: /etc/docker/daemon.json # переписав файл конфигурации dockerd с поддержкой overlay-драйвера BTRFS<br />
overwrite: true<br />
<br />
- path: /etc/containers/storage.conf # переписав файл конфигурации crio/podman с поддержкой overlay-драйвера BTRFS<br />
overwrite: true<br />
<br />
- path: /etc/profile.d/kube.sh<br />
mode: 0755<br />
<br />
systemd:<br />
units:<br />
- name: initk8s.service<br />
enabled: false<br />
contents: |<br />
[Unit]<br />
Description=Start up kubernetes in master mode<br />
After=crio.service kube-proxy.service kubelet.service systemd-networkd.service systemd-resolved.service<br />
<br />
[Service]<br />
Type=oneshot<br />
RemainAfterExit=yes<br />
Environment="KUBECONFIG=/etc/kubernetes/admin.conf"<br />
ExecStartPre=loadDockerArchiveImages.sh<br />
ExecStart=kubeadm init --cri-socket=/var/run/crio/crio.sock --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification<br />
ExecStartPost=kubectl taint nodes localhost node-role.kubernetes.io/master-<br />
<br />
[Install]<br />
WantedBy=multi-user.target <br />
<br />
Каталог '''root''' имеет следующую структуру:<br />
<br />
root/<br />
└── etc<br />
├── containers<br />
│ └── storage.conf<br />
├── docker<br />
│ └── daemon.json<br />
├── profile.d<br />
│ └── kube.sh<br />
└── sudoers.d<br />
└── altcos<br />
<br />
Файлы ''/etc/containers/storage.conf'', ''/etc/docker/daemon.json'' являются стандартными файлами конфигурации для <br />
''CRI-O''('podman') и ''docker'' с измененными storage-драйверами с ''overlay'' на ''btrfs''.<br />
<br />
Файл ''/etc/profile.d/kube.sh' обеспечивает инициализацию переменной ''KUBECONFIG'' при работе под суперпользователем или инициализацию каталога ''~/.kube/'' при работе под пользователем ''altcos''.<br />
<br />
Файл ''/etc/sudoers.d/altcos'' обеспечивает беспарольный запуск ''sudo'' для удаленной инициализации узла кластера по протоколу ''ssh''. <br />
<br />
Архив каталога ''root'':<br />
[[Файл:Kuber root.tar|мини]]<br />
<br />
Если Вы планируете использовать стандартный storage-драйвер ''overlay'' то в в YML-файле, <br />
* секции ''storage.trees'', 'storage.files' можно опустить<br />
* в секции ''storage.filesystem.format'' указать ''ext4'';<br />
Каталог ''root'' в этом случае не нужен.<br />
<br />
=== Запуск образа как master-узла ===<br />
<br />
Запуск образа производится скриптом:<br />
<br />
#!/bin/sh<br />
if ! butane -d . -p k8s_master.yml > k8s_master.ign<br />
then<br />
exit 1;<br />
fi<br />
sudo qemu-system-x86_64 \<br />
-m 2048 \<br />
-machine accel=kvm \<br />
-cpu host \<br />
-smp 2 \<br />
-hda k8s.20211116.0.0.qcow2 \<br />
-hdb hdb.qcow2 \<br />
-fw_cfg name=opt/com.coreos/config,file=k8s_master.ign \<br />
-net user,hostfwd=tcp::10222-:22 -net nic<br />
<br />
Обратите внимание, что для работы узла ''kubernetes'' требуется не менее 2-х ядер процессора и не менее 2GB оперативной памяти.<br />
Каталог ''root'', содержащий файлы конфигурации ''/etc/containers/storage.conf'', ''/etc/docker/daemon.json'',<br />
должен находиться в каталоге запуска скрипта. <br />
Если это не так укажите при запуска команды butane после флага ''-d'' каталог месторасположение каталога ''root''.<br />
<br />
Доступ по протоколу ''ssh'' обеспечивается через порт ''10222'' HOST-компьютера ''localhost''.<br />
<br />
=== Запуск kubernetes на master-узле ===<br />
<br />
Для того, чтобы запустить сервис:<br />
* зайдите через консоль или через ssh под пользователем ''altcos'';<br />
* выполните запуск сервиса ''initk8s'':<br />
$ sudo systemctl start initk8s<br />
<br />
Данные действия можно сделать и "удаленно" по протоколу ''ssh'':<br />
ssh -p 10222 altcos@localhost sudo systemctl start initk8s<br />
<br />
Во время запуска длительностью пару минут:<br />
* производится загрузка из архива, входящего в состав qcow2-образа, необходимых docker-образов;<br />
* запуск их как сервисов;<br />
* инициализация master-узла кластера;<br />
<br />
Логи запуска можно посмотреть командой:<br />
<br />
$ journalctl -u initk8s<br />
Starting Start up kubernetes in master mode...<br />
...<br />
Loaded image(s): k8s.gcr.io/coredns:1.7.0<br />
...<br />
Loaded image(s): k8s.gcr.io/etcd:3.4.13-0<br />
...<br />
Your Kubernetes control-plane has initialized successfully!<br />
...<br />
Then you can join any number of worker nodes by running the following on each as root:<br />
kubeadm join 10.0.2.15:6443 --token yhhb22.0q7bovdkg89l6hr7 \<br />
--discovery-token-ca-cert-hash sha256:16a864c569f23a5ecacafe5cb42931840fc7e4896b8c3946d0710133ea0b82bc<br />
...<br />
node/localhost untainted<br />
Finished Start up kubernetes in master mode.<br />
<br />
Рабочие (''worker'') узлы можно присоединять к кластеру указанной командой<br />
<br />
kubeadm join ...<br />
<br />
=== Работа с master-узлом кластера ===<br />
<br />
Вы можете работать с мастер узлом как под обычным пользователем (например ''altcos''), так и от имени суперпользователя.<br />
<br />
Для работы с master-узлом кластера под обычным пользователем с правами выполнения ''sudo'' выполните следующие команды:<br />
<br />
mkdir -p ~/.kube<br />
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config<br />
sudo chown $(id -u):$(id -g) ~/.kube/config<br />
<br />
Файл ''~/.kube/config'' автоматически создается скриптом ''/etc/profile.d/kube.sh'', описанным в YML-butane файла <br />
при входе в пользователь ''altcos'' после инициализации узла кластера.<br />
<br />
Для работы с master-узлом кластера из суперпользователя выполните команду:<br />
export KUBECONFIG=/etc/kubernetes/admin.conf<br />
<br />
=== Проверка работы master-узла ===<br />
<br />
Для проверки работы узла наберите команду<br />
# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
localhost Ready control-plane,master 41m v1.20.8<br />
<br />
Примеры запуска POD'ов смотрите в документе [[Kubernetes]].<br />
<br />
=== Действия после перезагрузке системы ===<br />
<br />
После перезагрузки системы никаких дополнительных действий не требуется.<br />
master-узел kubernetes-кластера поднимается автоматически.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56643
ALT Container OS
2021-10-11T06:22:34Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
* минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
* монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
* поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
* автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
* поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно установить с помощью ISO-образа или при помощи ignition настроить QCOW2.<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Установка ALTCOS из ISO ==<br />
В загрузочном меню выбрать пункт "Install ALTCOS" или дождаться, когда он будет выбран через 10 секунд по умолчанию.<br><br />
[[Файл:ALTCOS boot menu install.png|безрамки]]<br><br><br />
После завершения загрузки отображаются подсказки команд. Доступна мышь, чтобы скопировать эти команды в командную строку.<br><br />
[[Файл:ALTCOS install after boot.png|безрамки]]<br><br />
Пример конфигурационного файла ignition, полное имя которого указано в примере команды установки, позволяет установить пароль "1" пользователю с именем altcos. Если требуется другой пароль, можно его сгенерировать командой <br><br />
<tt><br />
mkpasswd --method=yescrypt<br />
</tt><br />
Конфигурационный файл ignition можно загрузить доступными в установочном ISO командами scp и curl.<br><br />
При помощи lsblk определить имя файла устройства, на которое будет выполняться установка, и передать его в качестве первого параметра скрипту altcos-installer.sh. Второй параметр — полный путь к конфигу ignition.<br><br />
[[Файл:ALTCOS install lsblk.png|безрамки]]<br><br><br />
Установка выполняется на весь диск, и значит все данные, находившиеся на нем до установки, будут удалены. На предупреждение об этом следует нажать клавишу "y".<br><br />
[[Файл:ALTCOS install warning .png|безрамки]]<br><br><br />
Установщик спросит пароль root.<br><br />
[[Файл:ALTCOS install root password.png|безрамки]]<br><br><br />
Установка завершится вопросом о необходимости перезагрузки. При нажатии клавиши "y" будет выполнена перезагрузка.<br><br />
[[Файл:ALTCOS install reboot.png|безрамки]]<br><br><br />
Загрузиться в свежеустановленную систему можно будет, выбрав в загрузочном меню пункт загрузки с жесткого диска.<br><br />
[[Файл:ALTCOS install boot from 1st HDD.png|безрамки]]<br><br><br />
На рисунке ниже представлен результат загрузки.<br><br />
[[Файл:ALTCOS install result.png|безрамки]]<br />
<br />
== Запуск ALTCOS из QCOW2 ==<br />
При первом запуске ALTCOS из образа QCOW2 надо передать qemu параметр командой строки "-fw_cfg name=opt/com.coreos/config,file=/path/to/config.ign", в котором прописать путь к своему конфигурационному файлу ignition. Пример конфига, в котором устанавливается пароль пользователя altcos можно найти по ссылке http://git.altlinux.org/gears/s/startup-installer-acos.git?p=startup-installer-acos.git;a=blob_plain;f=altcos/config_example.ign;hb=3a2fa607922539331ee5c78044c67e118dfa689f<br><br />
[[Файл:ALTCOS QCOW2.png|безрамки]]<br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
* Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
* По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
* Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<tt><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</tt><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56642
ALT Container OS
2021-10-11T06:21:16Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
* минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
* монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
* поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
* автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
* поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно установить с помощью ISO-образа или при помощи ignition настроить QCOW2.<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Установка ALTCOS из ISO ==<br />
В загрузочном меню выбрать пункт "Install ALTCOS" или дождаться, когда он будет выбран через 10 секунд по умолчанию.<br><br />
[[Файл:ALTCOS boot menu install.png|безрамки]]<br><br><br />
После завершения загрузки отображаются подсказки команд. Доступна мышь, чтобы скопировать эти команды в командную строку.<br><br />
[[Файл:ALTCOS install after boot.png|безрамки]]<br><br />
Пример конфигурационного файла ignition, полное имя которого указано в примере команды установки, позволяет установить пароль "1" пользователю с именем altcos. Если требуется другой пароль, можно его сгенерировать командой <br><br />
<tt><br />
mkpasswd --method=yescrypt<br />
</tt><br><br><br />
Конфигурационный файл ignition можно загрузить доступными в установочном ISO командами scp и curl. См. [[Подготовка конфигурационного файла ignition]]<br><br />
При помощи lsblk определить имя файла устройства, на которое будет выполняться установка, и передать его в качестве первого параметра скрипту altcos-installer.sh. Второй параметр — полный путь к конфигу ignition.<br><br />
[[Файл:ALTCOS install lsblk.png|безрамки]]<br><br><br />
Установка выполняется на весь диск, и значит все данные, находившиеся на нем до установки, будут удалены. На предупреждение об этом следует нажать клавишу "y".<br><br />
[[Файл:ALTCOS install warning .png|безрамки]]<br><br><br />
Установщик спросит пароль root.<br><br />
[[Файл:ALTCOS install root password.png|безрамки]]<br><br><br />
Установка завершится вопросом о необходимости перезагрузки. При нажатии клавиши "y" будет выполнена перезагрузка.<br><br />
[[Файл:ALTCOS install reboot.png|безрамки]]<br><br><br />
Загрузиться в свежеустановленную систему можно будет, выбрав в загрузочном меню пункт загрузки с жесткого диска.<br><br />
[[Файл:ALTCOS install boot from 1st HDD.png|безрамки]]<br><br><br />
На рисунке ниже представлен результат загрузки.<br><br />
[[Файл:ALTCOS install result.png|безрамки]]<br />
<br />
== Запуск ALTCOS из QCOW2 ==<br />
При первом запуске ALTCOS из образа QCOW2 надо передать qemu параметр командой строки "-fw_cfg name=opt/com.coreos/config,file=/path/to/config.ign", в котором прописать путь к своему конфигурационному файлу ignition. Пример конфига, в котором устанавливается пароль пользователя altcos можно найти по ссылке http://git.altlinux.org/gears/s/startup-installer-acos.git?p=startup-installer-acos.git;a=blob_plain;f=altcos/config_example.ign;hb=3a2fa607922539331ee5c78044c67e118dfa689f<br><br />
[[Файл:ALTCOS QCOW2.png|безрамки]]<br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
* Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
* По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
* Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<tt><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</tt><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56641
ALT Container OS
2021-10-11T06:19:35Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
* минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
* монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
* поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
* автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
* поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно установить с помощью ISO-образа или при помощи ignition настроить QCOW2.<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Установка ALTCOS из ISO ==<br />
В загрузочном меню выбрать пункт "Install ALTCOS" или дождаться, когда он будет выбран через 10 секунд по умолчанию.<br><br />
[[Файл:ALTCOS boot menu install.png|безрамки]]<br><br><br />
После завершения загрузки отображаются подсказки команд. Доступна мышь, чтобы скопировать эти команды в командную строку.<br><br />
[[Файл:ALTCOS install after boot.png|безрамки]]<br><br />
Пример конфигурационного файла ignition, полное имя которого указано в примере команды установки, позволяет установить пароль "1" пользователю с именем altcos. Если требуется другой пароль, можно его сгенерировать командой <br><br />
<tt><br />
mkpasswd --method=yescrypt<br />
</tt><br><br><br />
Конфигурационный файл ignition можно загрузить доступными в установочном ISO командами scp и curl. См. [[Подготовка конфигурационного файла ignition]]<br><br />
При помощи lsblk определить имя файла устройства, на которое будет выполняться установка, и передать его в качестве первого параметра скрипту altcos-installer.sh. Второй параметр — полный путь к конфигу ignition.<br><br />
[[Файл:ALTCOS install lsblk.png|безрамки]]<br><br><br />
Установка выполняется на весь диск, и значит все данные, находившиеся на нем до установки, будут удалены. На предупреждение об этом следует нажать клавишу "y".<br><br />
[[Файл:ALTCOS install warning .png|безрамки]]<br><br><br />
Установщик спросит пароль root.<br><br />
[[Файл:ALTCOS install root password.png|безрамки]]<br><br><br />
Установка завершится вопросом о необходимости перезагрузки. При нажатии клавиши "y" будет выполнена перезагрузка.<br><br />
[[Файл:ALTCOS install reboot.png|безрамки]]<br><br><br />
Загрузиться в свежеустановленную систему можно будет, выбрав в загрузочном меню пункт загрузки с жесткого диска.<br><br />
[[Файл:ALTCOS install boot from 1st HDD.png|безрамки]]<br><br><br />
На рисунке ниже представлен результат загрузки.<br><br />
[[Файл:ALTCOS install result.png|безрамки]]<br />
<br />
== Запуск ALTCOS из QCOW2 ==<br />
При первом запуске ALTCOS из образа QCOW2 надо передать qemu параметр командой строки "-fw_cfg name=opt/com.coreos/config,file=/path/to/config.ign", в котором прописать путь к своему конфигурационному файлу ignition. Пример конфига, в котором устанавливается пароль пользователя altcos можно найти по ссылке http://git.altlinux.org/gears/s/startup-installer-acos.git?p=startup-installer-acos.git;a=blob_plain;f=altcos/config_example.ign;hb=3a2fa607922539331ee5c78044c67e118dfa689f<br><br />
[[Файл:ALTCOS QCOW2.png|безрамки]]<br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
* Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
* По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
* Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56640
ALT Container OS
2021-10-11T06:11:58Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
* минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
* монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
* поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
* автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
* поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно установить с помощью ISO-образа или при помощи ignition настроить QCOW2.<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Установка ALTCOS из ISO ==<br />
В загрузочном меню выбрать пункт "Install ALTCOS" или дождаться, когда он будет выбран через 10 секунд по умолчанию.<br><br />
[[Файл:ALTCOS boot menu install.png|безрамки]]<br><br><br />
После завершения загрузки отображаются подсказки команд. Доступна мышь, чтобы скопировать эти команды в командную строку.<br><br />
[[Файл:ALTCOS install after boot.png|безрамки]]<br><br />
Пример конфигурационного файла ignition, полное имя которого указано в примере команды установки, позволяет установить пароль "1" пользователю с именем altcos. Если требуется другой пароль, можно его сгенерировать командой <br><br />
<tt>mkpasswd --method=yescrypt</tt><br><br><br />
Конфигурационный файл ignition можно загрузить доступными в установочном ISO командами scp и curl. См. [[Подготовка конфигурационного файла ignition]]<br><br />
При помощи lsblk определить имя файла устройства, на которое будет выполняться установка, и передать его в качестве первого параметра скрипту altcos-installer.sh. Второй параметр — полный путь к конфигу ignition.<br><br />
[[Файл:ALTCOS install lsblk.png|безрамки]]<br><br><br />
Установка выполняется на весь диск, и значит все данные, находившиеся на нем до установки, будут удалены. На предупреждение об этом следует нажать клавишу "y".<br><br />
[[Файл:ALTCOS install warning .png|безрамки]]<br><br><br />
Установщик спросит пароль root.<br><br />
[[Файл:ALTCOS install root password.png|безрамки]]<br><br><br />
Установка завершится вопросом о необходимости перезагрузки. При нажатии клавиши "y" будет выполнена перезагрузка.<br><br />
[[Файл:ALTCOS install reboot.png|безрамки]]<br><br><br />
Загрузиться в свежеустановленную систему можно будет, выбрав в загрузочном меню пункт загрузки с жесткого диска.<br><br />
[[Файл:ALTCOS install boot from 1st HDD.png|безрамки]]<br><br><br />
На рисунке ниже представлен результат загрузки.<br><br />
[[Файл:ALTCOS install result.png|безрамки]]<br />
<br />
== Запуск ALTCOS из QCOW2 ==<br />
При первом запуске ALTCOS из образа QCOW2 надо передать qemu параметр командой строки "-fw_cfg name=opt/com.coreos/config,file=/path/to/config.ign", в котором прописать путь к своему конфигурационному файлу ignition. Пример конфига, в котором устанавливается пароль пользователя altcos можно найти по ссылке http://git.altlinux.org/gears/s/startup-installer-acos.git?p=startup-installer-acos.git;a=blob_plain;f=altcos/config_example.ign;hb=3a2fa607922539331ee5c78044c67e118dfa689f<br><br />
[[Файл:ALTCOS QCOW2.png|безрамки]]<br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
• Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
• По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
• Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56639
ALT Container OS
2021-10-11T06:09:56Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно установить с помощью ISO-образа или при помощи ignition настроить QCOW2.<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Установка ALTCOS из ISO ==<br />
В загрузочном меню выбрать пункт "Install ALTCOS" или дождаться, когда он будет выбран через 10 секунд по умолчанию.<br><br />
[[Файл:ALTCOS boot menu install.png|безрамки]]<br><br><br />
После завершения загрузки отображаются подсказки команд. Доступна мышь, чтобы скопировать эти команды в командную строку.<br><br />
[[Файл:ALTCOS install after boot.png|безрамки]]<br><br />
Пример конфигурационного файла ignition, полное имя которого указано в примере команды установки, позволяет установить пароль "1" пользователю с именем altcos. Если требуется другой пароль, можно его сгенерировать командой <br><br />
<tt>mkpasswd --method=yescrypt</tt><br><br><br />
Конфигурационный файл ignition можно загрузить доступными в установочном ISO командами scp и curl. См. [[Подготовка конфигурационного файла ignition]]<br><br />
При помощи lsblk определить имя файла устройства, на которое будет выполняться установка, и передать его в качестве первого параметра скрипту altcos-installer.sh. Второй параметр — полный путь к конфигу ignition.<br><br />
[[Файл:ALTCOS install lsblk.png|безрамки]]<br><br><br />
Установка выполняется на весь диск, и значит все данные, находившиеся на нем до установки, будут удалены. На предупреждение об этом следует нажать клавишу "y".<br><br />
[[Файл:ALTCOS install warning .png|безрамки]]<br><br><br />
Установщик спросит пароль root.<br><br />
[[Файл:ALTCOS install root password.png|безрамки]]<br><br><br />
Установка завершится вопросом о необходимости перезагрузки. При нажатии клавиши "y" будет выполнена перезагрузка.<br><br />
[[Файл:ALTCOS install reboot.png|безрамки]]<br><br><br />
Загрузиться в свежеустановленную систему можно будет, выбрав в загрузочном меню пункт загрузки с жесткого диска.<br><br />
[[Файл:ALTCOS install boot from 1st HDD.png|безрамки]]<br><br><br />
На рисунке ниже представлен результат загрузки.<br><br />
[[Файл:ALTCOS install result.png|безрамки]]<br />
<br />
== Запуск ALTCOS из QCOW2 ==<br />
При первом запуске ALTCOS из образа QCOW2 надо передать qemu параметр командой строки "-fw_cfg name=opt/com.coreos/config,file=/path/to/config.ign", в котором прописать путь к своему конфигурационному файлу ignition. Пример конфига, в котором устанавливается пароль пользователя altcos можно найти по ссылке http://git.altlinux.org/gears/s/startup-installer-acos.git?p=startup-installer-acos.git;a=blob_plain;f=altcos/config_example.ign;hb=3a2fa607922539331ee5c78044c67e118dfa689f<br><br />
[[Файл:ALTCOS QCOW2.png|безрамки]]<br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
• Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
• По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
• Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56638
ALT Container OS
2021-10-11T06:08:36Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition настроить QCOW2.<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Запуск ALTCOS из QCOW2 ==<br />
При первом запуске ALTCOS из образа QCOW2 надо передать qemu параметр командой строки "-fw_cfg name=opt/com.coreos/config,file=/path/to/config.ign", в котором прописать путь к своему конфигурационному файлу ignition. Пример конфига, в котором устанавливается пароль пользователя altcos можно найти по ссылке http://git.altlinux.org/gears/s/startup-installer-acos.git?p=startup-installer-acos.git;a=blob_plain;f=altcos/config_example.ign;hb=3a2fa607922539331ee5c78044c67e118dfa689f<br><br />
[[Файл:ALTCOS QCOW2.png|безрамки]]<br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
• Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
• По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
• Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56637
ALT Container OS
2021-10-11T06:04:13Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
== Автоматическое обновление ALTCOS ==<br />
После загрузки системы запускается сервис zincati, контролирующий наличие новых версий установленного потока (altcos/x86_64/sisyphus, altcos/x86_64/p10, …). При появлении новой версии происходит ее автоматическая загрузка и, в зависимости от режима, перезагрузка системы. Поддерживаются следующие режимы перезагрузки:<br />
• Немедленная. Если в системе нет пользователей — немедленная перезагрузка. Если есть — рассылка сообщений пользователям, ожидание их выхода и перезагрузка после их выхода или через 10 минут.<br />
• По расписанию. Перезагрузка происходит в указанный интервал времени.<br />
• Согласованная. Перезагрузка производится с участием центрального сервиса, контролирующего порядок перезагрузки серверов кластера для минимизации времени простоя ключевых сервисов.<br />
<br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56636
ALT Container OS
2021-10-11T06:03:04Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
== Ручное обновление ALTCOS ==<br />
Для ручного обновления используется команда<br><br />
<tt><br />
ostree admin upgrade<br />
</tt><br />
<br><br />
После выполнения этой команды можно посмотреть состояние. Новая загрузочная среда будет обозначена словом pending.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0 ('''pending''')<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
* alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br><br />
В загрузочном меню появится новый пункт меню, соответствующий новой загрузочной среде. Он будет выбран по умолчанию.<br><br />
[[Файл:ALTCOS upgrade boot menu.png|безрамки]]<br><br><br />
После перезагрузки в новую загрузочную среду старая будет обозначена словом rollback.<br><br />
<tt><br />
[root@localhost altcos]# ostree admin status<br />
* alt-containeros c5d2012fe6a8ddd2526305fc78f5018b3962b1334ce237598b4356e2eb9eee7c.0<br />
Version: sisyphus.20211006.1.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
alt-containeros 5e5befec2377dc5a7ee801f816ee5e63a625809379cf375131704a3a57ffbad7.0 ('''rollback''')<br />
Version: sisyphus.20211006.0.0<br />
origin refspec: altcos:altcos/x86_64/sisyphus<br />
[root@localhost altcos]# </tt><br />
<br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56635
ALT Container OS
2021-10-11T06:02:07Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]<br><br />
== Подготовка конфигурационного файла ignition ==<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign<br />
<br />
== Работа с контейнерами в ALTCOS ==<br />
ALT Container OS поддерживает два основных режима работы с контейнерами:<br><br />
* серверный — демон dockerd с клиентским приложением docker;<br />
* бессерверный — клиентское приложение podman.<br />
<br><br />
Серверный вариант позволяет клиентским приложениям (docker, ...) работать с демоном dockerd как локально, так и удаленно через REST-интерфейс, но считается менее защищенным, чем бессерверный вариант podman.<br><br />
Бессерверный вариант podman, появившийся относительно недавно, выполняет функции сервера и работает напрямую с файловой системой.<br><br />
Оба клиентских приложения имеют похожий набор команд, но хранят образы и контейнеры в различных каталогах. Образы, скачанные приложением docker, недоступны приложению podman и наоборот.<br><br />
<br><br />
Серверный вариант (docker, dockerd) удобен для проектов с небольшим числом запускаемых сервисов (не более десятка). <br><br />
Он позволяет запускать как отдельные контейнеры, так и по YML-файлу описания стеки сервисов как на одном сервере (через docker-compose), так и на кластере серверов (docker stack).<br><br />
<br><br />
Бессерверный вариант (podman) позволяет запускать отдельные контейнеры и может (как и серверный вариант) использоваться в кластере kubernetes.<br><br />
<br />
=== Примеры работы в режиме docker ===<br />
==== Запуск контейнера ====<br />
Скачайте базовый образ платформы p8 alt:p8:<br />
$ docker pull alt:p8<br />
latest: Pulling from library/alt <br />
86bd305d9be6: Pull complete <br />
006b17da3256: Pull complete <br />
Digest: sha256:c4eb4ad40440b7c3297c14c91048aa07cbe2534f9e629f4bc9b0d113ca57821f <br />
Status: Downloaded newer image for alt:latest <br />
docker.io/library/alt:latest<br />
<br />
Запустите каманды echo и cat в контейнере образа:<br />
$ docker run --rm -i alt:p8 sh -c "echo -ne 'Привет из docker-контейнера '; cat /etc/altlinux-release"<br />
<br />
Привет из docker-контейнера ALT p8 starter kit (Hypericum)<br />
<br />
==== Пример работы в режиме docker-compose ====<br />
В данном примере разворачивается стек из двух сервисов:<br />
* postgres — сервис базы данных postgres 13-й версии;<br />
* pgadmin — административный WEB-интерфейс для работы с сервером.<br />
Для запуска сервиса административного интерфейса используется официальный образ dpage/pgadmin4. <br><br />
Для запуска сервера базы данных используется образ kafnevod/alt.p8-postgres:13, собранный на базе образа alt:p10. <br><br />
Для сборки образа kafnevod/alt.p8-postgres:13 использовался следующий Dockerfile:<br><br />
FROM alt:p10<br />
<br />
ENV PGPASS=q1w2e3<br />
<br />
RUN \<br />
apt-get update; \<br />
apt-get install -y postgresql13-server;<br />
<br />
RUN \<br />
echo -ne "$PGPASS\n$PGPASS\n" | su -s /bin/sh -l postgres -c 'initdb --pgdata="/var/lib/pgsql/data" --locale="ru_RU.UTF-8" -U postgres -W'; \<br />
sed -i -e "/^#listen_addresses/a\<br />
listen_addresses = '*'" /var/lib/pgsql/data/postgresql.conf; \<br />
echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf<br />
<br />
CMD exec su -c "/usr/bin/postgres -D /var/lib/pgsql/data $POSTGRES_PARAMS" -s /bin/sh postgres<br />
<br><br />
В переменной PGPASS задается пароль администатора базы данных postgres. После установки пакета postgresql13-server в файлах конфигурации включается прием соединения по протоколу TCP/IP и авторизацию md5.<br><br />
===== Файл docker-compose.yml для запуска сервисов: =====<br />
В файле docker-compose.yml для сервера базы данных задается именованный том для хранения базы данных, а также логин и пароль для работы с административным интерфейсом:<br />
version: "3"<br />
<br />
services:<br />
postgres:<br />
image: kafnevod/alt.p8-postgres:13<br />
volumes:<br />
- DB:/var/lib/pgsql/data<br />
<br />
pgadmin:<br />
image: dpage/pgadmin4<br />
environment:<br />
- PGADMIN_DEFAULT_EMAIL=test@altcos.altlinux.org<br />
- PGADMIN_DEFAULT_PASSWORD=Secret<br />
ports:<br />
- 80:80<br />
<br />
volumes:<br />
DB:<br />
<br />
<br />
<br />
===== Запуск сервисов =====<br />
Сервисы запускаются командой docker-compose:<br />
$ docker-compose up -d <br />
Creating network "docker-compose_default" with the default driver <br />
Creating volume "docker-compose_DB" ис запцскается в виртуальном with default driver <br />
Creating docker-compose_postgres_1 ... done <br />
Creating docker-compose_pgadmin_1 ... done<br />
<br />
<br />
===== Настройка и работа с pgadmin4 через WEB-интерфейс =====<br />
После запуска сервисов в браузере укажите URL http:<IP-адрес-сервера-altcos> (если сервер запускается в виртуальном окружении не забудьте пробросить порт 80 наружу):<br><br />
[[Файл:ALTCOS examples pgadmin.png|безрамки]]<br><br />
В поле Login введите значение переменной _PGADMIN_DEFAULT_EMAIL, в поле пароля значение переменной PGADMIN_DEFAULT_PASSWORD файла docker-compose.yml.<br><br />
[[Файл:ALTCOS examples pgadmin2.png|безрамки]]<br><br />
В закладке General в поле Name введите имя базы данных: postgres.<br><br />
[[Файл:ALTCOS examples pgadmin3.png|безрамки]]<br><br />
В закладке Connection <br />
* в поле Host введите имя сервиса postgres файла docker-compose.yml;<br />
* в полях Maintenance database, Username имя базы (postgres) и имя пользователя (postgres)<br />
* в поле Password значение переменной PGPASS файла Dockerfile.<br />
<br />
После нажатия клавиши Save в окне браузера отобразится интерфейс для работы с базой данных.<br><br />
[[Файл:ALTCOS examples pgadmin4.png|безрамки]]<br />
<br />
=== Пример работы в режиме podman ===<br />
Скачайте образ fanux/tetris<br />
$ sudo podman pull --all-tags fanux/tetris <br />
Trying to pull docker.io/fanux/tetris:latest... <br />
Getting image source signatures <br />
Copying blob 08d48e6f1cff done <br />
Copying blob abf1e846b79b done <br />
Copying blob 92f626025fce done <br />
Copying blob 5bd1005002cc done <br />
Copying config 82f6127899 done <br />
Writing manifest to image destination <br />
Storing signatures <br />
82f61278995f8c959b38174bc66bc053289cbb68cc47b2edca1ff10fafe28828<br />
<br />
Запустите игру<br />
$ sudo podman run --rm -it fanux/tetris game<br />
<br />
[[Файл:ALTCOS examples tetris.png|безрамки]]<br />
<br />
=== Установка описанных примеров при развертывании ALTCOS ===<br />
<br />
Использовав во время установки ignition-файл https://altcos.altlinux.org//configs/ignition/testContainers.ign <br />
(butane-файл https://altcos.altlinux.org//configs/butane/testContainers.btn) <br />
Вы в каталоге ''/opt/'' получаете развернутое дерево для запуска описанных примеров.<br />
<source><br />
/opt/altcos/<br />
`-- examples<br />
`-- docker<br />
|-- docker<br />
| `-- hello.sh<br />
|-- docker-compose<br />
| |-- docker-compose.yml<br />
| |-- start.sh<br />
| `-- stop.sh<br />
`-- podman<br />
`-- tetris.sh<br />
</source><br />
* ''/opt/altcos/examples/docker/docker'' - скрипт ''hello.sh'' запуска контейнера;<br />
* ''/opt/altcos/examples/docker/docker-compose'' - файл описания сервисов ''docker-compose.yml'' и с <br />
крипты запуска и остановки сервисов;<br />
* ''/opt/altcos/examples/podman/tetris.sh'' - скрипт запуска контейнера игры ''tetris'' через ''podman''.</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56585
ALT Container OS
2021-10-06T14:44:05Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]<br><br />
[[Подготовка конфигурационного файла ignition]]<br><br />
[[Работа с контейнерами в ALTCOS]]<br></div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56584
ALT Container OS
2021-10-06T14:43:03Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]<br><br />
[[Подготовка конфигурационного файла ignition]]<br><br />
[[Работа сконтейнерами в ALTCOS]]<br></div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56583
ALT Container OS
2021-10-06T14:38:30Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]<br><br />
[[Подготовка конфигурационного файла ignition]]<br><br />
[[Работа_с_контейнерами_в_ALTCOS]]<br></div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_examples_tetris.png&diff=56581
Файл:ALTCOS examples tetris.png
2021-10-06T14:37:45Z
<p>Keremet: </p>
<hr />
<div>ALTCOS_examples_tetris</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_examples_pgadmin4.png&diff=56580
Файл:ALTCOS examples pgadmin4.png
2021-10-06T14:34:45Z
<p>Keremet: </p>
<hr />
<div>ALTCOS_examples_pgadmin4</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_examples_pgadmin3.png&diff=56579
Файл:ALTCOS examples pgadmin3.png
2021-10-06T14:26:12Z
<p>Keremet: </p>
<hr />
<div>ALTCOS_examples_pgadmin3</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_examples_pgadmin2.png&diff=56578
Файл:ALTCOS examples pgadmin2.png
2021-10-06T14:24:28Z
<p>Keremet: </p>
<hr />
<div>ALTCOS_examples_pgadmin2</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_examples_pgadmin.png&diff=56577
Файл:ALTCOS examples pgadmin.png
2021-10-06T14:19:47Z
<p>Keremet: </p>
<hr />
<div>Примеры использования ALTCOS. pgadmin</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56574
ALT Container OS
2021-10-06T14:04:47Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]<br><br />
[[Подготовка конфигурационного файла ignition]]<br></div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56573
ALT Container OS
2021-10-06T14:04:36Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]<br />
[[Подготовка конфигурационного файла ignition]]</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%9F%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_ignition&diff=56572
Подготовка конфигурационного файла ignition
2021-10-06T14:04:14Z
<p>Keremet: Новая страница: «Категория:Руководства Формат конфигов ignition (JSON) человекочитаемый, но сложный для напи…»</p>
<hr />
<div>[[Категория:Руководства]]<br />
Формат конфигов ignition (JSON) человекочитаемый, но сложный для написания. Удобнее писать конфиг на YAML, а затем с помощью butane (https://coreos.github.io/butane/) преобразовывать YAML в JSON. Утилиту butane можно установить командой <br />
apt-get install butane<br />
<br />
Для преобразования конфига из YAML в JSON можно использовать команду<br />
butane < cfg.yaml > cfg.ign</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56571
ALT Container OS
2021-10-06T14:02:43Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br><br />
[[Ручное обновление ALTCOS]]</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56570
ALT Container OS
2021-10-06T14:02:34Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]<br />
[[Ручное обновление ALTCOS]]</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_upgrade_boot_menu.png&diff=56568
Файл:ALTCOS upgrade boot menu.png
2021-10-06T13:58:48Z
<p>Keremet: </p>
<hr />
<div>Обновление ALTCOS. Загрузочное меню после обновления</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56567
ALT Container OS
2021-10-06T13:48:50Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br><br />
<br />
[[Автоматическое обновление ALTCOS]]</div>
Keremet
https://www.altlinux.org/index.php?title=ALT_Container_OS&diff=56565
ALT Container OS
2021-10-06T13:45:37Z
<p>Keremet: </p>
<hr />
<div>[[Категория:Руководства]]<br />
ALT Container OS (ALTCOS) — дистрибутив на основе пакетной базы ALT Linux, являющий аналогом Fedora CoreOS, имеющий следующие особенности:<br />
• минимальный набор пакетов для поддержки контейнеризации (docker, podman);<br />
• монолитность — атомарные обновления с возможностью отката на предыдущую версию;<br />
• поддержка потоков, отличающихся по репозиториям ALT Linux и архитектурам. На данный момент (27.09.2021) поддерживается только поток altcos/x86_64/sisyphus (архитектура x86_64, репозиторий sisyphus). В дальнейшем планируется добавить потоки для других архитектур и репозитория p10;<br />
• автоматическое развертывание на множестве (виртуальных) машин без участия оператора;<br />
• поддержка различных режимов автоматического обновления дистрибутива без участия оператора, в том числе режима с согласованной перезагрузкой узлов кластера, при которой кластер сохраняет свою работоспособность.<br />
<br />
Обновления ALTCOS выполняются с помощью ostree, что позволяет обновить систему целиком за одно действие и при необходимости загрузиться в предыдущее состояние.<br><br />
Во время установки для первоначальной настройки используется технология ignition (https://coreos.github.io/ignition/getting-started/). Она позволяет, предварительно описав шаблоны конфигурации (пользователей, сетевые настройки, запускаемые сервисы, …) в ignition-файлах, без участия оператора разворачивать систему на множестве серверов локальной сети или облака.<br><br />
В ALTCOS есть специальный пользователь altcos, включенный в группы docker и wheel, то есть имеющий право запускать команды docker и sudo. Во время первоначальной настройки через ignition можно установить пароль пользователям altcos и root.<br><br />
В настоящее время (27.09.2021) ALTCOS можно [[Установка ALTCOS из ISO|установить с помощью ISO-образа]] или при помощи ignition [[Запуск ALTCOS из QCOW2|настроить QCOW2]].<br><br />
В дальнейшем планируется поддержка установки в различные облачные среды, а также сетевой установки с использованием PXE.<br></div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_QCOW2.png&diff=56563
Файл:ALTCOS QCOW2.png
2021-10-06T13:44:24Z
<p>Keremet: </p>
<hr />
<div>Запуск ALTCOS из QCOW2</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_install_result.png&diff=56561
Файл:ALTCOS install result.png
2021-10-06T13:38:52Z
<p>Keremet: </p>
<hr />
<div>Установка ALTCOS. Результат</div>
Keremet
https://www.altlinux.org/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ALTCOS_install_boot_from_1st_HDD.png&diff=56560
Файл:ALTCOS install boot from 1st HDD.png
2021-10-06T13:35:39Z
<p>Keremet: </p>
<hr />
<div>Установка ALTCOS. Загрузка с первого жесткого диска</div>
Keremet