You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用IP地址替代域名配置K8s Ingress并保留TLS终止?

无域名下K8s Ingress实现扇出路由+TLS终止的方案

问题背景

之前在NAS上用docker-compose自托管tt-rss等应用,靠路由器端口映射公网IP加端口访问。现在迁移到microk8s集群,想通过Ingress控制器做TLS终止,给所有应用启用HTTPS。目前用域名配置的Ingress,改/etc/hosts能正常访问,但所有设备都改hosts太麻烦。直接用IP配置Ingress会报404,求能实现扇出路由且保留TLS终止的替代方案。

现有配置

可用的域名Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: fancy_domain.com
    http:
      paths:
      - backend:
          service:
            name: api
            port:
              number: 8080
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - fancy_domain.com
    secretName: tls-secret

尝试失败的IP配置Ingress(出现404)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api
            port:
              number: 8080
  tls:
  - hosts:
    - 192.168.0.203
    secretName: tls-secret

可行解决方案

方案1:本地DNS服务器(推荐)

  • 在局域网内部署轻量DNS服务(比如dnsmasq、Pi-hole),把自定义域名(比如fancy_domain.com)解析到microk8s集群的Ingress IP(192.168.0.203)。
  • 把局域网内所有设备的DNS地址设为这个本地DNS服务器,不用改每个设备的/etc/hosts,就能直接用域名访问Ingress,完美保留TLS终止功能。
  • 继续使用原来的域名Ingress配置即可,无需修改。

方案2:修正IP版Ingress配置

直接用IP访问出现404,主要两个原因:一是ingressClassName写错成了nginx-example(应该和可用配置一致用nginx);二是TLS证书没包含IP作为SAN字段。

修正后的IP版Ingress配置(支持扇出):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ip-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: 192.168.0.203
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api
            port:
              number: 8080
      # 添加其他应用的路径,实现扇出路由
      - path: /tt-rss
        pathType: Prefix
        backend:
          service:
            name: tt-rss-service
            port:
              number: 80
  tls:
  - hosts:
    - 192.168.0.203
    secretName: tls-ip-secret

配套操作:生成带IP的自签证书

# 生成包含IP的证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=192.168.0.203" -addext "subjectAltName=IP:192.168.0.203"

# 创建K8s Secret
kubectl create secret tls tls-ip-secret --key tls.key --cert tls.crt

方案3:无Host的路径扇出路由

如果不需要区分Host,可配置不带host字段的Ingress,让Nginx把所有无匹配Host的请求按路径转发到对应服务,同样要注意用带IP的TLS证书:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: default-fanout-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api
            port:
              number: 8080
      - path: /tt-rss
        pathType: Prefix
        backend:
          service:
            name: tt-rss-service
            port:
              number: 80
  tls:
  - secretName: tls-ip-secret

访问方式:https://192.168.0.203/api 对应api服务,https://192.168.0.203/tt-rss 对应tt-rss服务,实现扇出。


内容的提问来源于stack exchange,提问作者JPFrancoia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:00:05