一、Kubernetes集群节点

k8s上每个节点都需要安装docker吗 k8s 节点_kubernetes


K8S管理是一个集群,节点分为Masters管理节点和Nodes运行节点。

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

1.K8S的Master节点

k8s上每个节点都需要安装docker吗 k8s 节点_docker_02


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节点

k8s上每个节点都需要安装docker吗 k8s 节点_Pod_03

  • 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

k8s上每个节点都需要安装docker吗 k8s 节点_分布式_04

  • 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的网络模型

k8s上每个节点都需要安装docker吗 k8s 节点_docker_05