Назад к блогу
DevOps 14 мин чтения

Minikube на отдельном VPS: почти как прод Kubernetes

Как поднять Minikube на VPS, задеплоить Hello World и настроить SSL (cert-manager + Ingress) для домена vault.by — учебный стенд близкий к реальному K8s.

MinikubeKubernetesVPSTLSIngress
Minikube на отдельном VPS: почти как прод Kubernetes

Зачем Minikube на отдельном VPS

Локальный Minikube на ноутбуке удобен для экспериментов, но это всё ещё «лаборатория на коленке»: нет публичного IP, DNS, реального TLS и привычки жить с удалённым API. Отдельный недорогой VPS с Minikube — компромисс: один control-plane/node, те же манифесты, Ingress, cert-manager и kubectl, что и в «настоящем» Kubernetes, плюс домен вроде vault.by.

Это не замена managed Kubernetes (EKS/GKE/AKS) и не HA-прод. Но для пет-проектов, демо и отработки CI/CD-паттернов стек уже очень близкий к продакшену: Deployment → Service → Ingress → Certificate.

Что взять по железу

  • VPS: от 2 vCPU / 4–8 GB RAM / 40+ GB SSD (Docker driver жрёт память).
  • ОС: Ubuntu 22.04/24.04 LTS.
  • Открытые порты: 22, 80, 443 (и при необходимости NodePort-диапазон).
  • DNS: A-запись vault.by (и лучше www.vault.by) → публичный IP VPS.

Установка Minikube и базовый старт

# Docker + kubectl (кратко)
sudo apt update && sudo apt install -y docker.io curl
sudo usermod -aG docker $USER
# перелогиньтесь, затем:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

minikube start --driver=docker --cpus=2 --memory=3900 --addons=ingress
minikube addons enable ingress
minikube addons enable metrics-server
kubectl get nodes

Для доступа с интернета к Ingress на Minikube с Docker-driver обычно нужен проброс портов хоста на ingress-контроллер (или minikube tunnel в фоне + firewall). Практичный вариант на одном VPS:

# Узнать NodePort/Service ingress
kubectl -n ingress-nginx get svc

# Проброс 80/443 с хоста в minikube (пример через socat/nginx на хосте
# или minikube service — зависит от driver). Часто используют:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
  -j DNAT --to-destination $(minikube ip):80
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 \
  -j DNAT --to-destination $(minikube ip):443
# + MASQUERADE для ответа; либо nginx reverse-proxy на хосте → $(minikube ip)

Альтернатива проще в сопровождении: поставить на хосте nginx/Caddy как reverse-proxy на IP Minikube Ingress, а 80/443 слушать только на хосте.

Hello World: Deployment + Service

# hello-world.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
  labels:
    app: hello-world
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - name: web
          image: hashicorp/http-echo:1.0
          args: ["-text=Hello from Minikube on VPS"]
          ports:
            - containerPort: 5678
          resources:
            requests:
              cpu: 50m
              memory: 64Mi
            limits:
              cpu: 200m
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  selector:
    app: hello-world
  ports:
    - port: 80
      targetPort: 5678
kubectl apply -f hello-world.yaml
kubectl get pods,svc
kubectl port-forward svc/hello-world 8080:80
# curl http://127.0.0.1:8080

Ingress для vault.by

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-world
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - vault.by
        - www.vault.by
      secretName: vault-by-tls
  rules:
    - host: vault.by
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: hello-world
                port:
                  number: 80
    - host: www.vault.by
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: hello-world
                port:
                  number: 80

SSL через cert-manager (Let's Encrypt)

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml
kubectl -n cert-manager rollout status deploy/cert-manager
# cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: admin@vault.by
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-account-key
    solvers:
      - http01:
          ingress:
            class: nginx
kubectl apply -f cluster-issuer.yaml
kubectl apply -f ingress.yaml
kubectl describe certificate vault-by-tls
kubectl get secret vault-by-tls
curl -I https://vault.by

Пока DNS не указывает на VPS или 80 порт недоступен с интернета, HTTP-01 challenge не пройдёт — сертификат останется в Pending/False. Сначала проверьте curl http://vault.by (редирект/ответ Ingress), потом TLS.

Что уже «как в проде», а что нет

  • Похоже: манифесты, probes (добавьте сами), Ingress, TLS, namespaces, ResourceQuota, GitOps-паттерн apply из CI.
  • Не прод: один узел, нет HA etcd/API, слабее изоляция, аддоны Minikube, аптайм VPS = аптайм кластера.
  • Следующий шаг: k3s/k0s на том же VPS или managed K8s, когда нужны несколько нод и SLA.

Мини-чеклист перед демо на vault.by

  1. A-запись домена → IP VPS.
  2. minikube start + addon ingress.
  3. Проброс 80/443 на Ingress.
  4. Hello World Deployment/Service.
  5. cert-manager + ClusterIssuer + Ingress с TLS.
  6. curl -I https://vault.by → 200 и валидный сертификат.

Вывод

Minikube на отдельном VPS — учебный, но уже «взрослый» контур: те же объекты Kubernetes, публичный домен и настоящий Let's Encrypt. Для Hello World на vault.by достаточно Deployment, Service, Ingress и cert-manager. Это не замена продакшен-кластеру, зато лучший мост между локальной песочницей и реальным K8s-опытом.

Алексей Прыбытков

Senior Software Developer

© 2026 Все права защищены