如何使用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
相关产品推荐
相关产品推荐

