Зачем 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
- A-запись домена → IP VPS.
minikube start+ addon ingress.- Проброс 80/443 на Ingress.
- Hello World Deployment/Service.
- cert-manager + ClusterIssuer + Ingress с TLS.
curl -I https://vault.by→ 200 и валидный сертификат.
Вывод
Minikube на отдельном VPS — учебный, но уже «взрослый» контур: те же объекты Kubernetes, публичный домен и настоящий Let's Encrypt. Для Hello World на vault.by достаточно Deployment, Service, Ingress и cert-manager. Это не замена продакшен-кластеру, зато лучший мост между локальной песочницей и реальным K8s-опытом.
