inlets-operator:本地 K8s 集群也能有公网 LoadBalancer

用云厂商的托管 Kubernetes,把 Service 类型设成 LoadBalancer,几秒钟就能拿到一个公网 IP。但如果你的集群跑在笔记本、自建机房、甚至树莓派上,这个能力就没了,Service 会一直卡在 pending。

inlets-operator 解决的就是这个问题。它在你指定的云厂商上自动创建一台虚拟机,作为隧道的出口节点,把本地集群里的 Service 暴露到公网上。整个过程和云托管 K8s 的体验一样,删掉 Service 虚拟机也会自动清理。

正文顶部截图

工作原理

operator 启动后会监听集群里所有 LoadBalancer 类型的 Service。一旦检测到新的 Service,它会在你配置的云厂商上创建一台虚拟机,运行 inlets server 进程。同时在集群内部署一个 inlets client 作为 Deployment,两者通过隧道连接。连接建立后,operator 把虚拟机的公网 IP 写回到 Service 的 EXTERNAL-IP 字段。

kubectl get services -w
NAME               TYPE        CLUSTER-IP        EXTERNAL-IP       PORT(S)   AGE
service/nginx-1    ClusterIP   192.168.226.216   <pending>         80/TCP    78s
service/nginx-1    ClusterIP   192.168.226.216   104.248.163.242   80/TCP    78s

从 pending 到真实 IP,几秒钟的事。

成本和云厂商支持

隧道出口的虚拟机用的是各云厂商最便宜的机型。DigitalOcean 大概 5 美元一个月,Hetzner 3 欧元左右,都带公网 IPv4 和不错的带宽。支持的厂商有十几个,包括 AWS EC2、GCE、Vultr、Linode 等。

几个实用功能

如果你有某些 Service 不想被 operator 管理,加个注解就行:

kubectl annotate service nginx-1 operator.inlets.dev/manage=0

反过来,也可以设置成只管理有注解的 Service,其他全部忽略。

Proxy Protocol 支持 v1 和 v2,能保留客户端的真实 IP。这个在虚拟机创建时配置,之后不能改,要改就得删掉重建。

IPVS 模式下需要手动创建 Tunnel 自定义资源,不走 LoadBalancer 字段。

适合谁用

README区域截图

跑 homelab 或者自建私有云的人,想对外暴露服务的时候,通常得折腾防火墙端口转发、动态 DNS,或者用 ngrok 这类 SaaS 工具。ngrok 免费版每 7 小时断一次连接,还有连接数限制,只能用高端口。

inlets-operator 的方式更直接:用你自己的 Ingress Controller,用你自己的 DNS,拿到的是真正的公网 IP,没有连接数和带宽限制。和 cert-manager 配合还能自动签 Let’s Encrypt 证书。

对做 Webhook 调试、给客户演示环境、自托管 API 这些场景来说,本地集群加上这个 operator,体验和云上没什么区别。

和同类工具的区别

MetalLB 和 kube-vip 只能在内网分配 IP,没法把服务暴露到公网。Cloudflare Tunnel 绑定 Cloudflare 的生态,没法搭配任意 Ingress Controller。Wireguard 和 Tailscale 是 VPN 方案,不做端口暴露。

inlets-operator 的定位很明确:让本地 K8s 获得和云托管一样的 LoadBalancer 能力,用最小的代价。

rator 的定位很明确:让本地 K8s 获得和云托管一样的 LoadBalancer 能力,用最小的代价。

更多推荐