基础组件总览图
k8s
是采用 http
协议进行通信的 C/S
架构。
kubectl
kubectl
是使用命令行与 k8s
交互的客户端工具,同理 web ui
代表了浏览器或其他图形化工具与 k8s
交互的方式。
我们下面说的 客户端发来的请求、任务
等就是指这里发送的命令。
api server
api server
是一切服务访问的入口。
通过上图你会发现,所有的组件都会与 api server
进行交互(包括图中没有箭头的 kubelet
和 kube proxy
),所以 api server
是非常繁忙的,因此为了减轻 api server
的压力,shceduler
、aplication controller
等一些组件都可以在本地生成一些缓存,通过使用缓存的方式来减少对 api server
的访问。
scheduler
scheduler
任务调度器,负责接收客户端的请求任务,选择合适的节点(node
)进行任务分配。
scheduler
发出的调度命令不会直接发送到具体的节点上执行,而是通过 api server
写入到 etcd
,node
节点自己会去 etcd
上拉取数据,如果拉取到了分配到自己这个节点的任务,会自动执行。
replication controller
replication controller(controllerManager)
负责副本 (Pod
) 的伸缩控制。
k8s
可以指定期望的运行副本的数量,如果实际运行的副本数量少于或多于期望的数量,那么 replication controller
会自动帮助 k8s
进行副本数量的扩充或缩容。
etcd
etcd
是使用 Go
语言开发的,一款使用 <K, V>
存储方式的开源数据库。官方将其定位成一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。
可信赖的:etcd
本身就支持集群化,不像 mysql
等还需要借助其它方式才能实现集群。因此称为可信赖的。
etcd
可以保存 k8s
集群所有 需要持久化
的数据,以保证可以根据这些数据对集群进行恢复。
对于 etcd
来说,它分为 v2
和 v3
两个版本:
v2
会将数据写入内存中,因此需要自己进行数据备份操作。
v3
会引入一个本地卷持久化的操作,不需要自己进行数据备份操作。
v2
只存在 k8s v1.11
之前的版本中,在这之后已经被弃用了。
etcd内部架构
etcd
是采用 http
协议进行通信的 C/S
架构,k8s
同样也是采用这种方式。
- Raft:
k8s
集群中所有的数据都会存放在这里。 - WAL:预写日志。如果更改
Raft
中的数据,那么WAL
会成一份日志记录这次改动。 - Entry:小版本日志数据,
WAL
每一次的日志都会写入到这里存储。 - Snapshot:大版本日志,每隔一段时间对
Entry
中的日志进行汇总存放。 - Store:
Raft
与WAL
都会存入这里并写入磁盘中保存。
node 节点
node
节点是 k8s
集群中最终执行客户端请求任务的组件,其包括了三个部分:kubelet
、kube proxy
和 Pod容器
。
kubelet
操作 CRI
访问容器,管理容器的生命周期。
Container Runtime Interface
,容器运行时接口。kubelet
创建和管理容器的时候并不是直接调用Docker API
而是通过一组叫做 CRI
的 gRPC
接口来间接执行的。
kube proxy
负责写入规则至 iptables
、ipvs(lvs)
,实现服务访问映射。即 Pod
与 Pod
之间的访问,Pod
节点的对外服务,负载均衡等等。
kube proxy
默认是操作防火墙 firewall
对容器进行映射。在新的版本中推荐使用 lvs
。
Pod
Pod
里面跑的是容器,如 Docker、Rocket 等。
其它插件
CoreDNS
可以为集群中的 SVC
创建一个域名 IP
的对应关系解析,即不需要通过 IP
地址去进行访问,直接可以使用 CoreDNS
生成的域名进行访问。
Dashboard
给 k8s
集群提供一个 B/S
结构访问体系。
Ingress Controller
官方只实现了四层代理,Ingress
可以实现七层代理。
Federation
提供一个跨集群中心多 k8s
管理统一管理功能。
Prometheus
提供一个 k8s
集群的监控能力。
ELK
提供 k8s
集群日志统一分析介入平台。
-- end --