k8s 组件
一个k8s集群(cluster)由一组被称为节点(node)的机器组成,这些节点上运行k8s所管理的容器化应用,一个集群至少拥有一个节点
控制面板组件
控制面板组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas时,启动新的pod)。
控制面板组件可以在集群中的任何节点上运行,然后,为了简单起见,通常会在同一个计算机上启动所有控制面板组件,并且不会在此计算机上运行用户容器。
kube-apiserver
api server组件实现了Kubernetes API供外部调用
etcd
etcd是兼具一致性和高可用性的键值数据库,可以作为保存kubernetes所有集群数据的后台数据库,这个数据库是给k8s自己使用的。
kube-scheduler
该组件负责监控新创建的、并未pods分配运行的节点。
kube-controller-manager
对控制器进行管理的组件,kubernetes有如下控制器
节点控制器(Node Controller):负责节点出现故障时进行通知和响应
任务控制器(Job Controller):检测代表一次性任务的job对象,然后创建pods来运行这些任务直至这些任务运行完成
端点控制器(Endpoints Controller): 填充端点对象(即加入service和pod)
服务账号和令牌控制器(Service Account & Token Controller):为新的命名空间创建默认账户和API访问令牌
cloud-controller-manager
云控制管理器使得你可以将你的集群连接到云服务商提供的API之上,并将与该云平台交互的组件同与你的集群交互的组件分离开来。cloud-controller-manager仅运行于云平台的控制回路。如果你在自己的环境中运行kubernetes,或者在本地计算机运行学习环境,所部署的环境中不需要云控制器管理器。下面的控制器包含对云平台驱动的依赖:
节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除
路由控制器(Route Controller):用于在底层云基础架构中设置路由
服务控制器(Server Controller):用于创建、更新和删除云服务商提供负载均衡器
node组件
节点组件用于维护运行pod并提供kubernetes运行环境
kubelet
一个在集群中每个节点(node)上运行的代理,它的主要任务有如下几点:
pod管理:kubelet定期从所监听的数据源获取节点上pod/container的期望状态(运行容器、运行的副本数量、网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。
容器健康检查:kubelet创建了容器之后还要检查容器是否正常运行,如果容器运行出错,就要根据pod设置的重启策略进行处理
容器监控:kubelet会监控所在节点的资源使用情况,并是定时向master报告
kube-proxy
kube-proxy是集群中每个节点(node)上运行的网络代理,kube-proxy维护节点上的网络规则(例如iptable和ipvs规则),这些网络规则允许从集群内部或外部的网络会话与pod进行网络通信。
容器运行时(Container Runtime)
容器运行环境时负责运行容器的软件,kubernetes支持多个容器允许环境:Docker、contrainerd、CRI-O以及任何实现Kubernetes CRI(容器运行环境接口)的容器。
节点(Node)
kubernetes通过将容器放入在节点(Node)上运行的Pod来执行你的工作负载。节点可以是一个虚拟机或者物理机器。通常一个集群会有会有若干个节点。节点上的组件包括:kubelet、容器运行时以及kube-proxy。
节点状态
一个节点的状态包含一下信息
地址
HostName:由节点的内核设置,可以通过kubelet的
--hostname-override
参数进行覆盖ExternalIP:通常是节点的可从集群外访问的IP地址
InternalIP:通常是节点的仅可在集群内部访问的IP地址
状态
Ready:如节点是健康的并已准备好接收Pod则为True;False表示节点不健康而且不能接收Pod;Unknown表示节点控制器在最近的
node-monitor-grace-period
期间(默认40秒)没有收到节点的消息DiskPressure:Ture表示节点存在磁盘空间压力,否则为False
MemoryPressure:Ture表示节点存在内存压力,即节点内存可用量低,否则为False
PIDPressure:True表示接单存在进程压力,即节点上进程过多,否则为False
NetworkUnavailable:True表示节点网络配置不正确,否则为False
容量与可分配:CPU、内存和可以调度到节点上的Pod的个数上限
capacity:标示节点拥有的资源总量
allocatable:标示节点上可供普通Pod消耗的资源量
信息:描述节点的一般信息,如内核版本、Kubernetes版本(kubelet和kube-proxy版本)、容器运行时详细信息,已经节点使用的操作系统。kubelet从节点收集这些信息并将其发送到Kubernetes API
k8s Namespace
集群内的虚拟概念,类似于资源池的概念,一个资源池里可以有各种资源类型,绝大多数的资源都必须属于某一个namespace。一个集群初始化安装好后,会默认有如下几个namespace
default
kube-node-release
kube-public
kube-system
kubenetes-dashboard
可以使用kubectl get namespaces
来获取当前有哪些命名空间。在k8s中,不是所有的资源都必须归属于一个命名空间,可以使用kubectl api-resources
命令来查看哪些资源需要归属到一个namespace下。另外可以使用kubectl create namespace xxx
来创建namespace。
k8s常见的工作流程(以创建新pod为例)
用户准备一个配置文件,通过调用API向api server发起请求创建调用
api server写etcd,并将api response返回给用户
同时scheduler持续监听api server(轮训?),获取是否有需要进行pod调度,则通过调度算法,计算出最适合该pod运行的节点,同时调用api将信息更新到etcd中
kubelet同样持续监听api server,判断是否有新的pod需要创建到本节点,如果有新pod需要创建,创建pod,并调用api将相关信息写入etcd