zoukankan      html  css  js  c++  java
  • kube-proxy iptables

    Q: 连接跟踪的作用是什么?

    A: 连接跟踪本身没什么特殊功能,它最重要的两个用途是NAT与状态防火墙。

    Q: 连接跟踪发生在什么位置?它的基本流程是怎样的?

    A: 连接跟踪模块在NF_INET_PRE_ROUTINGNF_INET_LOCAL_OUT处注册了钩子函数,是连接跟踪的入口(nf_conntrack_in);在NF_INET_POST_ROUTINGNF_INET_LOCAL_IN处注册了钩子函数,是连接跟踪的出口(nf_conntrack_confirm)。

    Q: 我们可以在raw表中添加规则,让数据包不被连接跟踪,是如何做到的?

    A: 以下为猜测。nf_conntrack_in函数的调用者,会遍历raw表中的规则,如果发现raw表中存在一条规则,对该数据包不走连接跟踪,那么它就不会调用nf_conntrack_in这个钩子函数。

     

    kube-proxy监听service和endpoint的变化,将需要新增的规则添加到iptables中。

    kube-proxy只是作为controller,而不是server,真正服务的是内核的netfilter,体现在用户态则是iptables。

    kube-proxy的iptables方式也支持RoundRobin(默认模式)和SessionAffinity负载分发策略。

    kubernetes只操作了filter和nat表。

    Filter:在该表中,一个基本原则是只过滤数据包而不修改他们。filter table的优势是小而快,可以hook到input,output和forward。这意味着针对任何给定的数据包,只有可能有一个地方可以过滤它。

    NAT:此表的主要作用是在PREROUTING和POSTROUNTING的钩子中,修改目标地址和原地址。与filter表稍有不同的是,该表中只有新连接的第一个包会被修改,修改的结果会自动apply到同一连接的后续包中。

    kube-proxy对iptables的链进行了扩充,自定义了KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ和KUBE-MARK-DROP五个链,并主要通过为KUBE-SERVICES chain增加rule来配制traffic routing 规则。我们可以看下自定义的这几个链的作用:

    KUBE-MARK-DROP - [0:0] /*对于未能匹配到跳转规则的traffic set mark 0x8000,有此标记的数据包会在filter表drop掉*/KUBE-MARK-MASQ - [0:0] 
    /*对于符合条
    件的包 set mark 0x4000, 有此标记的数据包会在KUBE-POSTROUTING chain中统一做MASQUERADE*/KUBE-NODEPORTS - [0:0]
    /*针对通过nodeport访问的package做的操作*/KUBE-POSTROUTING - [0:0]KUBE-SERVICES - [0:0] /*操作跳转规则的主要chain*/

    同时,kube-proxy也为默认的prerouting、output和postrouting chain增加规则,使得数据包可以跳转至k8s自定义的chain,规则如下:

     -A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
    
     -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
    
     -A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING 

    如果service类型为nodePort,(从LB转发至node的数据包均属此类)那么将KUBE-NODEPORTS链中每个目的地址是NODE节点端口的数据包导入这个“KUBE-SVC-”链:

     -A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS
    
     -A KUBE-NODEPORTS -p tcp -m comment --comment "default/es1:http" -m tcp --dport 32135 -j KUBE-MARK-MASQ
    
     -A KUBE-NODEPORTS -p tcp -m comment --comment "default/es1:http" -m tcp --dport 32135 -j KUBE-


      -> 10.244.41.1:53                      0        0        0        0        0
    root@cloud:~# iptables -t nat -nL POSTROUTING
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination         
    cali-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* cali:O3lYWMrLQYEMJtB5 */
    KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */
    MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
    ANTREA-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* Antrea: jump to Antrea postrouting rules */
    RETURN     all  --  10.244.0.0/16        10.244.0.0/16       
    MASQUERADE  all  --  10.244.0.0/16       !224.0.0.0/4         
    RETURN     all  -- !10.244.0.0/16        10.244.2.0/24       
    MASQUERADE  all  -- !10.244.0.0/16        10.244.0.0/16       
    root@cloud:~# 
    root@cloud:~# iptables -t nat -nL PREROUTING
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    cali-PREROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* cali:6gwbT8clXdHdC1b1 */
    KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */
    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
    EDGE-MESH  tcp  --  0.0.0.0/0            9.251.0.0/16        
    root@cloud:~# 

    跟踪KUBE-SERVICES

    root@cloud:~# iptables -t nat -nL KUBE-SERVICES
    Chain KUBE-SERVICES (2 references)
    target     prot opt source               destination         
    KUBE-MARK-MASQ  all  -- !10.244.0.0/16        0.0.0.0/0            /* Kubernetes service cluster ip + port for masquerade purpose */ match-set KUBE-CLUSTER-IP dst,dst
    KUBE-NODE-PORT  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst
    root@cloud:~# iptables -t nat -nL  KUBE-NODE-PORT
    Chain KUBE-NODE-PORT (1 references)
    target     prot opt source               destination         
    KUBE-MARK-MASQ  tcp  --  0.0.0.0/0            0.0.0.0/0            /* Kubernetes nodeport TCP port for masquerade purpose */ match-set KUBE-NODE-PORT-TCP dst
    root@cloud:~# iptables -t nat -nL  KUBE-MARK-MASQ
    Chain KUBE-MARK-MASQ (15 references)
    target     prot opt source               destination         
    MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000
    root@cloud:~# 




  • 相关阅读:
    零拷贝
    RxJava2源码解析
    一次博客崩溃日志分析
    Spring循环依赖的解决
    解决网络卡顿问题
    软工第一次作业
    3月26-27号训练笔记
    Codeforces Round #708 (Div. 2)题解A,B,C1,C2,E1,E2
    求出所有LIS的可行起点
    2020小米邀请赛决赛补题G,I,J(三DP)
  • 原文地址:https://www.cnblogs.com/dream397/p/14931033.html
Copyright © 2011-2022 走看看