k8s常见组件原理
- API层:主要以REST方式提供各种API接口,除了有Kubernetes资源对象的CRUD和Watch等主要API还有健康检查、UI、日志、性能指标等运维监控相关的API。Kubernetes从1.11版本开始废弃Heapster监控组件,转而使用Metrics Server提供Metrics API接口,进一步完善了自身的监控能力。
- 访问控制层:当客户端访问API接口时,访问控制层负责对用户身份鉴权,验明用户身份,核准用户对Kubernetes资源对象的访问 权 限 , 然 后 根 据 配 置 的 各 种 资 源 访 问 许 可 逻 辑 ( AdmissionControl),判断是否允许访问。
- 注册表层:Kubernetes把所有资源对象都保存在注册表(Registry)中,针对注册表中的各种资源对象都定义了资源对象的类型、如何创建资源对象、如何转换资源的不同版本,以及如何将资源编码和解码为JSON或ProtoBuf格式进行存储。
- etcd数据库:用于持久化存储Kubernetes资源对象的KV数据库。etcd的Watch API接口对于API Server来说至关重要,因为通过这个接口,API Server创新性地设计了List-Watch这种高性能的资源对象实时同步机制,使Kubernetes可以管理超大规模的集群,及时响应和快速处理集群中的各种事件。

完整的调度机制如下:

Pod创建流程:
- 用户通过kubectl或者其他的API客户端提交PodSpec给API Server
- API Server 将pod的信息存入到etcd中,并返回确认信息给客户端
- controller通过list-watch机制,检查发现新的deployment,将资源加入到内部队列中,启动deployment controller创建replicaset资源,在启用replicaset controller创建pod
- 所有的controller创建完成后,将deployment,replicaset,pod等信息更新到etcd中
- scheduler通过list-warch机制发现新的Pod,根据一系列的调度规则,将pod调度到指定节点
- 将绑定结果存储到etcd中
- kubelet周期性的向apiserver通过NodeName获取自身Node上要运行的pod清单,并运行pod
- kube-proxy为新创建的pod注册动态DNS到CoreDns,给pod的Service添加iptables/ipvs规则
- controller通过controller loop将当前pod状态与用户期望的状态做对比,并修改为期望状态


