На практике не рассматриваю вариант облака – оно очень дорого.

По сути 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 такого в принципе не бывает, т.к. нет такого понятия.