Kubernetes是一款开源的通用多容器管理软件,提供了基本的部署、弹性扩容,自愈能力、负载平衡和流量路由等能力,是微服务应用程序的协调管理利器。Kubernetes将整个数据中心视为一台超级计算机,可以管理符合OCI标准的任何类型的容器。(例如Docker、Core OS的rkt容器等等)。Kubernetes的主要功能包括自动调度、自我修复、自动部署、回滚、水平扩展和负载平衡。
Kubernetes 架构由两个关键组件组成: master节点和worker节点(Minions)。
Master节点 - Kubernetes集群的控制节点
Master节点的工作方式类似于一个团队的管理者,负责整个集群的管理和控制,分配工作负载,类似于对团队有绝对控制权的足球教练。Master节点负责并做出全局决定,安排某个节点处理用户请求。Kubernetes还可以使用多Master节点设置来避免单点故障(Multi-Master HA)。Master节点仅在Linux系统上运行,但不限于任何特定平台,可以是服务器裸机、VM、OpenStack的实例或者任何其他云实例,但是不要在Master节点上运行用户容器(user container)。
Master节点的组件
Master节有以下组件。
- kube-apiserver Kube-apiserver遵循横向扩展架构设计,是Master控制节点的前端,提供了面向外部的接口,通过REST API与外部世界进行通信,它是资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据。
- etcd - 群集存储 etcd是kubernetes默认使用的分布式键值存储库,提供了一种可靠的方式来存储kubernetes集群中的数据,主要被用来共享配置和服务发现。集群的所有状态都存储在etcd实例中,本身具有监控的能力,因此当etcd中的信息发生变化时,能够快速的通知集群中相关的组件。etcd扮演的角色如此重要,因此,必须有一个可靠的备份计划。
- kube-controller-manager
Kube-Controller Manager是集群的管理控制中心,维护集群中的所有控制器(controller),对维持集群的稳定和自我修复,实现高可用,副本控制等起关键作用。它是一个嵌入式控制器并负责命名空间创建和垃圾收集的守护进程,主要管理以下控制器:
- Node Controller - 管理节点(创建,更新和删除)。
- Replication controller - 根据清单维护pod的数量。
- Service Account & Token controller - 为新名称空间创建默认帐户和API令牌。
- Endpoints Controller - 管理服务于端点对象(服务,pod)。
- kube-scheduler
kube-scheduler通过apiserver实时监听来自新建pod的请求,并将工作负载分配到合适的工作节点。它监控所有工作节点的资源利用率,并根据新pod的资源需求和现有工作节点的负载做出逻辑决策。Kube-scheduler还需要考虑管理员定义的规则(亲和性和反亲和性,约束)。
Nodes Minions - Kubernetes工作节点
Nodes比Master节点简单得多,是集群最小的计算单元,简单地完成master节点分配下去的任务。如果节点出现故障或挂掉了,我们可以轻易的地将其与新节点交换,让业务恢复正常。换句话说,该节点提供了在其上运行pod的所有必要服务。node节点可以是裸机、虚拟机、OpenStack实例或云实例。
Node节点由以下组件组成:
- Kubelet - Kuberbernets主要代理
Kubelet是Kubernetes中最主要的控制器,它在每个节点上运行,是Pod和Node API的主要实现者,并使从服务器可以与主服务器通信。它把Node节点注册到集群里,并监视Master kube- apiserver以接收指令进行工作分配。所在Node节点上的Pod的创建、修改、监控、删除等全生命周期管理都是它管理。同时Kubelet定时“上报”所在Node的状态信息到API Server里,如果pod存在问题,它会向Master报告。Kubelet对外暴露只读端口:10255,可以获取Kubelet监控状态信息,该端口是免认证非安全的。
- / spec endpoint - 提供有关运行节点的信息。
- / healthz endpoint - 其运行状况检查端点。
- / pods endpoint - 提供运行pod信息。
- 容器引擎 - 容器Run-time
Pods将容器打包到其中。要部署容器,你需要容器Run-time软件。在大多数情况下,它就是一个docker引擎,当然我们还可以使用其他容器运行时软件(例如:rkt)。容器引擎管理在pod上运行的容器,它将拉取镜像以进行部署并启动/停止容器上的容器。
- Kube-proxy
kube-proxy是node节点的大脑,它确保每个pod可以获得唯一的IP。如果要在一个pod中打包多个容器,则pod中的所有容器共享一个IP。它还对服务中的所有pod进行负载均衡(通过iptables规则引导访问至服务IP,并将重定向至正确的后端应用,通过这种方式提供了一个高可用的负载均衡解决方案)。
pod创建流程
下图显示了pod在工作节点中创建的流程。Kubectl是命令行实用程序,你可以在其中将命令传递给Kubernetes集群以创建和管理各种Kubernetes组件。
完。