一、Kubernetes集群节点

K8S管理是一个集群,节点分为Masters管理节点和Nodes运行节点。
- Master,是控制平面,一般只有一个执行,布置多个是为了在当前管理节点挂掉后可以立即启动另一个Master继续工作。
- Node,是数据平面,他们之间是负载均衡的,各Node同时工作,当某个Node挂掉时,该Node正在执行的任务会自动分配给其他Node。
1.K8S的Master节点

Master节点分为四个部分(上图蓝色包含):
- APIServer:(门禁)所有服务访问与资源crud的统一入口,是一个数据库,将接受并校验客户端请求与命令,校验通过则存储在etcd中;
- Scheduler:(调度器,指挥官)负责介绍任务,选择合适的节点进行分配任务,有预算策略(predict),优选策略(priorities);
- Controller-Manager:(控制器,大脑)由一系列控制器组成,负责管理资源,监控和维持Node期望的运行状态,主要完成生命周期功能和API业务逻辑;
Controller-Manager的组成有Node Controller,Deployment Controller,Service Controller,Volume Controller,Endpoint Controller,Garbage Controller,Namespace Controller,Job Controller,Resource quta Controller等
- ETCD:键值对数据库,储存K8S集群所有的重要信息(持久化),此重要信息一般包含请求之后经APIServer规范后的期望数据、Scheduler调度结果数据等。
1.2、K8S的Master节点

- Kubelet
当Scheduler为某个Node分发任务后,会将任务信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向master报告运行状态。Kubelet是真正干活的组件。 - Container Runtime
容器运行时(Container Runtime)环境,一般为docker引擎,也可以是其他容器引擎。 - Kube-proxy
service在逻辑上代表了后端的多个Pod,外借通过service访问Pod。service接收到请求就需要kube-proxy完成转发到Pod的。每个Node都会运行kube-proxy服务,负责将访问的service的TCP/UDP数据流转发到后端的容器,如果有多个副本,kube-proxy会实现负载均衡。
二、Kubernetes的核心对象
2.1、pod
- pod是k8s的原子单元,每个pod可以有一个或多个容器,pod中的容器共享存储和网络(UST、NET、IPC名称空间),在同一台宿主机上运行
2.2、Service

- pod的地址(pod_ip)会因为各种原因(比如机器挂了,或者pod销毁重建等)改变,service实际上是pod的代理,service的地址(service_ip或cluster_ip)变化相对不频繁。
- 每个pod都会有自己的label(键值对),而service上有Lable-Selector(下面有对Label的相关介绍),通过选择器关联相应的pod,pod重建后即使pod_id改变label也不会改变,这样客户端访问pod就不受pod重建的影响。service本身不是一个服务,而是一种规则,是在客户端和pod之间的中间组件。
- 当然service也不是一成不变,但service重建时service_name不会变,它会向DNS注册service_name与service_ip,客户端访问pod时,DNS会先通过service_name解析出service_ip,客户端通过service_ip访问service,通过service访问pod。
- 一个Service可以看做是一组提供相同服务的Pod的对外访问接口。
2.3、Namespace
- 通过将Kubernetes集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。默认的Namespace有default、kube-system、kube-public,查询资源时要带上相应的名称空间。
- K8S里,使用资源定义每一种逻辑概念,资源一般有apiVersion、kind(类别)、metadata(元数据)、spec(定义清单)、status等配置信息。而name通常定义在资源的metadata里。
2.4、Volume
- 数据卷Volume定义在Pod上,被Pod里的多个容器挂载到具体的文件目录下,当容器终止或者重启时,Volume中的数据也不会丢失。
三、Kubernetes的POD控制器
Pod控制器是pod启动的模板,用来保证启动的pod始终按照预期运行(副本数、生命周期,健康状态检查)
如果你对k8s已经有一丢丢基础,关于k8s对象和控制器可参阅这里,个人觉得写得比较好,但不太适合初学者
3.1replicaSet
- 官方解释为“下一代的RC(Reolication Controller)”,确保任何给定时间内指定的pod副本数量,并提供声明式更新等功能。它与RC当前存在的唯一区别是:Replica Set支持基于集合的Label selector(Set-based selector),而RC只支持基于等式的Label selector(equality-based selector),所以Replica Set的功能更强大RS会逐步取代RC。
3.2deployment
- deployment是一个更高层次的API对象,它管理replicaSet和pod,并提供声明式更新等功能。官方建议使用deployment管理replicaSet而不是直接使用replicaSet,即基本不需要直接操作replicaSets对象。
3.3statefulSet
- statefulSet适合持久性的应用程序,有唯一的网络标识符(IP),有序的部署、扩展、删除和滚动更新。
3.4daemonSet
- daemonSet确保所有(或一些)节点运行同一个pod,当节点加入kubernetes集群中,pod会被调度到该节点上运行,当节点被移除时,daemonSet的pod会被删除,删除daemonSet会清理它创建的所有pod。
3.5job
- 一次性任务,运行完成后po被销毁,不再重新启动新容器,还可以定时运行任务。
四、其他重要知识点
4.1Labe与Label-Selector
4.1.1Label
- 标签是K8S的特色管理方式,便于分类管理资源对象,标签与资源时多对多的关系;
- 标签一般是key:value键值对的方式;
4.1.2Label-Selector
- 给资源打上Label之后,可以使用标签选择器过滤标签,一般有基于等值关系(==,<>)和基于集合关系(属于、不属于、存在)两种
4.2k8s的网络模型

















