kube-proxy

service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。

kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问

cat nginx.yaml    部署该deploment 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: apigw-test1
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: test1
    spec:
      #hostNetwork: true
      containers:
      - name: apigw1
        p_w_picpath: apigw:696
        p_w_picpathPullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 2
            memory: 2Gi
          limits:
            cpu: 2
            memory: 2Gi


创建service

cat nginx-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: apigw-test1
  labels:
    app: test1
spec:
  type: NodePort
  selector:
    app: test1
  ports:
  - port: 6666
    targetPort: 80
    nodePort: 30066
    
kubectl create -f nginx-svc.yaml


前面创建了nginx的部署对象,那么别人如何使用nginx这个服务呢?首先要确定的是,这个nginx服务,是给内部使用的,还是外部。如果是内部使用,那就可以不用设置服务的类型(默认为ClusterIP),

否则,可以将服务类型设置为NodePort,通过node的端口暴露出来给外部使用;或者是LoadBalancer,由云服务商提供一个负载均衡直接挂在服务上。

这里我们使用NodePort,暴露出30066端口给外部使用。如果不指定nodePort,那么kubernetes会随机生成一个


这里我们用1个service+2个pod来举例说明

kubernets kube-proxy原理分析_第1张图片


kubernets kube-proxy原理分析_第2张图片

port和nodePort都是service的端口,前者暴露给集群内客户访问服务,后者暴露给集群外客户访问服务。从这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod上的容器内。



apigw-test1-2790435668-xkt56  ip:192.168.64.130/32

apigw-test1-2790435668-r69sr  ip:  192.168.83.197/32

kubernets kube-proxy原理分析_第3张图片


整体流程图如下

kubernets kube-proxy原理分析_第4张图片

-A KUBE-SVC-NPX46M4PTMTKRN6Y -m comment --comment "default/kubernetes:https" -m recent --rcheck --seconds 10800 --reap --name KUBE-SEP-FOCF455PUHPZHEKG --mask 255.255.255.255 --rsource -j KUBE-SEP-FOCF455PUHPZHEKG

 

实现了会话保持

 

-A KUBE-SEP-FOCF455PUHPZHEKG -p tcp -m comment --comment "default/kubernetes:https" -m recent --set --name KUBE-SEP-FOCF455PUHPZHEKG --mask 255.255.255.255 --rsource -m tcp -j DNAT --to-destination 172.16.18.124:6443


关键点解释:

KUBE-NODEPORTS   链跳转到如下两条链

1、KUBE-MARK-MASQ  --set-xmark 0x4000/0x4000  SANT

该链的作用主要是做数据标记,以及后续对这些标记的数据做SNAT

2、KUBE-SVC-4FIAYNHBEFBB6ATU  会跳转到如下两条链

2、1  KUBE-SEP-ZMVIR553ITG5JAPJ  (-m statistic --mode random --probability 0.50000000000)

该链主要两个做个 一个SANT  一个DNAT,请参考上图说明


2、2  KUBE-SEP-S6UNEDQPTOJETSJC  作用等同于2、1


 服务配置了session affinity,则会产生如下的规则  


kubernets kube-proxy原理分析_第5张图片


-m recent --rcheck --seconds 10800 --reap 实现了会话保持

来自于default/kubernetes:https这个服务,流经KUBE-SVC-NPX46M4PTMTKRN6Y这个链的数据包会跳转到自定义链KUBE-SEP-FOCF455PUHPZHEKG,且会在一段时间内保持session affinity,保持时间是10800