Trang chủ › Hướng dẫn › Kubernetes
Hướng dẫn · Kubernetes

Đưa Kubernetes Service ra public HTTPS

Một lệnh Helm là một Service trong cluster có URL công khai https://<tên>.entry.io.vnkhông cần LoadBalancer, Ingress controller hay public IP. Chạy được cả với k3s/cluster sau NAT.

Service trong cluster entry.io.vn ┌────────────────┐ ssh -R ┌──────────────┐ │ my-svc :80 │◄──────────│ tunnel pod │──► sish ──► https://myapp.entry.io.vn │ (ClusterIP) │ │ (autossh) │ (TLS tự động) └────────────────┘ └──────────────┘
🎯 Nguyên lý: một pod nhỏ (autossh) mở đường hầm ngược từ trong cluster ra sish — đưa ClusterIP ra ngoài. Không mở port, không cần IP public.
Bước 1

Thêm SSH key (một lần)

  1. Đăng ký app.entry.io.vn, thêm public key vào ▸ SSH Keys:
    ssh-keygen -t ed25519 cat ~/.ssh/id_ed25519.pub # dán vào Dashboard
Bước 2

Tạo Secret chứa key trong cluster

kubectl create secret generic entry-ssh-key \ --from-file=id_ed25519=$HOME/.ssh/id_ed25519
Bước 3

Cài bằng Helm — 1 lệnh

Dùng chart entry-tunnel (image công khai nguyendinhsen/entry-tunnel — khỏi build):

helm install myapp ./entry-tunnel \ --set tunnel.subdomain=myapp \ --set tunnel.target=my-svc.default.svc:80 \ --set sshKey.existingSecret=entry-ssh-key

→ Service my-svc có ngay https://myapp.entry.io.vn. Bỏ tunnel.subdomain để được tên ngẫu nhiên.

💡 Không dùng Helm? Dùng file YAML thuần entry-tunnel.yaml (Secret + Deployment) rồi kubectl apply -f. Xem repo k8s/.
TCP

Expose dịch vụ không phải web (Postgres, SSH…)

helm install pg ./entry-tunnel --set tunnel.mode=tcp \ --set tunnel.target=postgres.db.svc:5432 \ --set sshKey.existingSecret=entry-ssh-key

sish cấp 1 cổng public (xem số còn trống ở Dashboard). Cần ổn định/không giới hạn → dùng alias + ProxyJump hoặc VPN — xem Tunnel hay Mạng riêng?

Lưu ý

Best practices & tình huống

Tình huốngCách đúng
Cluster sau NAT / không public IP (k3s, homelab, edge)✅ Hợp nhất — pod mở đường ngược ra, không cần IP public
Nhiều Service cần exposeMỗi Service một release Helm (mỗi cái 1 subdomain)
Target serviceDùng DNS đầy đủ: svc.namespace.svc:port
Bảo mật podImage chạy non-root, read-only rootfs; key mount từ Secret
Traffic production lớnKhông hợp (1 VPS relay) — dùng cho dev/demo/edge
Reach thẳng nhiều ClusterIP từ laptopDùng mạng riêng (VPN) + subnet router thay vì tunnel