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,这就是这个概率的由来,依次类推,当到达最后一个规则后,那么就不用指定概率了,确定是它来处理这条请求。

相关文章
相关标签/搜索