【云原生 | 从零开始学 Kubernetes】一、kubernetes 到底是个啥
写在开头
该篇作为 k8s 的开篇之作,并没有立马去做集群,而是先引入概念,以慢学习的方式来了解 k8s,不然学完了有的东西都看不懂那太可惜了。下一章就会实际部署集群!
部署发展历程
我们的项目部署也在经历下面的这样一个历程
传统部署 -> 虚拟化部署时代 -> 容器部署时代
传统部署时代:早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。如果在物理服务器上运行多个程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。有一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。
虚拟化部署时代:作为解决方案,引入了虚拟化功能,它允许在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代:容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS),不需要虚拟硬件,因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。
容器因具有许多优势而变得流行起来。下面列出了容器的一些好处:
敏捷的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
持续开发、集成和部署:通过简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
开发与运维的分离:在构建/时而不是在部署时创建应用程序容器镜像,将应用程序与基础架构分离。
可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
云和操作系统分发的可移植性:可在 Ubuntu、RHEL、RHEL、CoreOS、本地、Google Kubernetes Engine 和其它任何其它地方运行。
以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
分布式、弹性的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理-而不是在一台大型单机上器体运行。
资源隔离:可预测的应用程序性能。
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:
Swarm:Docker 自己的容器编排工具
Mesos:Apache 的一个资源统一管控的工具,需要和 Marathon 结合使用
Kubernetes:Google 开源的的容器编排工具
kubernetes 的出世
kubernetes,简称 K8s,因为 k 和 s 之间有八个字母,所以被称作 k8s。是一个开源的,基于 go 语言开发, 容器集群管理系统/容器编排平台。主要用于自动化部署、扩展和管理容器应用, 提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能,Kubernetes 目标是让部署容器化应用简单高效
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署。
Kubernetes 是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过 Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。
Kubernetes 积累了作为 Google 生产环境运行工作负载 15 年的经验,并吸收了来自于社区的最佳想法和实践。
K8s 是谷歌在 2014 年发布的容器化集群管理系统
使用 k8s 进行容器化应用部署
使用 k8s 利于应用扩展
k8s 目标实施让部署容器化应用更加简洁和高效
K8S 功能
1、数据卷
Pod 中容器间共享数据, 可以使用数据卷,Pod 是 K8s 部署的最小单元。
2、应用程序健康检查
容器内服务可能由于进程堵塞无法处理请求,可以设置监控检查策略保证可用性当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度,并且当容未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务处理请求可以设置监控检查策略保证可用。
3、复制应用程序实例
控制器维护着 Pod 副本数量,保证一个 Pod 或一组同类的 Pod 数量始终可用
4、弹性伸缩
通过命令,用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
当我们有大量的请求来临时,我们可以增加副本数量,从而达到水平扩展的效果
5、服务发现
使用环境变量或 DNS 服务插件保证容器中程序发现 Pod 入口访问地址,用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
对外提供统一的入口,让它来做节点的调度和负载均衡, 相当于微服务里面的网关?
6、负载均衡
一组 Pod 副本分配一个私有的集群 IP 地址,负载均衡转发请求到后端容器。在集群内部其他 Pod 可通过这个 ClusterIP 访问应用
7、滚动更新
更新服务不中断、一次更新一个 Pod,而不是同时删除整个服务,并且可以根据应用的变化对应用容器运行的应用,进行一次性或批量式更新。
添加应用的时候,不是加进去就马上可以进行使用,而是需要判断这个添加进去的应用是否能够正常使用
8、服务编排
通过文件描述部署服务, 使得应用程序部署变得更高效,自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要。存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
9、资源监控
Node 节点组件集成 cAdvisor 资源收集工具,可通过 Heapster 汇总整个集群节点资源数据,然后存储到 InfluxDB 时序数据库,再由 Grafana 展示。
10、提供认证和授权
支持角色访问控制(RBAC)认证授权等策略,在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
Kubernetes 架构
一、Master 组件
1、Kube-apiserver
Kubernetes API, 集群的统一入口,各组件协调者, 以 HTTP API 接口服务所有对象的管理及监听操作都交给 APIServer 处理后再提交给 Etcd 存储
2、Kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器, 而 ControllerManager 就是负责管理这些控制器的
3、Kube-scheduler
根据调度算法为新建的 Pod 选择 Node 节点
二、Node 组件
1、Kubelet
Kubelet 是 Master 在 Node 节点上的 agent, 管理本机运行容器的生命周期. 比如创建容器、Pod 挂载数据卷、下载 secret, 获取容器和节点状态等工作。kublet 将每个 Pod 转换成一组容器
2、Kube-proxy
在 Node 节点实现 Pod 网络代理, 维护网络规则和四层负载均衡工作
3、docker Engine
运行容器
三、Etcd
分布式键值存储系统. 用于保存集群状态信息;比如 Pod, service 等对象信息
完整架构图如下:
K8S 核心概念
1、Pod
Pod 是最小部署单元
一个 Pod 可以放一个容器、也可以放多个容器
通常一个 Pod 对应一个容器
2、Deployment
定义一组 Pod 副本数目,版本等通过控制器【Controller】维持 Pod 数目【自动回复失败的 Pod】通过控制器以指定的策略控制版本【滚动升级、回滚等】
3、Service
Service 一个应用服务抽象, 定义了 Pod 逻辑集合和访问这个 Pod 集合的策略 Service 代理 Pod 集合对外表现是为一个访问入口, 分配一个集群 Ip 地址, 来自这个 IP 的请求将负载均衡转发后端 Pod 中的容器 Service 通过 Lable Selector 选择一组 Pod 提供服务
4、volume
卷,实现持久存储、数据共享声明在 Pod 容器中可访问的文件目录可以被挂载到 Pod 中一个或多个容器指定路径下支持多种后端存储抽象【本地存储、分布式存储、云存储】
5、Namespace
命名空间将对象逻辑上分配到不同的 Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。命名空间也称为虚拟集群一个集群内部的逻辑隔离机制【鉴权、资源】每个资源都属于一个 namespace 同一个 namespace 所有资源不能重复不同 namespace 可以资源名重复
6、Label
标签用于区分对象(Pod, service 等), 键值对存在;每个对象可以有多个标签, 通过标签关联对象
7、Controller
Replicaset
简称 RS 确保任何给定时间指定的 Pod 副本数量
StatefulSet
StatefulSet 适合持久性的应用程序, 有唯一的网络标识符(IP), 持久存储、有序的部署、扩展、删除和滚动更新
DaemonSet
DaemonSet 确保所有节点运行同一个 Pod。当节点加入 Kubernetes 集群中, Pod 会被调度到该节点上运行, 当节点从集群中移除时,DaemonSet 会被删除。删除 DaemonSet 会清理它所有创建的 Pod
Job
一次性任务, 运行完成后 Pod 销毁, 不再重新启动新容器。还可以任务定时运行
8、API
我们通过 Kubernetes 的 API 来操作整个集群
同时我们可以通过 kubectl 、ui、curl 最终发送 http + json/yaml 方式的请求给 API Server,然后控制整个 K8S 集群,K8S 中所有的资源对象都可以采用 yaml 或 json 格式的文件定义或描述
kubernetes 部署流程
1.通过 Kubectl 提交一个创建 RC(Replication Controller)的请求,该请求通过 APlserver 写入 etcd
2.Controller Manager 通过 API Server 的监听资源变化的接口监听到此 RC 事件
3.分析之后,发现当前集群中还没有它所对应的 Pod 实例
4.于是根据 RC 里的 Pod 模板定义一个生成 Pod 对象,通过 APIServer 写入 etcd
5.此事件被 Scheduler 发现,它立即执行执行一个复杂的调度流程,为这个新的 Pod 选定一个落户的 Node,然后通过 API Server 讲这一结果写入 etcd 中
6.目标 Node 上运行的 Kubelet 进程通过 APiserver 监测到这个"新生的 Pod.并按照它的定义,启动该 Pod 并任劳任怨地负责它的下半生,直到 Pod 的生命结束
7.随后,我们通过 Kubectl 提交一个新的映射到该 Pod 的 Service 的创建请求
8.ControllerManager 通过 Label 标签查询到关联的 Pod 实例,然后生成 Service 的 Endpoints 信息,并通过 APIServer 写入到 etod 中,
9.接下来,所有 Node 上运行的 Proxy 进程通过 APIServer 查询并监听 Service 对象与其对应的 Endponts 信息,建立一个软件方式的负载均衡器来实现 Service 访问到后端 Pod 的流量转发功能
写在最后
创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改!目前正在更新的系列:从零开始学 k8s
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~
版权声明: 本文为 InfoQ 作者【泡泡】的原创文章。
原文链接:【http://xie.infoq.cn/article/2d9e8a14b44c5057206b6f1e6】。未经作者许可,禁止转载。
评论