k8s之yaml文件基本格式及底层负载均衡实现原理

本文只是自己的精简后的总结,若需要详细的资料,请绕步。

注:yaml文件严格要求缩进,默认不同层次等级是两个空格的缩进。

1、使用httpd镜像创建一个Deployment资源对象

[[email protected] ~]# 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                #指定基于哪个镜像运行容器
[[email protected] ~]# kubectl apply -f lvjianzhao.yaml     #执行编写的文件
[[email protected] ~]# kubectl explain deployment
#注:如果不知道某个资源对象所对应的API版本,可以通过此命令查看
KIND:     Deployment
VERSION:  extensions/v1beta1             #这就是Deployment资源所对应的API版本
                        ........................#省略部分内容
[[email protected] ~]# kubectl get deployment lvjianzhao-deploy
#确定所执行的yaml文件生成了我们所需数量的pod

查看其pod标签,是否是我们定义的label:

[[email protected] ~]# kubectl describe deployment lvjianzhao-deploy    #查看这个资源对象的详细信息
Name:                   lvjianzhao-deploy
Namespace:              default
CreationTimestamp:      Thu, 07 Nov 2019 17:50:44 +0800
Labels:                 "user=lvjianzhao"              #这里就是该资源对象的标签

2、创建一个svc资源对象与上述Deployment资源对象关联。且能够对外网提供服务。映射节点端口为:32123.

[[email protected] ~]# 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     #这里指定的是映射到宿主机的端口
[[email protected] ~]# kubectl apply -f httpd-service.yaml        #执行该yaml文件
[[email protected] ~]# 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所提供的服务,如下:

[[email protected] ~]# kubectl describe svc httpd-service       #查看该service的详细信息

返回的信息如下(只能显示少量IP,剩下的只是被省略了,而不是未指定):

既然上面说到了,endpoint指定的都是后端pod的IP地址,那么就来查看验证一下,是否正确,如下:

[[email protected] ~]# 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的详细情况,并详细说明负载均衡的底层原理。

3、当我们做完上述操作后,client是可以访问我们pod提供的服务的(并且是负载均衡的效果),那么这是一个什么样的实现过程呢?依赖什么实现的?

其实,背后的原理并没有那么高大上,kube-proxy通过iptables的转发机制来实现负载均衡的效果的,先定义目标IP是service提供的群集IP,然后使用“-j”选项转发到其他iptables规则,如下:

[[email protected] ~]# kubectl get svc httpd-service | awk ‘{print $3}‘
#我们需要先查看到service的群集IP
CLUSTER-IP
10.97.13.198
[[email protected] ~]# iptables-save > a.txt          #将iptables规则输出到文件中,方便我们查找
[[email protected] ~]# vim a.txt         #打开iptables规则

搜索我们的群集IP,可以看到,当目标地址是群集IP地址时,就会转发到另一个规则“KUBE-SVC-X2P42VLQEZCHLPKZ”,如下:


那么,现在继续搜索它转发到的规则上,如下:

上面的图中,就是与他实现负载均衡相关的策略的,我们一共四个pod,所以上图中的第一个规则使用了random的算法,只有0.25(1/4)的几率采用这个规则,当到达第二条规则后,则有0.33的几率,因为去除前一个pod,还剩下三个pod,10/3=0.33,这就是这个几率的由来,依次类推,当到达最后一个规则后,那么就不用指定几率了,肯定是它来处理这条请求。

原文地址:https://blog.51cto.com/14154700/2448588

时间: 2024-08-30 11:32:32

k8s之yaml文件基本格式及底层负载均衡实现原理的相关文章

.net core i上 K8S(三)Yaml文件运行.netcore程序

上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以去网上搜一下示例. apiVersion: apps/v1beta2 #指定版本,支持的版本可以通过kubectl api-versions查询 kind: Deployment #指定类型,这一次我们要创建一个Deployment metadata: #元数据 name: cys-netcore #de

K8s之YAML文件

