kubernetes 整体架构
Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统,所以整体的架构和borg很相似,整个架构有 apiserver,controller-manager,scheduler,etcd,kubelet,kube-proxy,network-plugin 等相关组件完成,整体架构如下:
通常 一个 K8S集群包括两个部分:
一个 Master 节点 (主节点),主要负责管理和控制
1.Etcd:存储状态的数据库,保存了整个集群的状态;
2.Apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
3.controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
4.Scheduler:负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
一群 Node 节点(计算节点),
1.kubelet:主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等;
2.kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡;
K8S 工作原理
-
运维人员向 apiserver 发出指令,可以通过API Server的REST API,也可用Kubectl命令行工具
-
apiserver 响应命令,通过一系列认证授权,把 pod 数据存储到 etcd,创建 deployment 资源并初始化 (期望状态)
-
controller-manager 通过 list-watch 机制,监测发现新的 deployment,将该资源加入到内部工作队列,发现该资源没有关联的 pod 和 replicaset,启用 deployment controller 创建 replicaset 资源,再启用 replicaset controller 创建 pod
-
创建完成后,将 deployment,replicaset,pod 资源更新存储到 etcd
-
scheduler 通过 list-watch 机制,监测发现新的 pod,经过主机过滤、主机打分规则,将 pod 绑定 (binding) 到合适的主机
-
将绑定结果存储到 etcd
-
kubelet 每隔 20s (可以自定义) 向 apiserver 通过 NodeName 获取自身 Node 上所要运行的 pod 清单,通过与自己的内部缓存进行比较,新增加 pod
-
kubelet 调用 Docker API 创建并启动 pod
-
kube-proxy 为新创建的 pod 注册动态 DNS 到 CoreOS。给 pod 的 service 添加 iptables/ipvs 规则,用于服务发现和负载均衡
-
controller-manager 通过 control loop(控制循环)将当前 pod 状态与用户所期望的状态做对比,如果当前状态与用户期望状态不同,则 controller 会将 pod 修改为用户期望状态,实在不行会将此 pod 删掉,然后重新创建pod