k8s的组件有哪些,作用分别是什么
k8s主要由master节点和node节点构成。master节点负责管理集群,node节点是容器应用真正运行的地方。
master节点包含的组件有:kube-api-server、kube-controller-manager、kube-scheduler、etcd。
node节点包含的组件有:kubelet、kube-proxy、container-runtime。
kube-api-server:以下简称api-server,api-server是k8s最重要的核心组件之一,它是k8s集群管理的统一访问入口,提供了RESTful API接口, 实现了认证、授权和准入控制等安全功能;api-server还是其他组件之间的数据交互和通信的枢纽,其他组件彼此之间并不会直接通信,其他组件对资源对象的增、删、改、查和监听操作都是交由api-server处理后,api-server再提交给etcd数据库做持久化存储,只有api-server才能直接操作etcd数据库,其他组件都不能直接操作etcd数据库,其他组件都是通过api-server间接的读取,写入数据到etcd。
kube-controller-manager:以下简称controller-manager,controller-manager是k8s中各种控制器的的管理者,是k8s集群内部的管理控制中心,也是k8s自动化功能的核心;controller-manager内部包含replication controller、node controller、deployment controller、endpoint controller等各种资源对象的控制器,每种控制器都负责一种特定资源的控制流程,而controller-manager正是这些controller的核心管理者。
kube-scheduler:以下简称scheduler,scheduler负责集群资源调度,其作用是将待调度的pod通过一系列复杂的调度算法计算出最合适的node节点,然后将pod绑定到目标节点上。shceduler会根据pod的信息,全部节点信息列表,过滤掉不符合要求的节点,过滤出一批候选节点,然后给候选节点打分,选分最高的就是最佳节点,scheduler就会把目标pod安置到该节点。
Etcd:etcd是一个分布式的键值对存储数据库,主要是用于保存k8s集群状态数据,比如,pod,service等资源对象的信息;etcd可以是单个也可以有多个,多个就是etcd数据库集群,etcd通常部署奇数个实例,在大规模集群中,etcd有5个或7个节点就足够了;另外说明一点,etcd本质上可以不与master节点部署在一起,只要master节点能通过网络连接etcd数据库即可。
kubelet:每个node节点上都有一个kubelet服务进程,kubelet作为连接master和各node之间的桥梁,负责维护pod和容器的生命周期,当监听到master下发到本节点的任务时,比如创建、更新、终止pod等任务,kubelet 即通过控制docker来创建、更新、销毁容器;
每个kubelet进程都会在api-server上注册本节点自身的信息,用于定期向master汇报本节点资源的使用情况。
kube-proxy:kube-proxy运行在node节点上,在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作,kube-proxy会监听api-server中从而获取service和endpoint的变化情况,创建并维护路由规则以提供服务IP和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。
container-runtime:容器运行时环境,即运行容器所需要的一系列程序,目前k8s支持的容器运行时有很多,如docker、rkt或其他,比较受欢迎的是docker,但是新版的k8s已经宣布弃用docker。
kubelet的功能、作用是什么?(重点,经常会问)
答:kubelet部署在每个node节点上的,它主要有2个功能:
1、节点管理。kubelet启动时会向api-server进行注册,然后会定时的向api-server汇报本节点信息状态,资源使用状态等,这样master就能够知道node节点的资源剩余,节点是否失联等等相关的信息了。master知道了整个集群所有节点的资源情况,这对于 pod 的调度和正常运行至关重要。
2、pod管理。kubelet负责维护node节点上pod的生命周期,当kubelet监听到master的下发到自己节点的任务时,比如要创建、更新、删除一个pod,kubelet 就会通过CRI(容器运行时接口)插件来调用不同的容器运行时来创建、更新、删除容器;常见的容器运行时有docker、containerd、rkt等等这些容器运行时,我们最熟悉的就是docker了,但在新版本的k8s已经弃用docker了,k8s1.24版本中已经使用containerd作为容器运行时了。
3、容器健康检查。pod中可以定义启动探针、存活探针、就绪探针等3种,我们最常用的就是存活探针、就绪探针,kubelet 会定期调用容器中的探针来检测容器是否存活,是否就绪,如果是存活探针,则会根据探测结果对检查失败的容器进行相应的重启策略;
4、Metrics Server资源监控。在node节点上部署Metrics Server用于监控node节点、pod的CPU、内存、文件系统、网络使用等资源使用情况,而kubelet则通过Metrics Server获取所在节点及容器的上的数据。
参考:这https://blog.csdn.net/MssGuo/...
版权声明:本文为CSDN博主「MssGuo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MssGuo/...
pod创建过程
- 用户通过kubectl或其它API客户端提交pod spec给API Server。
- API Server尝试着将pod对象的相关信息存入etcd中,带写入操作执行完成后,API Server会立即返回确认信息至客户端。
- Scheduler通过其watcher检测到API Server创建了新的pod对象,于是为该pod对象挑选一个工作节点并将结果信息更新至API Server。
- 调度结果信息有API Server更新至etcd存储系统,并同步给Scheduler。
- 相应节点的kubelet检测到由调度器绑定于本节点的pod后会读取其配置信息,并由本地容器运行时创建相应的容器启动pod对象后将结果回存至API Server。
- API Server将kubelet发来的pod状态信息存入etcd系统,并将确认信息发送至相应的kubelet。
容器设计模式
单容器模式是指将应用程序封装为应用容器运行。该模式需要遵循简单和单一原则,每个容器仅承载一种工作负载。
单节点多容器模式
单节点多容器模式是指扩容器的设计模式,其目的是在单个主机之上同时运行多个共生关系的容器,因而容器管理系统需要将它们作为一个原子单位进行同一调度。kubernetes编排系统设计的pod概念就是这个设计模式的实现之一。
若多个容器间存在强耦合关系,它们具有完全相同的生命周期,或者必须运行于同一节点之上时,通常应该将它们置于同一个pod中,较常见的情况是为主容器并行运行一个助理管理进程。单节点多容器模式的常见实现有Sidercar(边车)、适配器(Adapter)、大使(Ambassador)、初始化(Initializer)容器模式等。
Sidecar模式
Sidecar模式是多容器系统设计的最常用模式,它由一个主应用程序以及一个辅助容器(Sidecar)组成,该辅助容器用于为主容器提供辅助服务以增强主容器功能,是主应用程序必不可少的一部分,但却不一定非得存在于应用程序本身内部。
最常见的sidecar容器时日志记录服务、数据同步服务、配置服务和代理服务等。对于主容器应用的每个实例,Sidecar的实例都被部署并托管在它旁边,主容器与sidecar容器具有相同的生命周期,毕竟主容器运行时,运行sidecar容器并无实际意义,尽管完全可以将sidecar容器集成到主容器内部,但是使用不同的容器来运行处理不同功能还是存在较多优势;
- 辅助应用的运行时环境和编译语言与主应用程序无关,因而无需为每种为每种编程语言分别开发一个辅助工具;
- 二者可基于IPC、lo接口或共享存储进行数据交换,不存在明显的通信延迟;
- 容器镜像时发布的基本单位,将主应用与辅助应用划分为两个容器使得可由不同团队开发和维护,从而变得方便及高效,单独测试及集成测试也变得可能;
- 容器限制了故障边界,使得系统整体可以优雅降级,例如sidecar容器异常时主容器仍可提供服务;
- 容器时部署的基本单元,每个功能模块均可独立部署及回滚。
https://blog.51cto.com/wanggu...
参考文档
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。