1. 是什么
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
通过Kubernetes你可以:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
Kubernetes 特点
- 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
- 可扩展: 模块化, 插件化, 可挂载, 可组合
- 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes的名称源于希腊语,意为舵手或领航员。通常简称为K8s是因为“K”和“s”之间的8个字母得出的。Google于2014年开源了Kubernetes项目。Kubernetes结合了谷歌15年在大规模生产工作负载方面的经验和社区最佳实践的想法。
为什么使用容器
![](/a2020/img/data-img.jpg)
- 传统部署时代(Traditional Deployment):早期,公司会在物理服务器上运行应用程序,但是在物理服务器上无法定义应用程序的资源边界,这就会导致资源分配问题。例如,如果多个应用程序在一个物理服务器上运行,可能会出现一个应用程序占用大部分资源的情况,从而影响其他应用程序,导致程序运行效率低下。解决这个问题的方法是在不同的物理服务器上运行每个应用程序,但这无法进行扩展,资源被低效利用,而且维护许多物理服务器对公司来说是昂贵的。
- 虚拟化部署时代(Virtualized Deployment):作为解决方案,引入了虚拟化技术,它允许在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化使应用程序在VM之间得以隔离,并提供了一定程度的安全性,因为一个应用程序的信息不能被另一个应用程序随意访问。
- 虚拟化允许更好地利用物理服务器的资源,允许更好的可扩展性,因为应用程序可以轻松地添加或更新,降低硬件成本等等。在虚拟化中,您可以将一组物理资源呈现为一组可随时丢弃的虚拟机群集。
- 每个VM都是一个完整的机器,运行所有组件,包括自己的操作系统,位于虚拟化硬件之上。
- 容器部署时代:容器类似于VM,但是可以保证应用程序在共享操作系统的基础上进行资产隔离。因此,容器被认为是轻量级的,与虚拟机类似,容器有自己的文件系统、CPU共享、内存、进程空间等等。由于它们与底层基础设施解耦,因此可以跨云和操作系统进行移植。
- 容器因为有如下优势才变得开始流行起来:
- 快速创建/部署应用:与VM虚拟机相比,容器镜像的创建更加容易;
- 持续开发、集成和部署:提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性);
- 开发和运行相分离:在build或者release阶段创建容器镜像,使得应用和基础设施解耦;
- 可观察性:不仅显示操作系统级别的信息和指标,还显示应用程序健康状况和其他信号;
- 开发,测试和生产环境一致性:在本地或外网(生产环境)运行的一致性;
- 云平台或其他操作系统的兼容性:可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行;
- 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提高到使用逻辑资源在操作系统上运行应用程序;
- Loosely coupled,分布式,弹性,微服务化:应用程序分为更小的、独立的部件,可以动态部署和管理;
- 资源隔离:能够制定应用程序使用资源,防止占用资源过多影响其他应用;
- 资源利用:使资源利用更高效。
2.使用Kubernetes能做什么?
容器是捆绑和运行应用程序的好方法。在生产环境中,需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果这种行为由一个系统来处理,不是会更容易吗?
没错,这就是Kubernetes的好处!Kubernetes为您提供了一个弹性运行分布式系统的框架。它负责应用程序的扩展和故障切换,提供部署模式等等。例如:Kubernetes可以轻松地管理系统的部署。
可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:
- 服务发现和负载均衡:Kubernetes可以使用DNS名称或使用自己的IP地址对外暴露容器。如果容器的流量很高,Kubernetes能够实现负载均衡和分配网络流量,从而使部署的应用稳定运行;
- 存储编排:Kubernetes允许自动装载选择的存储系统,如本地存储、公共云提供商等;
- 自动推出和回滚:可以使用Kubernetes更改已部署容器的状态,并且可以以可控的速率将实际状态更改为所需状态。例如,您可以自动化Kubernetes为您的部署创建新的容器,删除现有的容器,并将其所有资源用于新的容器;
- 自动装箱:为Kubernetes提供了一个节点集群,可以用来运行容器化任务。可以告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以将容器安装到您的节点上,以最大限度地利用您的资源;
- 自我恢复:Kubernetes会重新启动失败的容器,替换容器,杀死对用户定义的健康检查没有响应的容器,并且在它们准备好提供服务之前不会向客户端公布它们;
- 密匙和配置管理:Kubernetes允许您存储和管理敏感信息,如密码、OAuth令牌和SSH密钥。您可以部署和更新密匙和应用程序配置,而无需重新构建容器映像,也无需在堆栈配置中暴露密匙。
3. Kubernetes不是什么?
Kubernetes不是一个传统的、包罗万象的PaaS(平台即服务)系统。由于Kubernetes是在容器级别而不是硬件级别运行的,因此它提供了一些PaaS产品常见的通用功能,如部署、扩展、负载平衡,并允许用户集成他们的日志记录、监控和警报解决方案。然而,Kubernetes并不是单一的,这些默认解决方案是可选的和可插入的。Kubernetes为构建开发人员平台提供了构建块,但在重要的地方保留了用户选择和灵活性。
- Kubernetes不限制支持应用的类型,不限制应用框架。不限制受支持的语言runtimes (例如, Java, Python, Ruby),满足12-factor applications 。不区分 “apps” 或者“services”。 Kubernetes支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么就能很好的运行在Kubernetes上;
- Kubernetes不提供中间件(如message buses)、数据处理框架(如Spark)、数据库(如Mysql)或者集群存储系统(如Ceph)作为内置服务。但这些应用都可以运行在Kubernetes上面;
- Kubernetes不部署源码不编译应用。持续集成的 (CI)工作流方面,不同的用户有不同的需求和偏好的区域,因此,我们提供分层的 CI工作流,但并不定义它应该如何工作;
- Kubernetes允许用户选择自己的日志、监控和报警系统;
- Kubernetes不提供或授权一个全面的应用程序配置 语言/系统(例如,jsonnet);
- Kubernetes不提供任何机器配置、维护、管理或者自修复系统;
- Kubernetes运行在应用级别而不是硬件级,因此提供了普通的Paas平台提供的一些通用功能,比如部署,扩展,负载均衡,日志,监控等。这些默认功能是可选的。Kubernetes不仅仅是一个“编排系统”;它消除了编排的需要。“编排”的定义是指执行一个预定的工作流:先执行A,之B,然C。相反,Kubernetes由一组独立的可组合控制进程组成。怎么样从A到C并不重要,达到目的就好。当然集中控制也是必不可少,方法更像排舞的过程。这使得系统更加易用、强大、弹性和可扩展。