Kubernetes精选学习

【K8s 精选】Kubernetes 架构总览

2021-01-07  本文已影响0人  熊本极客

1 Kubernetes 架构概览

Kubernetes 核心组件包括 Master 节点的 apiservercontroller-managerscheduler,Node 节点的 kubeletkube-proxyContainer runtime,还有分布式键值( key-value) 数据库 etcd

Kubernetes 简化架构.png

apiserver操作资源的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。
controller-manager维护集群的状态,例如故障检测、自动扩展、滚动更新等。
scheduler资源的调度,根据预设的调度策略把 Pod 调度到相应的宿主机(Node)上。
kubelet维持容器的生命周期,管理 Volume(CVI)和 Network(CNI)。
kube-proxy:为 Service 提供集群内部的服务发现和负载均衡,其中 Service 是为一组功能相同 Pods,提供统一的入口。
etcd:强一致性、高可用的键值数据库,可以持久化集群状态,同时具有消息发布与订阅的功能。

image.png

2 Master 简介

Master 主节点负责管理和控制整个 Kubernetes 集群。Master 主要包含的组件是 apiservercontroller-managerscheduler

2.1 apiserver

apiserver 称为 Kubernetes API Server,提供如下功能:
提供集群管理的 REST API 接口,包括创建/更新/删除资源、认证授权、数据校验以及集群状态变更等。
提供其它模块之间的数据交互和通信的枢纽。注意:只有 apiserver 才直接操作 etcd。

apiserver.JPG

2.2 controller-manager

controller-manager 由 controller-managercloud-controller-manager 组成,是 Kubernetes 的大脑,它通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态。

controller-manager.JPG

controller-manager 控制器分类
● Replication Controller
● Node Controller
● Deployment Controller
● Endpoint Controller
● Namespace Controller
● Job Controller
● Service Controller
● StatefulSet Controller

2.3 scheduler

scheduler 负责分配调度 Pod 到集群内的 Node 节点上。它通过监听 apiserver,查询还未分配 Node 的 Pod,然后根据调度策略为这些 Pod 分配节点,然后更新 Pod 的 NodeName 字段。

调度器的考虑因素:公平调度、资源高效利用、affinity 和 anti-affinity、数据本地化等。

scheduler 调度原理:
For given pod:

    +---------------------------------------------+
    |               Schedulable nodes:            |
    |                                             |
    | +--------+    +--------+      +--------+    |
    | | node 1 |    | node 2 |      | node 3 |    |
    | +--------+    +--------+      +--------+    |
    |                                             |
    +-------------------+-------------------------+
                        |
                        |
                        v
    +-------------------+-------------------------+

    Pred. filters: node 3 doesn't have enough resource

    +-------------------+-------------------------+
                        |
                        |
                        v
    +-------------------+-------------------------+
    |             remaining nodes:                |
    |   +--------+                 +--------+     |
    |   | node 1 |                 | node 2 |     |
    |   +--------+                 +--------+     |
    |                                             |
    +-------------------+-------------------------+
                        |
                        |
                        v
    +-------------------+-------------------------+

    Priority function:    node 1: p=2
                          node 2: p=5

    +-------------------+-------------------------+
                        |
                        |
                        v
            select max{node priority} = node 2

scheduler 调度分为两个阶段,predicate 和 priority
predicate:过滤不符合条件的节点
priority:优先级排序,选择优先级最高的节点

3 Node 简介

Node 节点是 Kubernetes 集群中的工作负载节点,Node 上的工作负载由 Master 分配。当某个 Node 宕机时,Master 会将该节点的工作负载转移到其他节点上去。Node 节点运行的主要有 kubeletkube-proxy

3.1 kubelet

每个 Node 节点都运行一个 kubelet 服务进程,它通过监听 10250 端口,接收并执行 Master 发来的指令。每个 Kubelet 进程会在 apiserver 上注册所在 Node 节点的信息定期向 Master 上报该节点的资源使用情况,并通过 cAdvisor 监控节点和容器的资源

kubelet 的主要功能:
节点管理:通过 apiserver 创建和管理节点资源
Pod 管理和 cAdvisor 资源监控:使用配置启动 Pod,并持续把运行中 Pod 的状态、事件和资源消耗信息发送给 apiserver

(1)节点管理

节点管理主要的功能是节点自注册节点状态更新
节点自注册:设置启动参数 --register-node 来确定是否向 apiserver 注册自己
节点状态更新:kubelet 在启动时通过 apiserver 注册节点信息,并定时向 apiserver 发送节点新消息,apiserver 在接收到新消息后,将信息写入 etcd

(2)Pod 管理

Pod 管理主要有 Pod 清单获取创建和修改 Pod
Pod 清单获取:kubelet 通过 apiserver 获取 PodSpecs,并确保这些 PodSpecs 中描述的 Pod 正常健康运行。
创建和修改 Pod:kubelet 通过 Watch-List 方式监听 etcd,如果有创建和修改 Pod 任务,则会有相关操作。

(3)cAdvisor 资源监控

Kubelet 通过 cAdvisor 获取其所在节点及容器的数据。

cAdvisor 是一个开源的分析容器资源使用率性能特性的代理工具。它集成到 kubelet 中,当 kubelet 启动时会同时启动cAdvisor,且一个 cAdvisor 只监控一个 Node 节点的信息。cAdvisor 自动查找所有在其所在节点上的容器,自动采集 CPU、内存、文件系统和网络使用的统计信息。cAdvisor 通过它所在节点机的 Root 容器,采集并分析该节点机的全面使用情况。

(4)容器运行时

容器运行时插件(Container Runtime Interface,简称 CRI)是 Kubernetes 容器运行时接口,它将 Kubelet 与容器运行时解耦,将原来完全面向 Pod 级别的内部接口拆分成面向 Sandbox 和 Container 的 gRPC 接口,并将镜像管理容器管理分离到不同的服务。

image.png

Kubelet 架构

image.png

Pod 启动流程示例

image.png

3.2 kube-proxy

每个 Node 节点都运行一个 kube-proxy 服务进程,它通过监听 apiserver 中 service 和 endpoint 的变化情况,利用 iptables 的方式实现通信和负载均衡

iptables示例.JPG
上一篇 下一篇

猜你喜欢

热点阅读