基本概念
Master
master是集群控制点,每个kubernetes集群里面都需要一个Master节点来负责,
整个集群的管理和控制,基本Kubernetes的所有控制命令都是发给它,它来负责具体的执行过程。
Master节点运行着以下一组关键进程:
1. kube-apiserver: 提供http rest接口的关键服务进程
2. kube-controller-manager:kubernetes里所有资源对象的自动化控制中心
3. kube-scheduler:负责资源调度(pod调度)的进程,相当于公司的‘调度室’
Node
kubernetes集群中其他机器成为Node节点,当某个Node宕机时,其上的工作会被Master自动转移到
其他节点上去。
每个Node节点存在着以下一组关键进程:
1. kubelet: 负责Pod对应的容器的创建、启停等任务,同时与Master节点紧密合作,实现集群管理的基本功能
2. kube-proxy: 实现kubernetes Service的通信与负载均衡机制的重要组件
3. Docker Engine:负责本机的容器创建与管理工作
Pod
每个Pod都有一个称为根容器的Pause容器,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
Label
给某个资源对象定义一个Label,就相当于给它打了个标签,随后我们可以通过Label Selector查询和筛选拥有某些Label的资源对象。
RC
它声明某种pod的副本的数量在任意时刻都符合某个预期值,RC包括以下用于几个部分:
1. Pod期待的副本数量
2. 用于筛选目标Pod的Label Selector
3. 当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板
HPA (Horizotal Pod Autoscaler)
HPA, pod横向自动扩容,通过跟踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数。
Service
Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问背后的一组由Pod组成的集群实例。
每个pod都会被分配一个单独的IP地址,每个Pod都提供了一个独立的EndPoint(Port Ip + ContainerPort)以被客户端访问,现在多个pod副本组成了一个集群来提供服务,客户端访问他们,先部署一个负载均衡器,为这组Pod开启一个对外的服务器口如8000,并将这些Pod的Endpoint加入8000端口的转发列表中,客户端就可以通过负载均衡器的对外IP地址+服务端口来访问此服务,而客户端的请求最后被转发到哪个Pod,由负载均衡器决定。
每个service分配了一个全局唯一的虚拟IP地址,这个虚拟Ip为Cluster IP,在service的整个生命周期内,它的cluster ip不会变,每个服务就变成了具备唯一IP地址的通信节点,任务调度就变成了最基础的tcp网络通信问题。
kubernetes的发现机制
任何分布式系统都会涉及服务发现的问题,大部分分布式系统提供特定的API接口来实现服务发现问题。由于kubernetes中的service都有唯一的Cluster IP以及唯一的名字,如何让通过service的名字找到对应的Cluster IP,后来kubernetes通过Add-On增值包的方式引入DNS系统,把服务名作为DNS域名。
外部访问service的问题
kubernetes的三种IP:
Node IP: Node节点的IP
Pod IP: Pod的IP地址
Cluster IP: service的IP地址
Node Ip是Kubernetes集群中每个节点的物理网卡的IP地址,kubernetes集群之外的节点访问kubernetes集群内的某个节点或者TCP/IP服务的时候,必须通过Node IP进行通信。
Pod Ip是每个Pod的IP地址,它是Docker Engine根据docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,kubernetes里面每一个Pod容器访问另外一个Pod容器,就是通过Pod IP所在的虚拟二层网络来进行通信的,而真实的TCP/IP流量是通过Node Ip所在的物理网卡发出的。
Cluster IP只能结合Service Port组成一个具体的通信端口,单独的cluster IP不具备通信的基础,并且它是属于Kubernetes集群这样的一个封闭区间,集群外的节点如果要访问这个通信端口,需要做一些而外的工作。Node Ip、 Pod Ip、Cluster Ip网之间的通信采用的是kubernetes自己设计的一种编程方式的特殊路由规则。
NodePort的实现方式是在kubernetes集群里面的每个Node上为需要额外访问的Service开启一个对应的TCP监听端口
Volume(存储卷)
Volume是Pod中能够被多个容器访问的共享目录,Kubernetes中的Volume定义在Pod上,然后被一个Pod里面的多个容器挂在到具体的目录下,kubernetes中的Volume与pod的生命周期相同,但与容器的生命周期不相关,当容器终止或者重启时,Volume里面的数据也不会丢失。
Presistent Volume
PV可以理解成集群中某个网络存储对应的一块内存,它与Volume类似,但有以下区别:
PV只能是网络存储,不属于任何Node,但在每个Node上可以访问
PV不是定义在Pod上的,而是独立与Pod之外定义
Namespace (命名空间)
Namespace在很多情况下实现多租户的资源隔离,NameSpace通过将集群内部的资源对象分配到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户、便于在不同的分组在共享使用整个集群资源的同时还能被分割管理。
Annotation(注释)
Annotation与Label类似,也使用key/value键值对的形式进行定义。不同的是Label具有严格的命名规则,他定义的是Kubernetes对象的元数据,并且用于Label Selector,而Annotation则是用户任意定义的“附加”信息,以便外部工具正在查找,很多时候,kubernetes的模块会通过Annotation的方式标记资源对象的一些特殊信息。
通常来说, 用Annotation来记录的信息如下:
build信息、release信息、Docker镜像信息、例如时间戳、release id号,PR号,镜像hash、docker registry地址等
日志库、监控库、分析库等资源的信息,等