k8s基础知识——术语(一)

上文中我们已经搭建起了一个简易的k8s学习环境,那么我们这边就开始先了解一些基础术语以及概念先。

  

关键词一:Master
 
前面已经完成了k8s的单机环境搭建,只有一个master节点
k8s的master节点指的是集群的控制节点,基本k8s的所有控制命令都是发给它,由它来具体执行,如果master节点宕机,我们的所有控制命令都将失效
 
kubernetes
 
master节点上都运行着一组关键进程,那么我们首先看看这组关键进程都是什么
1.kube-apiserver(kubernetes api server)
该组进程提供了http rest接口的关键服务进程,是k8s里所有资源的crud等操作的唯一入口,也是集群控制的入口进程
 
2.kube-controller-manager(kubernetes controller manager)
是k8s里所有的资源对象的自动化控制中心,可以理解为资源对象的大总管。
 
3.kube-scheduler(kubernetes scheduler)
是k8s内负责资源调度(pod调度)的进程,相当于调度室
 
4.etcd(一个高可用的键值仓库用于配置共享和服务发现,类似于zk和doozer,基本覆盖了zk的应用场景,go语言开发,基于raft算法,更易懂和配置维护)
k8s内所有的资源数据都存储在etcd内
 
关键词二:Node
 
k8s集群内除了master节点外的其它节点被称为node节点,node节点是真正的工作负载节点,每个node都会被master节点分配一些工作负载(docker容器),当某个node节点宕机时,master节点就会转移该节点上的工作负载到其他node节点上
 
node节点可以在运行期间动态地加入到k8s集群中(前提是这些节点已经正确安装配置及启动了以下进程)
默认情况下,kubelet会自动向master节点进行注册,一旦node节点被master纳入管理,kubelet就会定时自动向master汇报自身节点情况,以便master实现高效的资源均衡调整策略。一旦node节点超过一定的时间未进行信息上报,master就会判定该node失联,从而进行工作负载的转移。
 
node节点上运行着以下一组关键进程
1.kubelet
负责pod对应的容器的创建,启停等任务,同时与master节点密切协作,实现集群管理的基本功能
 
2.kube-proxy
负责kubernetes service的通信与负载均衡的重要组件
 
3.docker engine(docker)
docker引擎,负责本机的docker容器的创建与管理工作
 
关键词三:Pod
通过图示可以看到,在一个pod内,除了n个业务容器,还有一个被称之为pause的容器,这个pause容器就是每个pod的“根容器”,该容器对应的镜像是属于k8s的一部分
 
Pod图示
 
疑问:为什么k8s的pod是这样的构造呢?
1.在一组容器作为一个单元的情况下,我们很难对整体的状态进行判断,如果一个容器挂掉了,那我们该怎么评断这个容器组的状态呢?那么在此处,引入一个与业务无关且不容易挂的pause容器作为pod的根容器,使用pause容器的状态代表这个容器组的状态,就能巧妙地解决这个问题
 
2.k8s为每个pod都配备了一个唯一的ip地址,称之为pod ip,一个pod里的多个容器共享这个pod id,且k8s要求底层网络内支持集群内的任意两个pod都能进行tcp/ip通讯。那么pod里的多个业务容器共享pause容器的ip,共享pause容器挂在的volume。这样不仅简化了业务容器间的通信问题,也很好地解决了他们之间的业务共享问题。(需要注意2处:一个集群内的任意两个pod都是能直接通信的)
 
pod的分类:
 
1.普通pod
一旦被创建,就会被放进etcd内进行存储,随后会被master节点调度到具体的某个node上进行绑定(binding),随后该pod会被node上的kubelet进程实例化成一组相关的docker容器并启动。默认情况下,pod内的容器挂掉,k8s能发现到这个问题并自动重启(pod内的所有容器),如果pod所在的node节点挂掉,则k8s会将该node上的所有pod迁移到其它可用node上。
 
2.静态pod(static pod)
静态pod比较特殊,被创建后不会存储于etcd内,而是存放在具体的某个node的一个具体文件上,并且只在此node上运行。
 
如何使用yaml文件和json文件定义一个pod
我们知道,k8s内所有的资源对象都能依靠json或yaml文件进行定义,那么一个pod是如何使用文件进行定义的呢?
 
pod定义文件示例
字段含义:
kind: pod 表明这是一个pod定义
metadata: 其它资源对象定义 此处定义了一个label标签
spec: pod内所含的容器在此定义,name指定容器名,image为构建容器的镜像,containerport为指定
端口上启动该容器的进程,env定义了一系列需要注入容器内的环境变量
 
那么此文件所构建的pod加上内里的容器,如果使用pod ip加上容器的端口,就构成一个新的概念叫做Endpoint。
它代表着,pod里的一个服务进程的对外通信地址。一个pod可以有多个Endpoint
 
 
 
 
 
pod周边示意图
 
 
 
 
 
 
 
 
 
关键词四:Label
一个label是一个key=value的键值对,key与value都由用户自己指定。label可以依附到所有的资源对象上,例如node,pod,service,rc等,一个资源对象可以有任意个label,同一个label也可以被添加到任意个资源对象上,label通常在资源对象创建时确定,也可以在创建后动态添加到资源对象上或移除。
 
label可以被label selector进行选择,类似于sql的where条件
 
基于等式的标签选择表达式
name = a1 name != a1
 
基于集合的标签选择表达式
name in (a1,a2) name not in (a1,a2)
 
多条件时用,分割,相当于and的条件
 
label selector在k8s内的几个重要场景:
1.kube-controller进程通过资源对象rc上定义的label selector 来筛选需要监控的pod副本的数量,从而实现pod的副本数量始终符合预期设定的全自动控制流程。
2.kube-proxy 通过service定义的label selector 来选择对应的pod,自动建立起每个service到对应pod的请求路由转发表,从而实现service的智能负载均衡机制。
3.通过对某些node定义特定的label,并且在pod中使用node selector这种标签调度策略,kube-scheduler可以实现pod的定向调度特性。
 
总结:使用label可以给对象创建多组标签,label和label selector共同构成了k8s系统中最核心的应用模型,使得被管理对象能被精细地分组管理,同时实现整个集群的高可用性。
 
 
(未完待续)
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/liuhuishan/p/12360408.html