kube-proxy的工作原理(实例说明)

service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。
service会为这个LB提供一个IP,一般称为cluster IP。
kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。


以下,我们使用kubernetes + flannel(xvlan) 的网络配置模式做一个试验,例如:

service.yaml :

apiVersion: v1
kind: Service
metadata:
  labels:
    app: busybox
  name: busybox
  namespace: default
spec:
  type: NodePort
  ports:
  - name: s-tcp
    nodePort: 30382
    port: 30382
    protocol: TCP
    targetPort: 30382
  selector:
    app: busybox


查看服务信息:

$ kubectl get all -o wide |grep busybox 

po/busybox-deployment-2396788737-zksf9 1/1 Running 0 12d 172.30.46.2 192.168.0.100
svc/busybox 10.254.119.211  30382:30382/TCP 12d app=busybox

1.nodePort的工作方式:
通过node的30382访问,则会进入到以下链:
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/busybox:s-tcp" -m tcp --dport 30382 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/busybox:s-tcp" -m tcp --dport 30382 -j KUBE-SVC-RQ7VYX4MRUCA3BSP

然后进一步跳转到KUBE-SVC-RQ7VYX4MRUCA3BSP链:
-A KUBE-SVC-RQ7VYX4MRUCA3BSP -m comment --comment "default/busybox:s-tcp" -j KUBE-SEP-EENEXWEI4D6ZTMUF

KUBE-SEP-EENEXWEI4D6ZTMUF链的具体作用就是将请求通过DNAT发送到POD(172.30.46.2)的30382端口:
-A KUBE-SEP-EENEXWEI4D6ZTMUF -s 172.30.46.2/32 -m comment --comment "default/busybox:s-tcp" -j KUBE-MARK-MASQ
-A KUBE-SEP-EENEXWEI4D6ZTMUF -p tcp -m comment --comment "default/busybox:s-tcp" -m tcp -j DNAT --to-destination 172.30.46.2:30382


2.clusterIP的访问方式:
对于直接访问cluster IP(10.254.162.44)的30382端口会直接跳转到KUBE-SVC-RQ7VYX4MRUCA3BSP。
-A KUBE-SERVICES ! -s 10.254.0.0/16 -d 10.254.119.211/32 -p tcp -m comment --comment "default/busybox:s-tcp cluster IP" -m tcp --dport 30382 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.254.119.211/32 -p tcp -m comment --comment "default/busybox:s-tcp cluster IP" -m tcp --dport 30382 -j KUBE-SVC-RQ7VYX4MRUCA3BSP

参考:

kubernetes services介绍 :http://blog.csdn.net/kozazyh/article/details/79536810

官方详细介绍: https://kubernetes.io/docs/concepts/services-networking/service/

你可能感兴趣的:(kubernetes,flannel)