Kubernetes学习笔记之概念架构及组件交互篇(二)

什么是Kubernetes?

Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。

Kubernetes能做什么?

服务发现和负载均衡

使用DNS名称或者自己的IP地址来暴露容器,如果进入容器的流量很大,可以负载均衡并分配网络流量,从而使部署稳定。

存储编排

可以自动挂载你选择的存储系统,例如本地存储、公共云提供商等

自动部署和回滚

可以指定已部署容器的所需状态,kubernetes会用受控的速率将实际状态更改为期望状态。例如,可以自动化位你的部署创建新的容器,删除现有容器并将它们的所有资源用于新容器。

完成装箱计算

你可以为Kubernetes提供许多节点组成的集群,在这个集群上运行容器化的任务,同时也可以指定每个容器需要多少CPU和内存,Kubernetes可以将这些容器按照实际情况调度到集群的节点上,这样集群可以做出更好的决策来管理容器的资源。

自我修复

Kubernetes会重新启动失败的容器、替换容器、杀死不响应用户定义的状况检测的容器,并且在准备好服务之前不将其通告给客户端。

密钥与配置管理

Kubernetes支持存储和管理敏感信息,例如密码、OAuth令牌、SSH密钥等,你可以在不重新构建容器镜像的情况下部署和更新密钥和更新应用程序配置,也无需在堆栈配置中暴漏密钥

Kubernetes架构

Kubernetes学习笔记之概念架构及组件交互篇(二)_第1张图片

Kubernetes属于主从分布式架构,主要由(N个)Master Node和(N个)Worker Node组成,以及包括客户端命令行工具kubectl和其它组件组成。

组件架构

控制平面组件(control Plane Computer)

控制平面的组件对集群做出全局决策化(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的pod)。
控制平面组件可以在集群中的任何节点上运行。然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。

kube-apiserver

API服务器是Kubernetes控制面的组件。该组件公开了Kubernetes API。API服务器是Kubernetes控制面的前端,接受用户输入的命令,提供认证,授权,API注册和发现等机制。
Kubernetes API服务器的主要实现是kube-apiserver。kube-server设计上考虑了水平伸缩,也就是说,它可以通过部署多个实例进行伸缩。你可以运行kube-adiserver的多个实例,并在这些实例之间平衡流量。

etcd

etcd是兼容一致性和高可用性的键值数据库,可以作为保存Kubernetes所有集群数据的后台数据库。

kube-scheduler

控制平面组件,负责监视新创建的、未指定运行节点(node)的pods,选择节点让pod在上面运行。
调度决策考虑的因素包括单个pod和pod集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。

kube-controller-manager

在主节点上运行控制器的组件。
从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
这些控制器包括:
● 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
● 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
● 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
● 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

cloud-controller-manager

云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器允许您链接集群到云提供商的应用编程接口中, 并把和该云平台交互的组件与只和您的集群交互的组件分离开。
cloud-controller-manager 仅运行特定于云平台的控制回路。 如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的环境中不需要云控制器管理器。
与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的 控制回路组合到同一个可执行文件中,供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。
下面的控制器都包含对云平台驱动的依赖:
● 节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除
● 路由控制器(Route Controller): 用于在底层云基础架构中设置路由
● 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器

Node组件

节点组件在每个节点上运行,维护运行的pod并提供kubernetes运行环境

kubelet

一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。

容器运行时

容器运行环境是负责运行容器的软件。
kubernetes支持容器运行时,例如Docker、containerd、CRI-O以及kubernetes CRI(容器运行环境接口)的其他任何实现。

插件

插件使用kubernetes资源(DaemonSet、Deployment等)实现集群功能。因为这些插件提供集群级别的功能,插件中命名空间域的资源属于kube-system命名空间
下面是几种常见的插件

DNS

尽管其他插件都并非严格意义上的必需组件,但几乎所有Kubernetes集群都应该有集群DNS,因为很多示例都需要DNS服务。
集群DNS是一个DNS服务器,和环境中的其他DNS服务器一起工作,它为kubernetes服务提供DNS记录。
Kubermetes启动的容器自动将此DNS服务器包含在其DNS搜索列表中。

Web界面(仪表盘)

Dashboard是kubernetes集群通用的、基于Web的用户界面。它使用户可以管理集群中运行的应用程序以及集群本身并运行故障排除。

容器资源监控

容器资源监控将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。

集群层面日志

集群层面日志 机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。

集群组件交互刨析

组件角色定义如下图

Kubernetes学习笔记之概念架构及组件交互篇(二)_第2张图片

集群组件的交互逻辑

创建Deployment工作流程

1.首先通过kubectl命令或者api接口方式向apiserver发起创建deployment的请求,当请求到达apiverser后,首先要经过认证和授权,认证支持basic、token及证书认证等。授权目前默认使用的是RBAC。
2.apiserver将创建deployment的信息保存为yaml,然后写入etcd
3.controller-manager通过list watch监控到apiserver数据发生变化,apiserver在etcd中读取到创建deployment的需求,然后controller-manager调用apiserver接口获取创建pod信息,apiserver将信息同步更新保存在etcd中
4.scheduler检测到集群中未绑定Node的pod,通过list watch调用apiserver接口在etcd中获取相应信息,执行调度策略。先过滤掉不满足的node预选策略,再通过pod优选策略最终决定将pod调度到哪个node上,apiserver再将调度结果信息同步更新保存到etcd中
5.被选中的node的kubelet将通过list watch实时监控apiserver读取etcd数据,检测到有新的pod调度过来,通过container runtime(容器运行时)运行该pod,kubelet通过container runtime获取到pod状态,同步给apiserver,并同步更新写入到etcd中。

你可能感兴趣的:(Kubernetes学习笔记,kubernetes,学习,架构)