k8s之yaml文件基本格式及底層負載均衡實現原理

本文只是本身的精簡後的總結,若須要詳細的資料,請繞步。node

注:yaml文件嚴格要求縮進,默認不一樣層次等級是兩個空格的縮進。算法

一、使用httpd鏡像建立一個Deployment資源對象

[root@master ~]# vim lvjianzhao.yaml    #編寫yaml文件

kind: Deployment            #指定要建立的資源對象類型
apiVersion: extensions/v1beta1        #指定deployment所對應的API版本
metadata:
  name: lvjianzhao-deploy      #定義deployment的名稱
spec:
  replicas: 4            #定義須要建立pod副本的數量
  template:
    metadata:
      labels:                           #指定pod的標籤
        user: lvjianzhao
    spec:
      containers:                                 
      - name: httpd                    #指定容器的名稱
        image: httpd                #指定基於哪一個鏡像運行容器
[root@master ~]# kubectl apply -f lvjianzhao.yaml     #執行編寫的文件
[root@master ~]# kubectl explain deployment     
#注:若是不知道某個資源對象所對應的API版本,能夠經過此命令查看
KIND:     Deployment
VERSION:  extensions/v1beta1             #這就是Deployment資源所對應的API版本
                        ........................#省略部份內容
[root@master ~]# kubectl get deployment lvjianzhao-deploy     
#肯定所執行的yaml文件生成了咱們所需數量的pod

查看其pod標籤,是不是咱們定義的label:vim

[root@master ~]# kubectl describe deployment lvjianzhao-deploy    #查看這個資源對象的詳細信息
Name:                   lvjianzhao-deploy
Namespace:              default
CreationTimestamp:      Thu, 07 Nov 2019 17:50:44 +0800
Labels:                 "user=lvjianzhao"              #這裏就是該資源對象的標籤

二、建立一個svc資源對象與上述Deployment資源對象關聯。且可以對外網提供服務。映射節點端口爲:32123.

[root@master ~]# vim httpd-service.yaml    #編寫service的yaml文件

kind: Service
apiVersion: v1
metadata:
  name: httpd-service
spec:
  type: NodePort              #這裏須要指定類型爲「NodePort」,不然默認是cluster IP
  selector:
    user: lvjianzhao                #與deployment資源對象的這個標籤進行關聯
  ports:
  - protocol: TCP
    port: 79                #這裏指定要映射到的Cluster  IP的端口
    targetPort: 80              #這裏指定的是要映射pod中的端口
    nodePort: 32123     #這裏指定的是映射到宿主機的端口
[root@master ~]# kubectl apply -f httpd-service.yaml        #執行該yaml文件
[root@master ~]# kubectl get svc httpd-service     #查看建立的svc(service)
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
httpd-service   NodePort   10.97.13.198   <none>        79:32123/TCP   2m1s
#能夠看到將指定的羣集端口映射到了本地的32123

如今就能夠使用client訪問k8s羣集中任意一個節點的32123端口,便可看到pod所提供的服務,以下:
k8s之yaml文件基本格式及底層負載均衡實現原理後端

[root@master ~]# kubectl describe svc httpd-service       #查看該service的詳細信息

返回的信息以下(只能顯示少許IP,剩下的只是被省略了,而不是未指定):
k8s之yaml文件基本格式及底層負載均衡實現原理api

既然上面說到了,endpoint指定的都是後端pod的IP地址,那麼就來查看驗證一下,是否正確,以下:app

[root@master ~]# kubectl get pod -o wide | awk '{print]'   #輸出後端pod的IP地址
IP
10.244.1.18
10.244.2.21
10.244.1.17
10.244.2.20
#能夠確認查看的IP能對應上上面service的endpoint指定的IP

查看svc映射endpoint的詳細狀況,並詳細說明負載均衡的底層原理。負載均衡

三、當咱們作完上述操做後,client是能夠訪問咱們pod提供的服務的(而且是負載均衡的效果),那麼這是一個什麼樣的實現過程呢?依賴什麼實現的?

其實,背後的原理並無那麼高大上,kube-proxy經過iptables的轉發機制來實現負載均衡的效果的,先定義目標IP是service提供的羣集IP,而後使用「-j」選項轉發到其餘iptables規則,以下:dom

[root@master ~]# kubectl get svc httpd-service | awk '{print $3}'
#咱們須要先查看到service的羣集IP
CLUSTER-IP   
10.97.13.198
[root@master ~]# iptables-save > a.txt          #將iptables規則輸出到文件中,方便咱們查找
[root@master ~]# vim a.txt         #打開iptables規則

搜索咱們的羣集IP,能夠看到,當目標地址是羣集IP地址時,就會轉發到另外一個規則「KUBE-SVC-X2P42VLQEZCHLPKZ」,以下:ide

k8s之yaml文件基本格式及底層負載均衡實現原理
那麼,如今繼續搜索它轉發到的規則上,以下:
k8s之yaml文件基本格式及底層負載均衡實現原理spa

上面的圖中,就是與他實現負載均衡相關的策略的,咱們一共四個pod,因此上圖中的第一個規則使用了random的算法,只有0.25(1/4)的概率採用這個規則,當到達第二條規則後,則有0.33的概率,由於去除前一個pod,還剩下三個pod,10/3=0.33,這就是這個概率的由來,依次類推,當到達最後一個規則後,那麼就不用指定概率了,確定是它來處理這條請求。

相關文章
相關標籤/搜索