kubernetes 核心组件

etcd:保存整个集群的状态

apiserver:提供资源操作的唯一入口,并提供认证、授权、访问控制、api注册和发现等机制

controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

scheduler:负责资源调度,按照预定的调度策略将pod调度到相应的机器上

kubelet:负责维护容器的生命周期,同时也负责volume(CVI)和网络(CNI)的管理

CNI:容器网络接口标准

Container runtime:负责镜像管理以及pod和容器的真正运行(CRI)

kube-proxy:负责为service提供cluster内部的服务发现和负责均衡

 

kubernetes 核心对象

Cluster:计算、存储、网络资源的集合,kubernetes利用这些资源运行各种基于容器的应用。

Master:是Cluster的大脑,她主要职责是调度,即决定将应用放在那里运行,可以运行多个Master

Node:职责是运行容器应用,Node由Master管理,Node负责监控并汇报容器的状态,bin根据Master的要求管理容器的生命周期

Pod:是kubernetes的最小工作单元,每个Pod包含一个或多个容器,Pod中的容器被作为一个整体被Master调度到一个Node上运行。目的:可管理性、通信和资源共享

 

 

 

 

File Puller 会定期从外部的 Content Manager 中拉取最新的文件,将其存放在共享的 volume 中。Web Server 从 volume 读取文件,响应 Consumer 的请求。这两个容器是紧密协作的,它们一起为 Consumer 提供最新的数据;同时它们也通过 volume 共享数据。所以放到一个 Pod 是合适的。

创建Pod流程

 

 

 

1. 用户提交创建Pod的请求,可以通过API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml两种格式;

2. API Server 处理用户请求,存储Pod数据到Etcd;

3. Schedule通过和 API Server的watch机制,查看到新的pod,尝试为Pod绑定Node;

4. 过滤主机:调度器用一组规则过滤掉不符合要求的主机,比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机;

5. 主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;

6. 选择主机:选择打分最高的主机,进行binding操作,结果存储到Etcd中;

7. kubelet根据调度结果执行Pod创建操作: 绑定成功后,会启动container, docker run, scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。

 

Controller:kubernetes不会直接创建Pod,而是通过Controller来管理Pod的,Controller中定义了Pod的部署特性,比如有几个副本,在什么样的node上运行等,kubernetes提供了多种Controoler包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等

Service:RC、RS和Deployment只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题。一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。

服务发现完成的工作,是针对客户端访问的服务,找到对应的的后端服务实例。在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个;这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。与之相比,我们平时在服务器端做个反向代理做负载均衡,还要进一步解决反向代理的负载均衡和高可用问题。

 

 

Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller Service 执行。

 

Namespace名字空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以可以创建新的名字空间满足需要。