充分借助 K8s 的优点,减少运维人员的压力,最大限度的提升设施资源的利用率。对 K8s 的核心组件,及其拥有的能力的进行调研。
Kubermetes 各个核心组件功能很清晰:
Kubernets 集群由两类节点组成 — Master 和 Node:
在 Master 上运行 etcd、API Server、Controller Manager 和 Scheduler 四个组件。
注:其中 API Server、Controller Manager 、Scheduler 是 Kubernetes 的总控中心,负责对集群所有资源进行管控和调度。
在每个 Node 上运行 Kubelet 、Proxy 和 Docker Daemon 三个组件,负责对本节点上的 Pod 的生命周期进行管理,以及实现服务代理的功能。
下面以 RC 与相关 Service 创建的完整流程为例,来说明 Kubernetes 里各个服务(组件)的作用以及它们之间的交互关系。
注:Kubernetes 还提供了命令行工具 Kubectl ,用它来将 API Server 的 API 包装成简单的命令集供我们使用。
以下是对上图各种访问路径的详细说明(每个数字表示一种访问的路径):
API Server 作为集群的核心,负责集群各个功能模块之间的通信。集群内部的功能模块通过 API Server 将信息存入 etcd,其他模块通过 API Server(用 get 、list 或 watch 方式)读取这些信息,从而实现模块之间的信息交互。
Controller Manager 作为集群内部的管理控制中心,负责集群内的 Node、Pod 副本、服务端点(Endpoint)、命名空间(Namespace)、服务账户(ServiceAccount)、资源定额(ResourceQuota)等的管理并执行自动化修复流程,确保集群处于预期的工作状态。
注:在某个 Node 意外宕机时,Controller Manager 会在集群的其他节点上自动补齐 Pod 副本。
一般来说,智能系统和自动系统通常会通过一个操纵系统来不断修正系统的状态。在 Kubernetes 集群中,Controller Manager 是 Controller 的管理者,每个 Controller 就是一个操纵系统,它通过 API Server 监控系统的共享状态,并尝试将系统状态从「现有状态」修正到「期望状态」
Replication Controller 的核心作用是确保在任何时候集群中的一个 RC 所关联的 Pod 都保持一定数量的 Pod 副本处于正常运行状态。
Pod 的状态值列表:
状态值 | 描述 |
---|---|
pending | API Server 已经创建该 Pod,但 Pod 内还有一个或多个容器的镜像没有创建 |
running | Pod 内所有容器均已创建,且至少有一个容器处于运行状态或正在启动或重启 |
succeeded | Pod 内所有容器均成功中止,且不会再重启 |
failed | Pod 内所有容器均已退出,且至少有一个容器因为发生错误而退出 |
Node Controller 负责发现、管理和监控集群中的各个 Node 节点。Kubelet 在启动时通过 API Server 注册节点信息,并定时向 API Server 发送节点信息。API Server 接受到这些信息后,将这些信息写入 etcd。
注:存入 etcd 的节点信息包括节点健康状况、节点资源、节点名称、节点地址信息、操作系统版本、Docker 版本、Kubelet 版本等。
节点健康状况包括「就绪(True)」、「未就绪(False)」和「未知(Unknown)」三种。
ResourceQuota Controller 确保了指定的对象在任何时候都不会超量占用系统资源,避免了由于某些业务进程的设计或实现的缺陷导致整个系统运行紊乱甚至意外宕机,对整个集群的平稳运行和稳定性有非常重要的作用。
思考:目前开发的服务,就是因为混部,在单一服务消耗资源(比如内存)过高时,其他服务无法使用该资源,进而整体服务不可用
目前 Kubernetes 支持如下三个层次的资源配额管理:
用户通过 API Server 可以创建新的 Namespace 并保存在 etcd 中,Namespace Controller 定时通过 API Server 读取这些 Namespace 信息。
注:如果 Namespace 被 API 标识为优雅删除(设置删除期限, DeletionTimestamp 属性被设置),则将该 Namespace 的状态设置为「Terminating」并保存到 etcd 中。同时 Namespace Controller 删除该 Namespace 下的 ServiceAccount、Replication Controller 、Pod、Secret、PersistentVolume、ListRange、ResourceQuota 和 Event 等资源对象。
ServiceAccount Controller 与 Token Controller 是与安全相关的两个控制器。
ServiceAccount Controller 在 Controller Manager 启动时被创建。它监听 Service Account 的删除事件和 Namespace 的创建、修改事件。
注:如果在该 Service Account 的 Namespace 中没有 default Service Account,那么 Service Account Controller 为该 Service Account 的 Namespace 创建一个 default Service Account。
Token Controller 在 Controller Manager 启动时根据配置选择创建或者不创建。Token Controller 对象监听 Service Account 和 Secret 的创建、修改和删除事件,并根据事件的不同做不同的处理。
Service Controller 监控 Service 的变化,如果发生变化的 Service 类型是 LoadBalancer 类型的,则 Service Controller 确保外部的 LoadBalancer 被相应地创建和删除。
Service 类型定义的 「spec.type」字段,其可选值有三类:
注:Kubernetes Service 是一个定义 Pod 集合的抽象,或者被访问者看做一个访问策略,有时也称为微服务。
Endpoints Controller 通过 Store 来缓存 Service 和 Pod 信息,它监控 Service 和 Pod 的变化。
通过 API Server 监控 etcd 的「/registry/services」目录(用 Watch 和 List 方式)
通过 API Server 监控 etcd 的「/registry/pods」目录(以 Watch 和 List 方式)
Kubernetes Scheduler 在整个系统中承担了「承上启下」的重要功能:
细化的作用描述即:
Kubenetes Scheduler 的作用是将待调度的 Pod (API 新创建的 Pod、Controller Manager 为补足副本而创建的 Pod 等)按照特定的调度算法和调度策略绑定(Binding)到集群中的某个合适的 Node 上,并将绑定信息写入 etcd 中。
注:上述的复杂描述,简而言之,就是通过调度算法调度为待调度 Pod 列表中的每个 Pod 从 Node 列表中选择一个合适的 Node。
整个调度过程涉及三个对象,分别是,待调度 Pod 列表,可用 Node 列表,以及调度算法和策略。
Scheduler 流程图解,当前提供的默认调度流程分为以下两个步骤:
预选策略:输入是所有节点,输出是满足预选条件的节点。
优选策略:输入是预选阶段筛选出的节点,优选会根据优选策略为通过预选的 Nodes 进行打分排名,选择得分最高的 Node。
注:比如,资源越富裕,负载越小的 Node 可能具有越高的排名。
总结预选和优选策略,预选负责解决候选有哪些的问题,优选负责从合适的 Node 节点中选择最优的一个。
Kubernetes 支持编写自己的调度其,通过 spec.schedulername 参数指定调度器名字,可以为 Pod 选择某个调度器进行调度。
在 Kubernetes 集群中,在每个 Node 节点上都会启动一个 Kubelet 服务进程。该进程用于处理 Master 节点下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 Kubelet 进程会在 API Server 上注册节点自身信息,定期向 Master 节点汇报节点资源的使用情况,并通过 cAdvise 监控容器和节点资源。
Node 通过设置 Kubelet 的启动参数「–register-node」,来决定是否向 API Server 注册自己。
注:–register-node 为 true 表示向 API Server 注册自己。
以非「Static Pod」的管理为例,当 Kubelet 读取监听信息,如果是创建和修改 Pod 任务,则做如下处理:
注:所有以非 API Server 方式创建的 Pod 都叫做 Static Pod
Pod 通过两类探针来检查容器的健康状态。
cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具。它是因为容器而产生的,因此自然支持 Docker 容器。在 Kubernetes 项目中,cAdvisor 被集成到 Kubernetes 代码中。cAdvisor 自动查找所有在其节点上的容器,自动采集 CPU、内存、文件系统和网络使用统计。cAdvisor 通过它所在节点机的 Root 容器,采集并分析该节点机的全面使用情况。
希望每一天都能够活的自由且尽兴:
Scheduling Policies
k8s loadbalancer与ingress实践
Kubernetes K8S之调度器kube-scheduler详解