Kubernetes支持YAML和JSON格式创建资源对象 1,JSON格式用于接口之间消息的传递2,YAML格式用于配置和管理3,YAML是一种简洁的非标记性语言 语法格式: 缩进标识层级关系不支持制表符(tab)缩进,使用空格缩进通常开头缩进两个空格字符后缩进一个空格,如冒号,逗号等"---"表示YAML格式,一个文件的开始"#"表示注释 `查看应用名称` [[email protected] ~]# kubectl api-versions admission

yaml文件的格式

后缀为.yml    格式一般就是key:空格 value    这里的value可以是 普通数据(数字,字符串)   ----------------------------------------字符串一般不需要引号,引号有它特殊的作用   -----------单引号---------------会原模原样输出   -----------双引号---------------有转义字符会转义后输出   也可以是列表  list  ,map ,对象            例子:----- #

k8s的yaml文件配置详解(转))

来源:https://www.cnblogs.com/arrow-kejin/p/10058758.html 1 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 2 kind: Pod #指定创建资源的角色/类型 3 metadata: #资源的元数据/属性 4 name: django-pod #资源的名字,在同一个namespace中必须唯一 5 labels: #设定资源的标签,使这个标签在service网络中备案,以便被获知 6 k8s-

基于腾讯云CLB实现K8S v1.10.1集群高可用+负载均衡

概述: 最近对K8S非常感兴趣,同时对容器的管理等方面非常出色,是一款非常开源,强大的容器管理方案,最后经过1个月的本地实验,最终决定在腾讯云平台搭建属于我们的K8S集群管理平台~ 采购之后已经在本地部署了不下百次模拟线上生成环境,尽可能还原本地搭建过程,于是修改了安装脚本以及镜像文件. 基础环境 主机 地址 Type k8s-host1 192.168.100.121 master node k8s-host2 192.168.100.122 master node k8s-host3 192

镭速-文件传输系统,单机、负载均衡,使用外部AD域用户

AD域对接配置:在安装启动镭速后,[登录镭速](www.raysync.cn)服务器的管理员控制台,在控制台中配置AD域对接信息.数据库选择:单机部署模式下,镭速服务器支持配置SQLite或MySQL数据库.在没有特殊要求时,单机部署建议使用内置的SQLite即可满足使用.SQLite数据库的优势是简单易用,无需额外安装配置MySQL数据库.存储选择:存储没有特殊要求,可以是服务器本身的磁盘存储,也可以使用外部的共享存储,如NAS. 数据库选择:负载均衡部署模式下,镭速服务器必须使用MySQL数

K8s使用YAML文件创建资源

由于K8s技术的火爆,导致现在大大小小的企业都在使用,虽然没有普及,但本人相信时迟早的事情,所以抓紧时间多学习一下吧! 在K8s中创建资源的方式有两种:命令行和YAML文件,本次博文主要介绍使用YAML文件的方式,如需使用命令行创建资源请参考K8s资源对象的基本管理 Kubernetes中的YAML文件与配置清单是一样的,根据个人习惯.本次博文统称为YAML文件! 一.YAML文件基础 YAML是专门用来配置文件的语言,非常简洁和强大.与了解的properties.XML.json等数据格式,习

k8s yaml文件说明

nginx yaml文件说明 --- #定义nginx命名空间 apiVersion: v1 kind: Namespace metadata: name: k8s-nginx #自定义的命名空间 --- #定义nginx service apiVersion: v1 kind: Service metadata: name: k8s-nginx namespace: k8s-nginx labels: app: k8s-nginx spec: type: NodePort ports: - p

Kubernetes之yaml文件详解-v1.15.x

Kubernetes之yaml文件详解 K8S 创建资源的方式 K8S有两种创建资源的方式:kubectl 命令和 yaml 配置文件. kubectl命令行:最为简单,一条命令就OK,但缺点也很明显,你并不知道这条命令背后到底做了哪些事!yaml配置文件:提供了一种让你知其然更知其所以然的方式.优势如下: 完整性:配置文件描述了一个资源的完整状态,可以很清楚地知道一个资源的创建背后究竟做了哪些事:灵活性:配置文件可以创建比命令行更复杂的结构:可维护性:配置文件提供了创建资源对象的模板,能够重复