Kurbernetes是Google旗下的容器跨主机编排工具。 Kurbernetes可以自动化应用容器的部署、扩展和操作,提供以容器为中心的基础架构。
一、Kurbernetes集群架构与组件
Kubernetes 采用主从分布式架构,节点在角色上分为 Maste 和 Node。- Kubernetes Master 是控制节点,负责k8s集群的调度、管理等运维工作,组件有apiserver、controller-manager、scheduler、etcd。
- Kubernetes Node 是运行节点,负责运行工作负载,即容器应用,组件有kubelet、kuber-proxy、容器引擎/容器运行时(docker、containerd)等。
二、Kurbernetes的核心组件
1.Master组件
Kube-apiserver
所有服务请求的统一访问入口 提供认证、授权、访问控制、API 注册和发现等机制,其中封装了核心对象的增删改查操作。 外部的客户端和内部的组件可以通过调用 REST API 接口的方式获取数据信息,这些数据信息都存储到了 Etcd 中。Kube-controller-manager
负责执行各种控制器。 1) 作为控制管理器,负责管理K8s各种资源对象的控制器; 2) 通过apiserver监控整个K8s集群资源的状态,并确保集群始终处于预期的工作状态。 常用控制器 控制器 | 名称 | 作用 | 补充说明 |
Node Controller | 节点控制器 | 负责在节点出现故障时发现和响应 | 定期检查 Node 的健康状态,标识出失效的 Node |
Replication Controller | 副本控制器 | 保证Replication Controller 定义的副本数量与实际运行 Pod 的数量一致 | 可以理解成确保集群中有且仅有N个Pod实例,N是RC中定义的Pod副本数量 |
Endpoints Controller | 端点控制器 | 填充端点对象(即连接Services和Pods),负责监听Service和对应的Pod副本的变化 | 端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的endpoint |
Service Account & Token Controllers | 服务账户和令牌控制器 | 为新的命名空间创建默认账户和API访问令 | |
ResourceQuota Controller | 资源配额控制器 | 确保指定的资源对象在任何时候都不会超量占用系统物理资源 | |
Namespace Controller | 命名空间控制器 | 管理namespace的声明周期 | 定期清理无效的 Namespace,以及 Namespace 下的 API 对象,比如:Pod、Service、Secrte 等 |
Service Controller | 服务控制器 | 属于K8S集群与外部的云平台之间的一个接口控制器 |
Kube-scheduler
可视为 资源调度器,负责集群中的Pod资源调度,通过 调度算法(预选策略和优选策略)为要部署的Pod选择最适合的Node节点。 预选策略(predicate)和 优选策略(priorities) 首先是过滤掉不满足条件的节点,这个过程称为 预选(predicate) ; 然后对通过的节点按照优先级排序,这个是 优选(priority) ; 最后从中选择优先级最高的节点。 如果中间任何一步骤有错误,就直接返回错误。2.配置存储中心——etcd
可以看作K8s集群的数据库,是一种键值对存储结构的分布式数据库,负责存储K8s集群的所有重要信息, 只有apiserver有读写权限。 Etcd 是高可用的键值存储系统,通过 Raft 一致性算法处理日志复制来保证强一致性。 Kubernetes 中的重要数据都持久化到 Etcd 中,所有架构中的各个组件都是无状态的。3.Node组件
Kubelet
1)接收master的apiserver发来的请求,创建和管理Pod与容器,和容器引擎交换来实现容器的生命周期的管理 ; 2)收集node节点的资源信息和Pod的运行状态发送给apiserver。Kube-Proxy
作为service资源的载体,实现对Pod的网络代理,负责维护Pod集群的网络规则和四层负载均衡工作。容器引擎/容器运行时
用于运行容器。 Kubernetes Container Runtime,容器运行时,Node 是使用容器运行的节点,可以使用多种容器。4.推荐的插件(补充知识)
- CoreDNS:为整个集群提供 DNS 服务。
- Ingress Controller:为服务提供外网入口。
- Dashboard:提供 GUI(图形用户界面)。
- Federation:提供跨可用区的集群。
- Fluentd:日志收集。
三、Kurbernetes创建Pod资源的工作流程
1)用户通过客户端 发送创建Pod的请求给 apiserver; 2)Apiserver接收到请求后,会先把请求信息写入到 etcd中保存,再找 controller-manager根据请求信息中的资源预设模板创建Pod资源; 3)Controller-manager会通过apiserver找到 scheduler,来 调度新创建的Pod资源; 4)Scheduler通过调度算法的预选策略及优选策略, 筛选出最适合的Node节点进行调度; 5) 再通过apiserver找到对应的node节点上的 Kubelet去 创建和管理Pod; 6)Kubelet会跟 容器引擎交互来 管理Pod和容器的生命周期; 7)用户还可以通过apiserver在 kube-proxy上 写入iptables/ipvs网络规则, 创建service资源, 实现对Pod集群的网络代理。四、Kubernetes资源对象
1.Pod
Pod是K8s能够创建和管理的最小单位,一个Pod里可以包含一个或者多个容器应用,Pod里的容器之间共享网络、存储等资源。 一个 Pod 里可以运行多个容器,又叫 边车模式(SideCar)。 而在生产环境中一般都是单个容器或者具有强关联互补的多个容器组成一个 Pod。 同一个 Pod 之间的容器可以通过 localhost 互相访问,并且可以挂载 Pod 内所有的数据卷; 但是不同的 Pod 之间的容器不能用 localhost 访问,也不能挂载其他 Pod 的数据卷。2.Pod控制器
Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。 Pod控制器 | 功能 |
Deployment | 部署无状态应用,同时也负责管理replicaset(维持Pod副本数量符合预期数量)和Pod(容器化的应用进程) |
Statefulset | 部署有状态服务/应用 |
Daemonset | 在所有的node节点上部署同一类型的Pod |
Job | 一次性的部署短期任务的Pod(执行完任务后会自动退出的Pod) |
Cronjob | 周期性的部署短期任务的Pod(执行完任务后会自动退出的Pod) |