# Master

Master 节点是 Kubernetes 集群的<mark style="color:blue;">**控制节点**</mark>，每个 Kubernetes 集群里需要有一个 Master 节点来负责整个集群的管理和控制，<mark style="color:blue;">**基本上 Kubernetes 所有的控制命令都是发给它，由它来负责具体的执行过程**</mark>。

{% hint style="warning" %}
#### <mark style="color:orange;">**在生产环境中不建议在 Master 节点上部署集群核心组件外的任何容器**</mark>，公司业务程序的容器更是不建议部署到 Master 节点上，以免升级或者维护时对业务造成影响。
{% endhint %}

## 关键进程

Master 节点上运行着以下一组关键进程：

* **Kubernetes API Server（kube-apiserver）**
  * 整个集群的<mark style="color:blue;">**控制中枢**</mark>，提供集群中各个模块之间的数据交换，并将**集群状态和信息**存储到分布式键-值（key-value）存储系统 Etcd 集群中。
  * 是**集群管理**、**资源配额**、**集群安全机制**的入口，为集群各类资源对象提供增删改查以及 watch 的 **REST API 接口**。
* **Kubernetes Scheduler（kube-scheduler）**
  * 集群 Pod 的<mark style="color:blue;">**调度中心**</mark>，主要**通过调度算法将 Pod 分配到最佳的 Node 节点**，它通过 API Server 监听所有 Pod 的状态，**一旦发现新的未被调度到任何 Node 节点的 Pod**（PodSpec.NodeName 为空），就会根据一系列策略选择最佳节点进行调度，对每一个 Pod 创建一个绑定（Binding），然后被调度的节点上的 **Kubelet 负责启动该 Pod**。
  * Scheduler 是集群**可插拔式**组件，它跟踪每个节点上的资源利用率以确保工作负载不会超过可用资源。因此，Scheduler 必须知道**资源需求**、**资源可用性**以及**其他约束和策略**，例如服务质量、亲和性/反亲和性要求、数据位置等。
  * Scheduler 将资源供应与工作负载需求相匹配以维持系统的稳定和可靠性，因此 Scheduler 在调度的过程中需要考虑**公平**、**资源高效利用**、**效率**等方面的问题。
* **Kubernetes Controller Manager（kube-controller-manager）**
  * 集群的<mark style="color:blue;">**状态管理器**</mark>，**保证 Pod 或其他资源达到期望值**。
  * 当集群中某个 Pod 的副本数或其他资源因故障和错误导致无法正常运行，没有达到设定的值时，Controller Manager 会尝试自动修复并使其达到期望状态。
* **Etcd**
  * **用于可靠地存储集群的配置数据，是一种持久型、轻量型、分布式的键-值（key-value）数据存储组件**。
  * Etcd 作为 Kubernetes 集群的<mark style="color:blue;">**持久化存储系统**</mark>，集群的**灾难恢复**、**状态信息存储**都与其密不可分，所以<mark style="color:orange;">**在 Kubernetes 高可用集群中，Etcd 的高可用是至关重要的一部分**</mark>，在生产环境中建议部署大于 3 的奇数个数的 Etcd，以保证数据的安全性和可恢复性。
  * **Etcd 可与 Master 组件部署在同一个节点上，大规模集群环境下建议部署在集群外，并且使用高性能服务器来提高 Etcd 的性能和降低 Etcd 同步数据的延迟。**

## **补充说明**

<mark style="color:orange;">**在 Kubernetes 架构中，虽然 Scheduler 和 Controller Manager 在多个节点上进行了部署，但执行工作的节点只有一个。**</mark>

**因为 Scheduler 和 Controller Manager 属于有状态服务**，为了防止重复调度，多个节点的 Scheduler 和 Controller Manager 进行了选主工作，工作节点（主节点）信息保存在 Scheduler 和 Controller Manager 的 EndPoint 中。

可以通过 **kubectl get leases -n kube-system** 查看：

{% code overflow="wrap" lineNumbers="true" %}
```properties
$ kubectl get leases -n kube-system
NAME                                   HOLDER                                                                      AGE
apiserver-hk4fzhyjdo2ayc5o2blltmf4pe   apiserver-hk4fzhyjdo2ayc5o2blltmf4pe_67f1a7cd-275b-4093-b1fd-744a70a324d5   26h
apiserver-l3o2wb47zcu4wv6xcvcptpja54   apiserver-l3o2wb47zcu4wv6xcvcptpja54_7f182e54-daa6-4b4a-8b85-c437c0218372   4h33m
kube-controller-manager                k8s-master01_8e8bcbb5-d248-408c-8729-691720fde6f8                           26h
kube-scheduler                         k8s-master02_3e94febc-9494-41b1-b2d6-d69863ac289f                           26h
```
{% endcode %}
