如何为Kubernetes配置Ngrok Ingress Controller前缀路由及排障
Ngrok免费域名搭配Kubernetes Ingress的最佳实践
问题原因解析
你第一个Ingress配置报错的核心原因是:Ngrok免费版提供的随机域名不支持自定义子域名。免费版给出的dominant-hawk-factual.ngrok-free.app是二级域名,无法直接添加server.这类子域名前缀,因此Ngrok Ingress控制器会判定该Ingress规则无效,直接跳过处理。
可行解决方案与最佳实践
方案1:同域名不同路径路由(推荐免费场景)
这是你当前可用的方案,将多个服务映射到同一个Ngrok域名的不同路径下,配置示例如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ngrok-ingress-depl namespace: theblock annotations: # 可选:如果服务期望接收根路径请求,添加重写注解将/server路径转为/ ngrok.com/rewrite-path: "/server(/|$)(.*) -> /$2" spec: ingressClassName: ngrok rules: - host: dominant-hawk-factual.ngrok-free.app http: paths: - path: / pathType: Prefix backend: service: name: app-service port: number: 8000 - path: /server pathType: Prefix backend: service: name: server-service port: number: 3000
- 注意:如果
server-service仅处理根路径请求,必须添加路径重写注解,否则服务会收到带/server前缀的请求,可能导致接口匹配失败。
方案2:升级Ngrok付费版(适合生产/长期使用)
如果必须使用子域名路由,升级到Ngrok付费版后可以:
- 绑定自定义域名,并创建任意子域名(如
server.yourdomain.com) - 在Ngrok控制台完成域名解析配置后,直接使用你第一个报错的Ingress格式即可正常运行。
方案3:多个独立Ngrok免费域名(临时测试场景)
给每个服务单独创建Ngrok隧道,获取不同的免费随机域名,然后分别配置Ingress资源:
# app-service对应的Ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ngrok-ingress namespace: theblock spec: ingressClassName: ngrok rules: - host: app-random-xxx.ngrok-free.app http: paths: - path: / pathType: Prefix backend: service: name: app-service port: number: 8000 # server-service对应的Ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: server-ngrok-ingress namespace: theblock spec: ingressClassName: ngrok rules: - host: server-random-yyy.ngrok-free.app http: paths: - path: / pathType: Prefix backend: service: name: server-service port: number: 3000
- 缺点:每个域名都是随机生成的,需要单独记录,管理成本较高,仅适合临时测试。
额外注意事项
- 移除冗余配置:Kubernetes v1.19+版本推荐使用
spec.ingressClassName字段,无需保留kubernetes.io/ingress.class注解,避免配置冲突。 - 保持控制器版本更新:确保Ngrok Ingress控制器是最新版本,避免因版本兼容性导致规则校验失败。
内容的提问来源于stack exchange,提问作者Neil Gawande
相关产品推荐
相关产品推荐

