从宏观上了解一下 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
时,会发现有大量的参数。
这些参数除了认证,授权,准入控制相关功能外,还有审计,证书,存储等配置。主体功能、原理了解后,这些参数也就会比较容易配置了。