1.什么是Kubernetes
Kubernete(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg),提供了面向应用的容器集群部署和管理系统。Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心上的自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。Kubernetes使用Golang开发,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:
自动化容器的部署和复制,使用Docker提供对应用程序部署运行、资源调度、服务发现和动态伸缩
可扩展的资源自动调度机制以及多粒度的资源配额管理能力
将容器组织成组,并且提供容器间的负载均衡,管理跨机器的容器
强大的故障发现和自我修复能力
服务滚动升级和在线扩容能力
当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、AWS、Azure等平台,除此之外,也可以直接运行在物理机上。
2.Kubernetes架构
k8s集群分为Master节点和Minion/Node节点。节点有各自分工的组件,通过etcd(可选)协同工作。
Kubernetes主要由以下几个核心组件组成:
etcd:保存了整个集群的状态;
apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
kubelet:负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理;
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡;
除了核心组件,还有一些推荐的Add-ons:
kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外网入口
Heapster:提供资源监控
Dashboard:提供GUI
Federation:提供跨可用区的集群
Helm:提供kubernetes应用的包管理工具
2.1 Master控制节点
集群拥有至少一个Kubernetes Master。Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和复制Pod的Replication Controller。
API Server[资源操作入口]
API Server 提供了资源对象的唯一操作入口,其它所有组件都必须通过它提供的 API 来操作资源数据。只有 API Server 会与存储通信,其它模块都必须通过 API Server 访问集群状态。
API Server 作为 Kubernetes 系统的入口,封装了核心对象的增删改查操作。API Server 以 RESTFul 接口方式提供给外部客户和内部组件调用,API Server 再对相关的资源数据(全量查询 + 变化监听)进行操作,以达到实时完成相关的业务功能。
以 API Server 为 Kubernetes 入口的设计主要有以下好处:
保证了集群状态访问的安全。
API Server 隔离了集群状态访问和后端存储实现,这样 API Server 状态访问的方式不会因为后端存储技术 Etcd 的改变而改变,让后端存储方式选择更加灵活,方便了整个架构的扩展。
Controller Manager[内部管理控制中心]
Controller Manager 用于实现 Kubernetes 集群故障检测和恢复的自动化工作。Controller Manager 主要负责执行以下各种控制器:
Replication Controller
Replication Controller 的作用主要是定期关联 Replication Controller (RC) 和 Pod,以保证集群中一个 RC (一种资源对象) 所关联的 Pod 副本数始终保持为与预设值一致。
Node Controller
Kubelet 在启动时会通过 API Server 注册自身的节点信息,并定时向 API Server 汇报状态信息。API Server 在接收到信息后将信息更新到 Etcd 中。
Node Controller 通过 API Server 实时获取 Node 的相关信息,实现管理和监控集群中的各个 Node 节点的相关控制功能。
ResourceQuota Controller
资源配额管理控制器用于确保指定的资源对象在任何时候都不会超量占用系统上物理资源。
Namespace Controller
用户通过 API Server 可以创建新的 Namespace 并保存在 Etcd 中,Namespace Controller 定时通过 API Server 读取这些 Namespace 信息来操作 Namespace。
比如:Namespace 被 API 标记为优雅删除,则将该 Namespace 状态设置为 Terminating 并保存到 Etcd 中。同时 Namespace Controller 删除该 Namespace 下的 ServiceAccount、RC、Pod 等资源对象。
Service Account Controller
Service Account Controller (服务账号控制器),主要在命名空间内管理 ServiceAccount,以保证名为 default 的 ServiceAccount 在每个命名空间中存在。
Token Controller
Token Controller(令牌控制器)作为 Controller Manager 的一部分,主要用作:监听 serviceAccount 的创建和删除动作以及监听 secret 的添加、删除动作。
Service Controller
Service Controller 是属于 Kubernetes 集群与外部平台之间的一个接口控制器,Service Controller 主要用作监听 Service 的变化。
比如:创建的是一个 LoadBalancer 类型的 Service,Service Controller 则要确保外部的云平台上对该 Service 对应的 LoadBalancer 实例被创建、删除以及相应的路由转发表被更新。
Endpoint Controller
Endpoints 表示了一个 Service 对应的所有 Pod 副本的访问地址,而 Endpoints Controller 是负责生成和维护所有 Endpoints 对象的控制器。
Endpoint Controller 负责监听 Service 和对应的 Pod 副本的变化。定期关联 Service 和 Pod (关联信息由 Endpoint 对象维护),以保证 Service 到 Pod 的映射总是最新的。
Scheduler[集群分发调度器]
Scheduler收集和分析当前Kubernetes集群中所有Minion节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。
实时监测Kubernetes集群中未分发和已分发的所有运行的Pod。
Scheduler也监测Minion节点信息,由于会频繁查找Minion节点,Scheduler会缓存一份最新的信息在本地。
最后,Scheduler在分发Pod到指定的Minion节点后,会把Pod相关的信息Binding写回API Server。
2.2 Node工作节点
Node是物理机或者虚拟机器,作为Kubernetes worker,通常称为Minion,是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kubelet及负载均衡器kube-proxy,每个节点都运行如下Kubernetes关键组件:
Kubelet[节点上的Pod管家]
负责 Node 节点上 Pod 的创建、修改、监控、删除等全生命周期的管理。
定时上报本地 Node 的状态信息给 API Server。
Kubelet 是 Master API Server 和 Minion / Node 之间的桥梁,接收 Master API Server 分配给它的 Commands 和 Work。
Kubelet 通过 Kube ApiServer 间接与 Etcd 集群交互来读取集群配置信息。
Kubelet 在 Node 上做的主要工作具体如下:
1. 设置容器的环境变量、给容器绑定 Volume、给容器绑定 Port、根据指定的 Pod 运行一个单一容器、给指定的 Pod 创建 Network 容器。
2. 同步 Pod 的状态,从 cAdvisor 获取 Container Info、 Pod Info、 Root Info、 Machine info。
3. 在容器中运行命令、杀死容器、删除 Pod 的所有容器。
Proxy[负载均衡、路由转发]
Proxy 是为了解决外部网络能够访问集群中容器提供的应用服务而设计的,Proxy 运行在每个 Minion / Node 上。
Proxy 提供 TCP / UDP 两种 Sockets 连接方式 。每创建一个 Service,Proxy 就会从 Etcd 获取 Services 和 Endpoints 的配置信息(也可以从 File 获取),然后根据其配置信息在 Minion / Node 上启动一个 Proxy 的进程并监听相应的服务端口。当外部请求发生时,Proxy 会根据 Load Balancer 将请求分发到后端正确的容器处理。
Proxy 不但解决了同一宿主机相同服务端口冲突的问题,还提供了 Service 转发服务端口对外提供服务的能力。Proxy 后端使用随机、轮询等负载均衡算法进行调度。
kubectl(kubelet client)[集群管理命令行工具集]
Kubectl 是 Kubernetes 的 客户端的工具。 通过 Kubectl 命令对 API Server 进行操作,API Server 响应并返回对应的命令结果,从而达到对 Kubernetes 集群的管理。
Docker Engine(Docker):Docker引擎,负责本机容器的创建和管理工作
参考:
https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/