kubernetes官网:https://kubernetes.io/
引言
kubernetes是什么
kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
Kubernetes能做什么
Kubernetes提供了一个可弹性运行分布式系统的框架,满足用户扩展要求、故障转移、部署模式等。
Kubernetes提供的服务:
- 服务发现和负载均衡
KUbernetes服务可以使用域名或者IP地址公开容器,如果进入容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使环境更加稳定 - 存储编排
Kubernetes允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等 - 自动部署和回滚
你可以使用Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为期望状态。例如,你可以通过自动化部署你的Kubernetes创建新容器,删除现有容器并将它们的所有资源用于新的容器。 - 资源管理
Kubernetes允许你指定每个容器所需CPU和内存(RAM)。当容器指定了资源请求时,Kubernetes可以做出更好的决策来管理容器的资源 - 自我修复
Kubernetes可以重新启动失败的容器、替换容器、杀死不响应用户定义的运行状态检查的容器,并且在准备好服务之前不将其通告给客户端 - 密钥与配置管理
Kubernetes允许你存储和管理敏感信息,例如密码、证书、服务配置文件。你可以在不重建容器镜像的情况下部署和更新应用配置。Kubernetes组件
控制平面
控制平面的组件对集群做出全局决策(比如高度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的Pod)
- Kube-apiserver
Kube-apiserver是集群的统一入口,各组件的协调者,以HTTP API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储 - etcd
etcd是兼具一致性和高可用性的键值数据库,用作保存Kubernetes所有集群数据的后台数据库,比如Pod、Service等对象信息。 - Kube-scheduler
负责监视新创建、未指定支行节点(Node)的Pods,选择节点让Pod在上面运行。
调度决策考虑的因素包括单个Pod和Pod集合的资源要求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限 - Kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,ControllerManager负责管理这些控制器,控制器包括:- 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
- 任务控制器(Job controller):监测代表一次性任务的Job对象,然后创建Pods来支行这些任务直至完成
- 端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入Service与Pod)
- 服务账户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认账户和Api访问令牌
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仅转发流量本身。 - Container Runtime
容器运行环境是负责运行容器的软件。
Kubenetes支持container runtimes,例如:docker、containerd、CRI-O插件
- 网络和网络策略
- Flannel 提供Kubernetes集群的网络通信
- 服务发现
- CoreDNS 是一个灵活的,可扩展的DNS服务器,为集群内的Pod提供DNS服务
- 可视化管理
- Dashboard 是一个Kubernetes的Web控制台界面
- 资源监控
- kube-Promethues
- prometheus: 收集指标和存储时间序列数据,并提供查询接口
- export:采集已有的第三方服务监控指标并暴露Metrics,相于当采集的一个agent
- Altermanager:根据rules告诉监控告警通知(邮件、微信、钉钉)
- grafana:通过grafana进行监控数据展示
- kube-Promethues
- 集群日志
- Loki
- Loki:主服务器,负责存储日志和处理查询
- Pormtail:是代理,负责收集日志,并将期发送给Loki
- Grafana:用于UI展示日志数据
通信原理
K8S各组件通过api-server进行通信
- kubelet & APIserver
- node点的kubelet每个时间周期,会调用api-server的REST接口报告自身状态。
- kubelet通过watch接口,监听Pod信息。监听Pod的创建、删除、修改事件
- Controller-manager & Apiserver
- controller-manager中包含多个controller,举例:Node Controller模块通过API server提供的Watch接口,实现监控node信息,并做相应处理。
- scheduler & Apiserver
- scheduler通过Apisever的watch接口监听,监听到新建POD副本后,检索所有符合该pod要求的node列表,开始执行Pod调度,调度成功后将Pod绑定到具体节点
典型的Pod创建/删除流程
- scheduler通过Apisever的watch接口监听,监听到新建POD副本后,检索所有符合该pod要求的node列表,开始执行Pod调度,调度成功后将Pod绑定到具体节点
- Pod的创建过程
1. 用户通过kubectl或其他的api客户端提交需要创建的Pod信息给API Server。
-
API Server开始生成Pod对象的信息,并将信息存入etcd,然后返回确认信息至客户端。
-
API Server开始反映etcd中的Pod对象的变化,其它组件使用watch机制来跟踪检查API Server上的变动。
-
Scheduler发现有新的Pod对象要创建,开始为Pod分配主机并将结果信息更新至API Server。
-
Node节点上的kubelet发现有Pod调度过来,尝试调度Docker启动容器,并将结果回送至API Server。
- API Server将接收到的Pod状态信息存入到etcd中。
* Pod的删除过程
```yaml
1. 用户向API Server发送删除Pod对象的命令
2. 将Pod标记为terminating状态
3. kubelet在监控到Pod对象转为terminating状态的同时启动Pod关闭过程
4. 端点控制器监控到Pod对象的关闭行为时,将其从所有匹配到此端点的service资源的端点列表中移除
5. 如果当前Pod对象定义了preStop钩子处理器,则在其标记为terminating后会以同步的方式启动执行
6. Pod对象中的容器进程收到停止信号
7. 宽限期结束后(默认30s),如果Pod中还存在运行的进程,那么Pod对象会收到立即删除的信号
8. kubectl请求API Server将此Pod资源的宽限期设置为0从而完成删除操作,此时Pod对于用户已经不可用