Kubernetes概述
- 回顾历史
- 你为什么需要Kubernetes,它能为我们做什么
- Kubernetes不适宜的场景
- 接下来的内容
Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的场景和服务,Kubernetes有利于声明性的配置和自动化运维。Kubernetes拥有庞大的,快速发展的生态系统。Kubernetes拥有广泛的服务,支持和工具。
Kubernetes的名字源于希腊,它的含义是舵手和飞行员。google在2014年开源了该项目。Kubernetes构建在google的15年大规模生产环境部署运维的经验上,同时结合和社区的创意和经验。
回顾历史
我们通过回顾历史来阐述为什么Kubernetes的意义
传统部署应用方式:早期,企业在物理机上部署应用程序。在这种部署模式下,无法限制应用程序使用物理机的资源、并且导致了资源分配的问题。例如,如果物理机上运行多个应用程序,可能存在一个应用程序占用过多的物理机资源,从而造成其他的应用程序性能下降。该问题的解决方案是在不同的物理机上运行每一个应用程序,这种方式资源利用率低,并且不能扩展、企业维护大量的物理机的运维成本很高。
虚拟机部署应用方式:为了解决传统部署应用带来的问题,引入了虚拟化的解决方案。它允许你在单一的物理机上运行多个虚拟机。虚拟化能够在多个虚拟机之间进行隔离,并且提供一定程度的安全性,使得不同的虚拟机之间不能*访问对方。虚拟化能够更好的利用物理机资源,并且提供了可扩展性,因为添加和更新应用程序更加方便,同时降低了硬件成本。每个VM都是在硬件虚拟化上运行所有的组件,包括其自己的操作系统。
容器化部署方式:容器类似于VM,但是他们具有宽松的隔离属性,可在应用之间共享操作系统。所以,容器被认为是轻量化的。和VM类似,容器具有自己的文件系统、CPU、内存和进程空间等。容器和底层基础架构分离,它们可以跨云和OS进行移植。
容器越来越受到欢迎,它可以给你带来很多好处,下面列出容器的一些优势:
- 敏捷的应用程序构建和部署。和VM镜像相比,构建容器镜像更加容易和便捷。
- 持续开发、集成和部署。通过快速和简便的回滚,提供了可靠和快捷的容器的构建和部署。
- dev和ops分离的考虑。在构建和发布时创建容器镜像,从而将应用程序和基础架构分离。
- 可观测性。不仅仅是OS级别的监控指标,还可以显示应用程序的健康状况和其他信息。
- 开发、测试和生产的环境一致性。在笔记本电脑上运行和在云上运行一致。
- 云和OS发布的可移植性。可以在Ubuntu, RHEL, CoreOS, on-prem, Google Kubernetes Engine等上运行
- 以应用为中心的管理。提高抽象层次,从虚拟化硬件上运行操作系统到使用逻辑资源在OS上运行应用程序
- 松耦合、分布式、弹性,开放的微服务。应用程序被拆分为更小的独立单元,可以动态部署和管理,而不是单体应用
- 资源隔离。可预测的应用性能
- 资源利用,高效和高密度的利用资源。
我们为什么需要Kubernetes,它能做什么
容器是运行应用程序的一种好的方式,在生产环境中,你需要管理运行应用程序的容器,并且确保它不宕机,如果一个容器宕机,需要启动另外一个容器来补充。如果系统处理这种情况,是不是使生产环境运维更加容易?
Kubernetes为您提供了一种弹性运行分布式系统的架构。Kubernetes负责您的应用扩展需求,故障转移,部署模式等。例如,Kubernetes可以轻松的管理系统金丝雀部署。
Kubernetes提供了如下功能:
- 服务发现和负载均衡
Kubernetes可以通过DNS的名称或者容器的IP对外暴露服务,如果请求量比较大,Kubernetes能够负载均衡和分配请求来确保部署的稳定。 - 存储编排
Kubernetes允许你自动挂载您选择的存储系统,例如本地存储,公有云提供商。 - 自动部署和回滚
你可以使用Kubernetes描述你部署应用的期望状态,并且以受控的速率将实际状态修改成期望的状态。例如,你可以自动让Kubernetes为您的部署创建新的容器,移除现有的容器并将所有的资源用于新的容器。 - 自动装箱
Kubernetes允许指定每个容器的CPU和内存的需求,当容器指定了资源请求时,Kubernetes可以更好的管理容器的资源。 - 自我恢复
Kubernetes重启宕机的容器,替换容器,杀死无法响应用户自定义健康检查的容器。 - 秘钥和配置管理
Kubernetes允许你存储和管理敏感的信息,例如密码,OAuth tokens和ssh keys。你可以部署和更新应用程序配置,而不用重新构建容器的镜像,也不需要在您大量配置中暴露您的秘钥。
Kubernetes不是什么
Kubernetes不是传统的,包罗万象的Paas系统,因为Kubernetes运行在容器层次而不是硬件层次,它提供Paas产品的一些通用的功能,例如部署、扩展、负载均衡、日志和监控。然而,Kubernetes并不是一个庞大的系统,这些默认的功能是可选的和可插拔的,Kubernetes提供了构建开发者平台的可选的能力,在重要的地方保留了用户的选择和灵活性。
Kubernetes:
- Kubernetes不限制支持的应用的类型,Kubernetes目标是支持各种运行场景,包括无状态的应用场景、有状态的应用场景、数据处理应用场景,如果应用程序可以在容器中运行,那么它应该在Kubernetes中运行的很好。
- 不部署源代码和不构建您的应用程序,持续集成、交付、部署(CI/CD)的工作流程由企业的约定规则和技术要求来决定。
- 不提供应用程序层次的服务,例如中间件(例如消息总线),数据处理框架(例如spark),数据库(例如mysql),缓存,分布式存储(例如Ceph)来作为内置的服务,这些组件可以在Kubernetes中运行,或者通过方便的机制(例如Open Service Broker)能够让运行在Kubernetes中的容器访问。
- 并不指定日志、监控、报警系统,它提供了一些概念的集成组件,一种机制来采集、暴露指标。
- 不提供,更没有强制规定一种配置语言。它提供一种声明式的API,通过任意形式的声明性规范来实现。
- 没有提供或者采用任何全面的机器配置,维护,管理或自我修复系统。
- 此外,Kubernetes不仅仅是一个编排系统,事实上,它消除了编排的需求。编排的技术性定义是执行定义的工作流程。首先做A,然后做B,最后做C。相反,Kubernetes由一组独立的,可组合的控制处理器组成。这些控制处理器将容器的当前状态更改成你所期望的状态。你不用关心如果从A到C。集中的控制系统是不需要的,这使得系统更容易使用、更强大、更健壮、更有弹性、并且可以扩展。