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,那么具体的请求如下

 

posted @ 2022-05-20 11:43  MacoPlus  阅读(77)  评论(0编辑  收藏  举报