初识Kubernetes
一、 Kubernetes是什么及其架构
1.1. kubernetes是什么?
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。kubernetes,简称k8s,是用8代替8个字符“ubernete”而成的缩写。
官网: https://kubernetes.io/docs/home/
github: https://github.com/kubernetes/kubernetes
1.2 kubernetes的架构及各个组件介绍
kube-apiserver
API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。默认端口是:6443
kube-scheduler
控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。默认端口是:10251
调度步骤如下:
通过调度算法为待调度的pod列表中的每个pod从可用node上选择一个最适合的Node
Node节点上的kubelet会通过Apiserver监听到scheduler产生的pod绑定信息,然后获取pod清单,下载image并启动荣区
Node选择策略:
LeastRequestedPriority: 优先选择资源消耗最小的节点
CaculateNodeLabelPriority: 优先选择含有指定label的节点
BalancedResourceAllocation:优先从备选节点中选择资源使用率最均衡的节点
kube-controller-manager
包括一些子控制器(副本控制器,节点控制器,命名空间控制器和服务账号控制器等),作为集群内部的管理控制中心,负责集群内部的Node,Pod副本,服务端点,namespace,服务账号,资源定额的管理,当某个Node意外宕机时,controller manager会及时发现并执行自动修复流程确保集群中的pod副本数始终处于预期的状态
特点:
每隔5s检查一次节点状态
如果没有收到自节点的心跳。该节点会被标记为不可达
标记为不可达之前会等待40s
nide节点标记不可达5s之后还没有恢复,controllerManager会删除当前node节点的所有pod并在其他可用节点重建这些pod
etcd
etcd 是兼具一致性和高可用性的键值数据库,作为保存 Kubernetes 所有集群数据的后台数据库;Kubernetes 集群的 etcd 数据库通常需要高可用架构和有个备份计划。生产环境可以单独部署载独立的服务器上,节点数量一般是:3、5、7这样的奇数个数。
kubelet
一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都运行在 Pod 中。
具体功能如下:
向master(api-server)汇报node节点的状态信息
接受指令并在pod中创建docker容器
准备pod所需要的数据卷
返回pod状态
在node节点执行容日健康检查
kube-proxy
kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service)概念的一部分。kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。
不同版本支持三种工作模式:
userspace: k8s1.1版本之前使用,1.2之后淘汰
iptables: k8s1.1版本开始支持,1.2开始为默认
ipvs: k8s1.9引入,1.11成为正式版本,需要安装ipvsadm,ipset工具包加载ip_vs内核模块
1.3 pod的调度流程
1、kubelet client(或restful api等客户端等方式) 端执行kubelet create pod命令提交post kubelet apiserver请求
2、apiserver 监听接受到请求:
2.1、对请求进行、解析、认证、授权、超时处理、审计通过
2.2、pod请求事件进入MUX和route流程,apiserver会根据请求匹配对应pod类型的定义,apiserver会进行一个convert工作,将请求内容转换成super version对象
2.3、apiserver会先进行admission() 准入控制,比如添加标签,添加sidecar容器等和校验个字段合法性
2.4、apiserver将验证通过的api对象转换成用户最初提交的版本,进行序列化操作,并调用etcd api保存apiserver处理pod事件信息,apiserver把pod对象add到调度队列中
3、schedule相关情况:
3.1、schedule调度器会通过监听apiserver add到pod对象队列,
3.2、调度器开始尝试调度,筛选出适合调度的节点,并打分选出一个最高分的节点
3.3、调度器会将pod对象与node绑定,调度器将信息同步apiserver保存到etcd中完成调度
4、工作节点上的相关情况:
4.1、节点kubelet通过watch监听机制,监听与自己相关的pod对象,kubelet会把相关pod信息podcache缓存到节点内存
4.2、kubelet通过检查该pod对象在kubelet内存状态,kubelet就能够判断出是一个新调度pod对象
4.3、kubelet会启动 pod update worker、单独goroutine处理pod对象生成对应的pod status,检查pod所生命的volume、网络是否准备好
4.4、kubelet调用docker api 容器运行时CRI,发起插件pod所定义容器Container Runtime Interface, CRI请求
4.5、docker 容器运行时比如docker响应请求,然后开始创建对应容器
总结:
1. 用户提交创建Pod的请求,可以通过API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml两种格式;
2. API Server 处理用户请求,存储Pod数据到Etcd;
3. Schedule通过和 API Server的watch机制,查看到新的pod,尝试为Pod绑定Node;
4. 过滤主机:调度器用一组规则过滤掉不符合要求的主机,比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机;
5. 主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;
6. 选择主机:选择打分最高的主机,进行binding操作,结果存储到Etcd中;
7. kubelet根据调度结果执行Pod创建操作: 绑定成功后,会启动container, docker run, scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。
本文作者:没有猫的猫奴
本文链接:https://www.cnblogs.com/cat1/p/15890588.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步