Kubernetes(K8s)(一)——基础知识
在阿里云看到一个新的,大家可以看一下:容器服务 kubernetes 系统组件介绍
找到k8s中文社区文档,里面有名词解释:http://docs.kubernetes.org.cn/
(1).Kubernetes概述
Kubernetes简称K8s,是Google开源的容器集群编排系统,基于Docker构建一个容器的调度服务,提供了资源调度、均衡容灾、服务注册、动态扩/缩容等功能。官网地址:https://kubernetes.io/
注意:Kubernetes是基于docker容器的云平台,OpenStack是基于KVM虚拟机的云平台。
(2).Kubernetes集群架构图
在官网上,目前有两种集群架构,一种是没有云控制管理器的集群架构,一种是有云控制管理器的集群架构。这里就必须说到云控制管理器(cloud controller manager,简称CCM)这个概念,根据官网所说,云控制管理器创建的初衷是为了让特定的云服务供应商代码能和Kubernetes核心互相独立演化(运行?)。并且云控制管理器可以与其他主要组件(例如Kubernetes controller manager, API server和scheduler)一起运行,也可以作为插件在Kubernetes上运行。
下图是官方提供的没有云控制管理器时的集群架构图,我个人觉得需要说明的是三个云连接标志。第一个,连接到kube-controller-manager的云连接,在Kubernetes控制管理器中有一个Service Controller功能,该功能是属于kubernetes集群与外部的云平台之间的一个接口控制器(Web管理?)。第二个,连接到kube-apiserver的云连接,该连接是命令行工具kubectl客户端通过命令行参数转换为对API Server的REST API调用,并将调用结果输出(命令行管理)。第三个,连接到minion(下属)节点的云连接,实际是连接到kube-proxy,该连接通过kube-proxy使得外部网络可以访问跨机器集群中的容器提供的应用服务(客户访问)。
还有一个官方提供的有云控制管理器的集群架构,如下图。在该架构下,所有云连接都需要经过云控制管理器,并且云控制管理器接管了Kube-controller-manager(Kubernetes控制管理器)中节点控制器、路由控制器、服务控制器,以及kubelet中初始化节点。
(3).Kubernetes常见组件简单介绍
声明:这里以没有云控制器的集群架构为例。
Kuberbetes一般可以分为Master节点和Minions节点(Minions节点有时也被成为Node节点),有时etcd也会被独立出来。Master节点包含controller manager、apiserver(API Server)、etcd和scheduler。而MInions节点包含kubelet、kube-proxy(也可以认为是proxy)、Pod和Container。
1)Controller Manager
Controller Manager作为集群内部的管理控制中心,实现集群故障检测和恢复的自动化工作,负责执行集群内的副本控制器(Replication Controller)、节点控制器(Node Controller)、资源配额控制器(ResourceQuota Controller)、命名空间控制器(Namespace Controller)、服务账号控制器(ServiceAccount Controller)、令牌控制器(Token Controller)、服务控制器(Service Controller)和服务端点控制器(Endpoint Controller)。
副本控制器(Replication Controller):定期连接Replication Controller和Pod,保证Replication Controller定义的副本数量与实际集群中运行的Pod数量一致。如果部分宿主机出现异常,Replication Controller可以通过默认模板来创建Pod,也可以直接复制已存在的Pod,保证在其他宿主机启用相同数量的Pod。
服务端点控制器(Endpoint Controller):定期连接Service和Pod,保证Service到Pod的映射总是最新的(实时更新)。
更多Controller Manager详见:【转载】Kubernetes核心原理(二)之Controller Manager
2)API Server
API Server提供了Kubernetes各类资源对象(Pod,Replication Controller,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。并且只有API Server能与etcd(存储)进行通信,其他模块只能通过API Server访问集群状态。
更多API Server详见:【转载】Kubernetes核心原理(一)之API Server
3)Scheduler
Scheduler收集和分析当前Kubernetes集群中所有Minion/Node节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。并且,Scheduler实时监测Kubernetes集群中未分发和已分发的所有运行的Pod,同时也监测Minion/Node节点信息,由于会频繁查找Minion/Node节点,Scheduler会缓存一份最新的信息在本地。另外,Scheduler在分发Pod到指定的Minion/Node节点后,会把Pod相关的信息Binding写回API Server。
更多Scheduler详见:【转载】Kubernetes核心原理(三)之Scheduler
4)etcd
etcd存储Kubernetes的配置信息,可以理解为是k8s的数据库,存储着k8s容器云平台中所有节点、pods、网络等信息。
5)Kubelet
Kubelet是Master节点与Node/Minion节点的桥梁,每个Node/Minion节点都会启动Kubelet,它会处理Master节点下发的命令和任务,管理节点上的Pod和Pod中的容器。并且Kubelet会在API Server上注册节点信息,定期向Master汇报节点资源使用情况,通过cAdvisor监控容器和节点资源。可以说是Node/Minion节点上的Pod管家。
具体的工作如下:
1、设置容器的环境变量、给容器绑定Volume、给容器绑定Port、根据指定的Pod运行一个单一容器、给指定的Pod创建network 容器。
2、同步Pod的状态、同步Pod的状态、从cAdvisor获取container info、 pod info、 root info、 machine info。
3、在容器中运行命令、杀死容器、删除Pod的所有容器。
6)Proxy
Proxy是为了解决外部网络能够访问跨机器集群中容器提供的应用服务而设计的,运行在每个Node上。Proxy提供TCP/UDP sockets的proxy,每创建一种Service,Proxy主要从etcd获取Services和Endpoints的配置信息(也可以从file获取),然后根据配置信息在Node上启动一个Proxy的进程并监听相应的服务端口,当外部请求发生时,Proxy会根据Load Balancer将请求分发到后端正确的容器处理。
Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。
7)Pod和Container
在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod。Pod是一个可以被创建、销毁、调度、管理的最小的部署单元,可以包括一个或一组容器。
Container:容器,可以运行服务和程序。
参考:https://kubernetes.io/zh/docs/concepts/architecture/cloud-controller/