V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX  ›  程序员

kubernetes ingress 怎么获取真实的 ip?有使用 frp

  •  
  •   dunhanson · 2021-06-01 12:42:01 +08:00 · 2338 次点击
    这是一个创建于 1272 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直获取的是局域的 ip 地址,192.168.2.56 ,这台机子是对外暴露 80 和 443 端口的 hostnetwork 主机

    2ncdpV.png

    2ncwlT.png

    我百度和谷歌了一些方案,但是还是不行,不知道有没有人遇到类似的问题

    我也可以不用 frp,就是域名指向公网 ip 的路由器,然后路由器那边再进行转发到 192.168.2.56 ( 80 和 443 端口)这台机子。但是也是会有类似的问题,ingress-nginx-controller pod 日志输出的 ip 地址是网关地址 192.168.2.1

    第 1 条附言  ·  2021-06-02 10:29:50 +08:00

    这么配置,http请求$remote_addr是可以获取到ip的(非https)

    ---
    # Source: ingress-nginx/templates/controller-configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        helm.sh/chart: ingress-nginx-2.13.0
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/version: 0.35.0
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/component: controller
      name: ingress-nginx-controller
      namespace: ingress-nginx
    data:
      enable-real-ip: "true"
      forwarded-for-header: "X-Forwarded-For"
      proxy-real-ip-cidr: "192.168.2.0/24"
    ---
    

    2M3wDK.md.png

    第 2 条附言  ·  2021-06-02 10:54:33 +08:00

    https也可以获取到ip了 configmap配置

    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        helm.sh/chart: ingress-nginx-2.13.0
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/version: 0.35.0
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/component: controller
      name: ingress-nginx-controller
      namespace: ingress-nginx
    data:
      use-proxy-protocol: "true"
      enable-real-ip: "true"
      forwarded-for-header: "proxy_protocol"
      proxy-real-ip-cidr: "192.168.2.0/24"
    

    frp配置

    [gitlab-https]
    type = https
    local_ip = 192.168.2.56
    local_port = 443
    remote_port = 443
    custom_domains = gitlab.dunhanson.site
    proxy_protocol_version = v2
    
    [gitlab-http]
    type = http
    local_ip = 192.168.2.56
    local_port = 80
    remote_port = 80
    custom_domains = gitlab.dunhanson.site
    proxy_protocol_version = v2
    
    第 3 条附言  ·  2021-06-02 11:04:21 +08:00
    第 4 条附言  ·  2021-06-02 11:06:40 +08:00
    忘了说了,我要获取真实 ip 的目的是为了设置 ingress 中的 ip 白名单
    13 条回复    2021-06-07 14:31:19 +08:00
    comphilip
        1
    comphilip  
       2021-06-01 13:55:56 +08:00
    你使用的 kubernetes ingress 是 nginx,那么得搞清楚,这个 nginx 是跟 client 直连,还是与 client 之间存在其他节点。

    从你的描述,貌似存在路由器这个节点,一个存在中间节点,那么中间节点必须把 client ip 信息带上。HTTP 一般是添加 X-Forwarded-For 这类的 header 。

    貌似你的路由器不具备 7 层转发的功能。
    dunhanson
        2
    dunhanson  
    OP
       2021-06-01 14:04:40 +08:00
    @comphilip
    中间节点有两种情况:
    第一种是 frp 、第二种是路由器
    amrom
        3
    amrom  
       2021-06-01 14:05:59 +08:00
    这个问题我遇到过,重点在注解
    dunhanson
        4
    dunhanson  
    OP
       2021-06-01 14:06:20 +08:00
    生产环境的机子都是直通公网 ip,就可以 nginx 和 client 直连。
    但是线下环境,必须通过路由器转发一道,或者 frp 进行
    dunhanson
        5
    dunhanson  
    OP
       2021-06-01 14:06:40 +08:00
    @amrom 能具体说下吗
    amrom
        6
    amrom  
       2021-06-01 14:25:24 +08:00
    1. ingress-nginx 注解:
    annotations:
    nginx.org/compute-full-forwarded-for: "true"
    nginx.org/forwarded-for-header: "X-Forwarded-For"
    nginx.org/use-forwarded-headers: "true"

    2. 需要指定 ingress 的端口暴露方式为 nodePort,在改一个配置:
    externalTrafficPolicy: Local


    时间太长忘记了,大致就是这两个地方
    amrom
        7
    amrom  
       2021-06-01 14:27:15 +08:00
    externalTrafficPolicy: Local 让请求的真实 IP 落到 ingress-nginx 的 pod 上,然后 nginx 的注解在加上转发真实 IP 的注解,实现真实 IP 转发到后端,该方案的缺点是 ingress-nginx pod 会固定到一台机器上
    dunhanson
        8
    dunhanson  
    OP
       2021-06-01 14:44:38 +08:00
    @amrom 第一种我之前试过,应该是不行的

    应该是配置在 ingress-nginx 的 configmap 中吧?
    amrom
        9
    amrom  
       2021-06-01 14:57:05 +08:00
    @dunhanson 需要两个地方同时修改,不需要改 configmap,直接作用到 ingress-nginx 的注解就行了
    dunhanson
        10
    dunhanson  
    OP
       2021-06-01 15:54:21 +08:00
    @amrom 我回头在研究研究
    dunhanson
        11
    dunhanson  
    OP
       2021-06-02 10:27:17 +08:00
    这么配置,http 请求时可以正常获取到真实 ip 的
    ```yml
    # Source: ingress-nginx/templates/controller-configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
    labels:
    helm.sh/chart: ingress-nginx-2.13.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.35.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
    name: ingress-nginx-controller
    namespace: ingress-nginx
    data:
    enable-real-ip: "true"
    forwarded-for-header: "X-Forwarded-For"
    proxy-real-ip-cidr: "192.168.2.0/24"
    ```

    [![2M3wDK.png]( https://z3.ax1x.com/2021/06/02/2M3wDK.png)]( https://imgtu.com/i/2M3wDK)
    dunhanson
        12
    dunhanson  
    OP
       2021-06-02 10:55:55 +08:00
    @amrom @comphilip 已解决
    coolloves
        13
    coolloves  
       2021-06-07 14:31:19 +08:00
    马克下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:12 · PVG 20:12 · LAX 04:12 · JFK 07:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.