kubernetes
,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。
是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。
在 K8S 中,主节点一般被称为 Master 节点
,而从节点则被称为 Worker Node 节点
,每个 Node 都会被 Master 分配一些工作负载。
用于暴露 Kubernetes API
,任何资源请求或调用操作都是通过kube-apiserver
提供的接口进行。
以 HTTP Restful API
提供接口服务,所有对象资源的增删改查和监听操作都交给 API Server
处理后再提交给 Etcd 存储。
可以理解成 API Server 是 K8S 的请求入口服务。API Server 负责接收 K8S 所有请求(来自 UI 界面或者 CLI 命令行工具), 然后根据用户的具体请求,去通知其他组件干活。可以说 API Server 是 K8S 集群架构的大脑。
运行管理控制器,是 K8S 集群中处理常规任务的后台线程,是 K8S 集群里所有资源对象的自动化控制中心。
在 K8S 集群中,一个资源对应一个控制器,而 Controller manager
就是负责管理这些控制器的。
由一系列控制器组成,通过 API Server 监控整个集群的状态,并确保集群处于预期的工作状态
比如当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
这些控制器主要包括:
- Node Controller(节点控制器):负责在节点出现故障时发现和响应。
- Replication Controller(副本控制器):负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量。
- Endpoints Controller(端点控制器):填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint。
- Service Account & Token Controllers(服务帐户和令牌控制器):为新的命名空间创建默认帐户和 API 访问令牌。
- ResourceQuota Controller(资源配额控制器):确保指定的资源对象在任何时候都不会超量占用系统物理资源。
- Namespace Controller(命名空间控制器):管理 namespace 的生命周期。
- Service Controller(服务控制器):属于 K8S 集群与外部的云平台之间的一个接口控制器。
是负责资源调度的进程,根据调度算法为新创建的 Pod 选择一个合适的 Node 节点。
可以理解成 K8S 所有 Node 节点的调度器。当用户要部署服务时,Scheduler 会根据调度算法选择最合适的 Node 节点来部署 Pod。
预选策略(predicate)
优选策略(priorities)
K8S 的存储服务
etcd 是分布式键值存储系统,存储了 K8S 的关键配置和用户配置,K8S 中仅 API Server
才具备读写权限,其他组件必须通过 API Server
的接口才能读写数据。
Node 节点的监视器,以及与 Master 节点的通讯器。
Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施。
从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态。
管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源。
在每个 Node 节点上实现 Pod 网络代理,是 Kubernetes Service 资源
的载体,负责维护网络规则和四层负载均衡工作。
负责写入规则至iptables
、ipvs
实现服务映射访问的。
`Kube-Proxy` 本身不是直接给 Pod 提供网络,Pod 的网络是由 Kubelet 提供的,Kube-Proxy 实际上维护的是虚拟的 Pod 集群网络。
`Kube-apiserver`通过监控 Kube-Proxy 进行对 Kubernetes Service 的更新和端点的维护。
在 K8S 集群中微服务的负载均衡是由 Kube-proxy 实现的。
`Kube-proxy` 是 K8S 集群内部的`负载均衡器`。
它是一个`分布式代理服务器`,在 K8S 的每个节点上都会运行一个 `Kube-proxy 组件`。
容器引擎,运行容器,负责本机的容器创建和管理工作。
当 kubernetes 把 pod 调度到节点上,节点上的 kubelet会指示 docker 启动特定的容器。
接着,kubelet 会通过 docker 持续地收集容器的信息, 然后提交到主节点上。
docker 会如往常一样拉取容器镜像、启动或停止容器。
不同点仅仅在于这是由`自动化系统控制`而非管理员在每个节点上手动操作的。
Kubernetes 包含多种类型的资源对象:Pod
、Label
、Service
、Replication Controller
等。
所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具
进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。
Kubernets其实是一个高度自动化的资源控制系统
通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。
Pod是K8S能够创建和管理的最小单位。
一个Pod里可以包含一个或者多个应用容器,Pod里的容器之间共享网络、存储等资源
Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。
- deployment:部署无状态应用(没有实时的数据需要存储);同时也负责管理replicaset(维持Pod副本数量符合预期数量)和Pod(容器化的应用进程)
- statefulset:部署有状态应用(有实时的数据需要存储)
- daemonset:在所有的node节点上部署同一类型的Pod
- job:一次性的部署短期任务的Pod(执行完任务后会自动退出的Pod)
- cronjob:周期性的部署短期任务的Pod(执行完任务后会自动退出的Pod)
在K8S集群内部,为通过标签选择器相关联的一组Pod提供一个统一的访问入口(clusterIP),只支持四层代理转发
作为K8S集群外部接入层,可自定义ingress规则根据用户请求的域名或URL请求路径转发给指定的service,支持七层代理转发
apiversion:资源对象在K8S中使用的api接口版本
kind:资源对象的类型
metadata:资源对象的元数据信息,比如 name资源名称、annotation注释、namespace命名空间、label标签
spec:资源对象的资源配置清单(配置属性),比如 副本数、镜像、数据卷、标签选择器
status:资源对象的当前运行状态信息
label:标签,将一个键值对关联到某个资源对象,用于资源对象的分组查询和筛选
label selector:标签选择器,用于查询和筛选拥有某个标签的资源对象
annotation:注释,用于作资源对象的注释信息或在一些特殊的资源对象里用于作额外的功能特性配置
name:资源名称
namespace:命名空间,在同一个命名空间中,同类型的资源对象的名称是唯一的