service是一組pod的服務抽象,至關於一組pod的LB,負責將請求分發給對應的pod。service會爲這個LB提供一個IP,通常稱爲cluster IP。
kube-proxy的做用主要是負責service的實現,具體來講,就是實現了內部從pod到service和外部的從node port向service的訪問。node
舉個例子,如今有podA,podB,podC和serviceAB。serviceAB是podA,podB的服務抽象(service)。
那麼kube-proxy的做用就是能夠將pod(無論是podA,podB或者podC)向serviceAB的請求,進行轉發到service所表明的一個具體pod(podA或者podB)上。
請求的分配方法通常分配是採用輪詢方法進行分配。python
另外,kubernetes還提供了一種在node節點上暴露一個端口,從而提供從外部訪問service的方式。mysql
好比咱們使用這樣的一個manifest來建立servicesql
apiVersion: v1 kind: Service metadata: labels: name: mysql role: service name: mysql-service spec: ports: - port: 3306 targetPort: 3306 nodePort: 30964 type: NodePort selector: mysql-service: "true"
含義是在node上暴露出30964端口。當訪問node上的30964端口時,其請求會轉發到service對應的cluster IP的3306端口,並進一步轉發到pod的3306端口。後端
kuer-proxy目前有userspace和iptables兩種實現方式。api
(1) userspace是在用戶空間,經過kuber-proxy實現LB的代理服務。這個是kube-proxy的最初的版本,較爲穩定,可是效率也天然不過高。spa
(2) iptables的方式。是純採用iptables來實現LB。是目前通常kube默認的方式3d
(1) api-server建立service對象,與service綁定的pod地址:稱之爲endpoints代理
(2) 服務發現方面:kube-proxy監控service後端endpoint的動態變化,而且維護service和endpoint的映射關係server