На практике не рассматриваю вариант облака – оно очень дорого.
По сути 2 основных варианта:
- частное облако с использованием Kubernetes
- виртуальные машины
Понятно, что если уже есть Kubernetes, то адекватно продолжать им пользоваться. Если его нет, то не всегда лучший вариант начинать его требовать. Но что же тогда делать?
Как промежуточный вариант, я обычно ставлю решение через Podman: простая в эксплуатации технология, по умолчанию есть в CentOS, хорошо совместима с Kubernetes (есть концепция пода).
Установка Podman:
yum -y install podman
systemctl enable --now podman.socket
touch /etc/containers/nodocker
cat >/etc/containers/registries.conf.d/docker.conf <<EOF
unqualified-search-registries = ['docker.io']
EOF
Пример запуска приложения в Podman:
podman pod rm home-cloud --ignore --force
podman pod create --name home-cloud \
--publish "${NODE_IP}:${NODE_UI_PORT}:9090" \
--publish "${NODE_IP}:${DNS_PORT}:9053" \
--publish "${NODE_IP}:${DNS_PORT}:9053/udp" \
--publish "${NODE_IP}:${LB_INT_WEB_PORT}:80" \
--publish "${NODE_IP}:${LB_INT_SWEB_PORT}:443" \
--publish "${NODE_IP}:${LB_EXT_WEB_PORT}:8080" \
--publish "${NODE_IP}:${LB_EXT_SWEB_PORT}:8443"
podman run --pod home-cloud --name home-cloud-traefik \
-v /cloud/engine/traefik.yml:/etc/traefik/traefik.yml \
-v /var/run/podman/podman.sock:/var/run/docker.sock:ro \
-d traefik
podman run --pod home-cloud --name home-cloud-dns \
-v /cloud/engine/dnsmasq.conf:/etc/dnsmasq.conf:ro \
-v /cloud/engine/dnsmasq.hosts:/dnsmasq.hosts:ro \
-d 4km3/dnsmasq:2.85-r2
podman run --pod home-cloud --name home-cloud-webui \
-v /:/host:ro \
-v /cloud/engine:/engine:rw \
-d nginx
Приложения podman так же можно запускать через systemd (workload.yaml – Kubernetes pod):
escaped=$(systemd-escape ~/workload.yaml)
systemctl --user start podman-kube@$escaped.service
Или просто под:
$ podman create --name nginx nginx:latest
$ podman generate systemd --restart-policy=always -t 1 nginx
# container-de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6.service
# autogenerated by Podman 1.8.0
# Wed Mar 09 09:46:45 CEST 2020
[Unit]
Description=Podman container-de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/var/run/container/storage
[Service]
Restart=always
ExecStart=/usr/bin/podman start de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6
ExecStop=/usr/bin/podman stop \
-t 1 de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6
KillMode=none
Type=forking
PIDFile=/run/user/1000/overlay-containers/de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6/userdata/conmon.pid
[Install]
WantedBy=default.target
Естественно, после окончания настройки нужно перезагрузить виртуалку, чтобы убедиться, что все стартует корректно.
Если говорить про Kubernetes, то для поставки “коробки” подходит Helm, а если приложение внутреннее/SaaS, то лучше Kustomize. Главное практическое отличие от Helm – Helm довольно часто приводит релизы в какие-то нерабочие состояния, которые нужно руками исправлять. В Kustomize такого в принципе не бывает, т.к. нет такого понятия.