从宏观上了解一下 k8s 的整体架构。

C/S 架构

从更高层来看,K8S 整体上遵循 C/S 架构,从这个角度来看,可用下面的图来表示其结构:

                               +-------------+                              
                               |             |                              
                               |             |               +---------------+
                               |             |       +-----> |     Node 1    |
                               | Kubernetes  |       |       +---------------+
+-----------------+            |   Server    |       |                      
|       CLI       |            |             |       |       +---------------+
|    (Kubectl)    |----------->| ( Master )  |<------+-----> |     Node 2    |
|                 |            |             |       |       +---------------+
+-----------------+            |             |       |       
                               |             |       |       +---------------+
                               |             |       +-----> |     Node 3    |
                               |             |               +---------------+
                               +-------------+               

当然在这里,只画出了一个 Master,在生产环境中,为了保障集群的高可用,我们通常会部署多个 Master 。

Master

Master 节点有几个重要的功能:

  • 接收:外部的请求和集群内部的通知反馈
  • 发布:对集群整体的调度和管理

下面是一个 control plane,如下图所示:

+----------------------------------------------------------+          
| Master                                                   |          
|              +-------------------------+                 |          
|     +------->|        API Server       |<--------+       |          
|     |        |                         |         |       |          
|     v        +-------------------------+         v       |          
|   +----------------+     ^      +--------------------+   |          
|   |                |     |      |                    |   |          
|   |   Scheduler    |     |      | Controller Manager |   |          
|   |                |     |      |                    |   |          
|   +----------------+     v      +--------------------+   |          
| +------------------------------------------------------+ |          
| |                                                      | |          
| |                Cluster state store                   | |          
| |                                                      | |          
| +------------------------------------------------------+ |          
+----------------------------------------------------------+          

Cluster state store

集群状态的持久化存储。并且有 watch 机制,可以快速的通知各组件变更。

目前 kubernetes 的存储层为 etcd,所以目前以 etcd 来代表集群状态存储服务,即:将所有状态存储到 etcd 实例中。

API Server

整个集群的入口。接收外部的信号和请求,并将一些信息写入到 etcd 中。

这个组件也承担了认证权限的功能。

Scheduler

调度器。持续关注集群中未被调度的 Pod,并根据各种条件

  • 资源的可用性;
  • 节点的亲和性;
  • 或者一些其他的比如 toleration 之类的限制条件。

通过绑定 API 将 Pod 调度/绑定到 Node 上。

调度程序一般只考虑调度开始时, Node 的状态,而不考虑在调度过程中 Node 的状态变化。

Node

核心组件:

+--------------------------------------------------------+       
| +---------------------+        +---------------------+ |       
| |      kubelet        |        |     kube-proxy      | |       
| |                     |        |                     | |       
| +---------------------+        +---------------------+ |       
| +----------------------------------------------------+ |       
| | Container Runtime (Docker)                         | |       
| | +---------------------+    +---------------------+ | |       
| | |Pod                  |    |Pod                  | | |       
| | | +-----+ +-----+     |    |+-----++-----++-----+| | |       
| | | |C1   | |C2   |     |    ||C1   ||C2   ||C3   || | |       
| | | |     | |     |     |    ||     ||     ||     || | |       
| | | +-----+ +-----+     |    |+-----++-----++-----+| | |       
| | +---------------------+    +---------------------+ | |       
| +----------------------------------------------------+ |       
+--------------------------------------------------------+  
 

kubelet

Kubelet 实现了集群中关于 node 和 Pod 的控制功能。

Container runtime

最主要的功能是下载镜像和运行容器。有一些实现,Docker、rkt、cri-o。

Kube Proxy

代理服务,使用 Service 访问到 Pod。

每隔 Node 上启动一个 kube-proxy 的进程,通过编排 iptables 规则来达到效果。

Kube-apiserver

一个请求依次会经过认证、授权、准入控制等环节,最终来到 kube-apiserver 实际处理逻辑。

kube-apiserver 包含的东西有很多,当你在终端下执行 ./kube-apiserver -h 时,会发现有大量的参数。

这些参数除了认证,授权,准入控制相关功能外,还有审计,证书,存储等配置。主体功能、原理了解后,这些参数也就会比较容易配置了。