• Kubernetes Services networking


    概念回顾


    kube-proxy

    kube-proxy是Kubernetes网络代理组件,运行在每个NODE上, deamonSet模式运行,用来支撑TCP/UDP/SCTP四层流量转发,或是一组后端服务器(Pod)进行TCP/UDP流量转发(默认策略模式roundRobin)

    功能如下:

    1. 必须运行在每个node上
    2. 转发TCP/UDP/SCTP流量
    3. 不支持HTTP
    4. 提供负载均衡能力
    5. 只用来访问Service

    kube-proxy共有三种服务类型,如下

    1. Cluster-ip
    2. NodePort
    3. LoadBalance

    Service类型工作原理


    Cluster-IP

    从Kubernetes1.2默认情况下,从集群内部发送到clusterIP的包源地址永远不会进行SNAT(kube-proxy运行在iptables模式下,默认情况下就是iptables模式),如何查看kube-proxy的运行模式,如下

    • 范例
      <root@SYS-K8S-CP1 ~># curl -i http://localhost:10249/proxyMode
      HTTP/1.1 200 OK
      Content-Type: text/plain; charset=utf-8
      X-Content-Type-Options: nosniff
      Date: Fri, 20 May 2022 04:22:21 GMT
      Content-Length: 8
      
      iptables
    请求流

    实际以请求sit01-xc-loanweb为例,分析如下

    1. 从Pod-C请求到Pod-A,Pod-A(sit01-xc-loanweb)实际以ClusterIP的方式expose服务,具体端口是以8080

    2. 当Pod-C请求sit01-xc-loanwebe服务时,内部域名(xc-loan.sit01.nflow.cn

    3. Pod-C发出请求后,经过自己所在的node,check本机的iptables规则,如下(sit01-xc-loanweb)使用iptables-save查看

      -A KUBE-SERVICES -d 10.10.147.45/32 -p tcp -m comment --comment "sit/sit01-xc-loanweb:http cluster IP" -m tcp --dport 8080 -j KUBE-SVC-CRJTZGXZEZHAKQ75

      -A KUBE-SVC-CRJTZGXZEZHAKQ75 -m comment --comment "sit/sit01-xc-loanweb:http" -j KUBE-SEP-BXKHI3O6DYI2MSCL

      -A KUBE-SEP-BXKHI3O6DYI2MSCL -p tcp -m comment --comment "sit/sit01-xc-loanweb:http" -m tcp -j DNAT --to-destination 172.19.102.247:8080

    4. 根据iptables规则,替换目的地址,将10.10.147.45替换为172.19.102.247,而源地址则不变

      注意:下图的错误点

      • SNAT修正为DNAT

    返回流
    1. Pod-A的地址替换成SVC1的地址,即172.19.0.1 → 10.10.0.1

    NodePort

    从Kubernetes1.5开始,如果客户端请求NodePort的服务,默认数据包进行源地址转换SNAT

    请求流

    实际以RabbitMQ 15672端口为例,域名sit-mq-mgt.qiangyun.com(注意该域名入口不是以ingress模式配置)

    1. 客户端请求Pod-C的服务,该服务是以NodePort的形式expose

    2. 访问域名sit-mq-mgt.qiangyun.com(实际后端的地址是10.1.48.1:30891)

    3. 目的地址转换DNAT的iptables规则

      -A KUBE-NODEPORTS -p tcp -m comment --comment "sit/sit-rabbitmq:mq-mgt" -m tcp --dport 30891 -j KUBE-SVC-4ZCHRGNPBVZO7YGD

      -A KUBE-SVC-4ZCHRGNPBVZO7YGD -m comment --comment "sit/sit-rabbitmq:mq-mgt" -j KUBE-SEP-7T6YOIC7QTENJC7F

      -A KUBE-SEP-7T6YOIC7QTENJC7F -p tcp -m comment --comment "sit/sit-rabbitmq:mq-mgt" -m tcp -j DNAT --to-destination 172.19.255.105:15672

    4. 目的地址替换10.148.1 →  172.19.1.1

    返回流
    1. 执行相关源地址,目的地址转换

     LoadBalance

    从Kubernetes1.5开始,如果请求load balance类型的服务,默认情况下,需要进行源地址转换

    请求流

    大致与NodePort类似,只是多了一层LoadBalance

    目的地址转换LB的地址转换为后端服务器的地址

     如果是externaltrafficpolicy = Local,那么具体的请求如下

  • 相关阅读:
    2019年7月17日星期三(linux基础)
    2019年7月16日星期二(C语言)
    2019年7月15日星期一(C语言)
    java.util.ConcurrentModificationException 异常问题详解
    use h2database for unit testing
    db
    Things to learn everyday
    springcloud
    abstractMethodError
    java -jar & to backend run
  • 原文地址:https://www.cnblogs.com/apink/p/16291815.html
Copyright © 2020-2023  润新知