Kubernetes[1],又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 "kube" ,是一种可自动实施 Linux 容器[2]操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,您可以将运行 Linux 容器的多组主机聚集在一起,由 Kubernetes 帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云[3]、私有云[4]或混合云[5]部署主机。Kubernetes 是理想的托管平台。
Kubernetes 最初由 Google 的工程师开发和设计。Google 是最早研发 Linux 容器技术的企业之一(组建了cgroups)[6],曾公开分享介绍 Google 如何将一切都运行于容器之中[7](这是 Google 云服务背后的技术)。Google 每周会启用超过 20 亿个容器——全都由内部平台 Borg[8] 支撑。Borg 是 Kubernetes 的前身,多年来开发 Borg 的经验教训成了影响 Kubernetes 中许多技术的主要因素。
红帽是第一批与 Google 合作研发 Kubernetes 的公司之一,作为 Kubernetes 上游项目的第二大贡献者,我们甚至在这个项目启动之前就已参与其中。2015 年,Google 将 Kubernetes 项目捐赠给新成立的云原生计算基金会[9]。
Kuberneters(k8s)
是谷歌使用了将近20年的一个云产品,是Borg
的一个开源版本。Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术,目的是实现资源管理的自动化,以及跨多个数中心的资源利用率的最大化。十几年来,谷歌一直通过 Borg 系统管理着数量庞大的应用程序集群。由于谷歌员工都签署了保密协议,即便离职也不能泄露Borg
的内部设计,所以外界一直无法了解关于它的更多信息。直到2015年4月
,传闻许久的 Borg 论文伴随 Kuberneters 的高调宣传被谷歌首次公开,大家才得以了解它的更多内幕。正是由于站在 Borg 这个前辈的肩膀上,吸取了 Borg 过去十年间的经验与教训,所以 Kubernetes 一经开源就一鸣惊人,并迅速称霸了容器技术领域。
Kubernetes 拥有一个庞大且快速增长的生态系统。因为它是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 的服务、支持和工具广泛可用。
Kubernetes 源于希腊语,意为 "舵手" 或 "飞行员"。Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践。
通过对比来看一下为什么我们需要kubernetes,为什么新时代需要kubernetes:
传统部署时代: 早期,将单一的应用服务运行在物理服务器上,无法给服务器的应用程序进行资源的限制,导致物理服务器之间的资源负载使用不均衡,就导致了服务器上的应用程序的性能下降,物理服务器的维护成本变得很高。
虚拟化部署时代: 作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机VM
。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。
容器部署时代: 容器
类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统OS
。因此,容器被认为是目前最轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。而在容器时代,Docker
容器引擎是最流行的一个。
容器因具有许多优势而变得流行起来。下面列出了容器的一些好处:
build
/deploy
而不是在deploy
时创建应用程序容器,从而将应用程序与基础架构分离。运行状况
和其他指标
信息。容器是打包和运行应用程序的最好的一种方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果系统能够自动的处理这种行为,你觉得会不会是更方便。
这就是 Kubernetes 的救援方法!Kubernetes 为您提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足您的扩展要求、故障转移、部署模式等。例如,Kubernetes 可以轻松地实现金丝雀canary
发布。
不断的将服务运行为按照用户定义服务运行的期望状态
service
资源对象自实现负载均衡和服务发现: 当出现流量负载的时候,service会将流量按照一定的均衡算法调度到对应的资源组
可以按照用户定义的资源调度方式进行自动化的资源调度
获取服务运行负载指标,通过HPA实现服务的自动扩容与伸缩
支持例如nginx、filebeat等这种无状态以及MYSQL,Mongodb,Elasticsearch等有状态的集群服务
s3
,ceph
,nfs
,glusterfs
...通过在不修改源代码的情况下增加类似如CNI、CRI、CSI、Device Plugin、CRD等扩展来解决越来越多的个性化需求
k8s的一套安全策略,通过用户或组与k8s上一些资源角色绑定从而实现在单一范围内有权限执行动作
k8s本身具有多层资源隔离的条件例如集群本身、命令空间、节点、pod与容器
通过k8s的service资源对象与label资源对象实现基本的服务注册与发现
因为k8s本身的特性,实现canary显得非常简单
k8s通过自身的resize功能结合一些存储卷实现不丢失原来数据的情况下进行在线扩容
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。由于 Kubernetes 在容器级别而不是在硬件级别运行,因此它提供了 PaaS 产品共有的一些普遍适用的功能,例如部署、扩展、负载均衡、日志记录和监视。但是,Kubernetes 不是单一的,默认解决方案是可选和可插拔的。Kubernetes 提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。
Kubernetes:
消息中间件
、数据处理框架Spark
、数据库mysql
、缓存、集群存储系统Ceph
。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制开放服务代理[10]来访问。声明性 API
,该声明性 API 可以由任意形式的声明性规范所构成。更强大、健壮、弹性和可扩展性
。CCE
ACK
TKE
GCE
[1]kubernetes官网: https://kubernetes.io
[2]Linux容器: https://www.redhat.com/zh/topics/containers/whats-a-linux-container
[3]公共云: https://www.redhat.com/zh/topics/cloud-computing/what-is-public-cloud
[4]私有云: https://www.redhat.com/zh/topics/cloud-computing/what-is-private-cloud
[5]混合云: https://www.redhat.com/zh/topics/cloud-computing/what-is-hybrid-cloud
[6]cgroup: https://zh.wikipedia.org/wiki/Cgroups
[7]all in container: https://speakerdeck.com/jbeda/containers-at-scale
[8]Borg: http://blog.kubernetes.io/2015/04/borg-predecessor-to-kubernetes.html
[9]CNCF: https://www.cncf.io/
[10]开发服务代理: https://openservicebrokerapi.org/