Kubernetes核心概念
Kubernetes核心概念
container :容器即可以运行服务和程序,容器是独立运行的一个或一组应用。容器可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。
Pod :
在 Kubernetes 系统中,pod是最小部署单元,一个pod包含一个或者多个紧密相连的业务容器(即一组容器的集合)。
Kubernetes为每个Pod都分配了唯一的IP地址,称之为PodIP,一个Pod里的多个容器共享PodIP地址,它负责外部跟容器之间进行通信。
Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通信。
Controllers 控制器,Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。所以controller负责维护集群的状态,,比如故障检测、自动扩展、滚动更新等; 目前已经提供了很多控制器来保证Kubernetes的正常运行,一个资源对应一个控制器,而Controller Manager就是负责管理这些控制器的。
Replication Controller(RC,副本控制器)管理维护Replication Controller,确保预期的Pod副本数量,保证Replication Controller定义的副本数量与实际运行Pod数量一致。
Node Controller(节点控制器)管理维护Node,定期检查Node的健康状态,标识出(失效|未失效)的Node节点。
Daemon Set Controller:确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。
Deployment :无状态应用部署,滚动升级pod。 Deployment 对象并不是直接操控的 Pod 对象,而是操控的 ReplicaSet 对象,而 ReplicaSet 对象就是由副本的数目的定义和Pod 模板组成的。
StatefulSet : 有状态应用部署,StatefulSet与Deployment相比,相同点是他们管理相同容器规范的Pod,不同的是,StatefulSet为pod创建一个持久的标识符,他可以在任何编排的时候得到相同的标识符。 StatefulSet适用于具有以下特点的应用:
具有固定的网络标记(主机名)
具有持久化存储
需要按顺序部署和扩展
需要按顺序终止及删除
需要按顺序滚动更新
Services 实现基于四层的负载均衡功能 Services 是 Kubernetes 最外围的单元,通过虚拟一个访问 IP 及服务端口,可以访问我们定义好的 Pod 资源,是通过 iptables 的 nat 转发来实现,转发的目标端口为Kube_proxy 生成的随机端口。
外部系统访问Service的问题,首先需要弄明白Kubernetes的三种IP这个问题 Node IP:Node节点的IP地址 Pod IP: Pod的IP地址 Cluster IP:Service的IP地址
job : 一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。
Cronjob : 定时任务
Labels 标签,标签用于区分对象(比如Pod、Service),Kubernetes中的任意对象都是通过Label进行标识,Label的实质是一系列的Key/Value键值对,其中key与value由用户自己指定。
总结各组件之间的关系
1、Kubernetes的架构由一个master和多个node组成,master通过api提供服务,接受kubectl的请求来调度管理整个集群。 注:kubectl:是 k8s 平台的一个管理命令。
2、Controller Manager是Kubernetes所有资源对象的自动化控制中心,处理集群中常规后台任务,一个资源对应一个控制器,而Controller Manager就是负责管理这些控制器的。例如Replication controller 定义了有多少个 pod 或者容器需要运行,如果当前集群中运行的 pod 容器达不到配置的数量,replication controller 会调度容器在minion 上运行,保证集群中的 pod 数量。
3、service 则定义对外网提供的服务,一个 service 会对应后端运行的多个 container。没有service访问不到容器。
4、Kubernetes 是个管理平台,node上的 proxy 拥有提供真实服务公网 IP。客户端访问kubernetes 中提供的服务,是直接访问到 kube-proxy 上的。
5、在 Kubernetes 中 pod 是一个基本单元,一个 pod 可以是提供相同功能的多个 container,这些容器会被部署在同一个node上。node是运行 Kubelet 中容器的宿主机。node接受 master的指令创建 pod 或者容器。
创建一个Pod的内部流程
用户提交创建Pod的请求,可以通过Kubectl命令行工具,支持Json和Yaml两种格式;
API Server 处理用户请求,存储要创建的Pod数据到Etcd数据库;
Schedule(调度器)通过和 API Server的watch(监听)机制,查看到新的pod,尝试为新的Pod绑定Node节点;
过滤主机:调度器用一组规则过滤掉不符合要求的主机,比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机;
主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;
选择主机:选择打分最高的主机,进行binding操作,把结果存储到Etcd中;
kubelet根据调度结果执行Pod创建操作: 绑定成功后,会启动container, docker run启动容器, scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。
分享: