学习kubernetes
1、Docker是什么
Docker 起初是 dotCloud 公司创始人 Solomon Hykes 在法国的时候发起的一项公司内部项目,Docker是基于 dotCloud 公司多年云服务技术的一次革新,在 2013 年 3 月以 Apache 2.0 授权协议进行开源,其项目主要代码在 GitHub 上进行维护,自从Docker 开源之后,就一直受到了广泛讨论和关注。Docker 进行开发实现使用的是Google 公司推出的 Go 语言,对进程进行封装隔离是基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,这属于操作系统层面的虚拟化技术。因为隔离的进程独立于宿主与其它隔离的进程,所以也称其为容器(后文会对“容器”的概念进行详细介绍)。Docker 在容器的基础上,进行了进一步的封装,从网络互联、文件系统到进程隔离等,大大地简化了容器的创建和维护,让 Docker 技术比虚拟机技术更加轻便、快捷。
以下两张图片对比了 Docker 与传统虚拟化方式的不同之处。Docker 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,没有进行硬件虚拟;而传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。因此容器要比传统虚拟机更为轻便。
2、为什么要使用 Docker
系统资源利用更高效
因为容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,所以Docker 对系统资源的利用率更高。
启动时间更快速
Docker 容器应用由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。极大地节省了开发、测试,部署的时间。
运行环境一致性
开发过程中比较常见的问题就是环境一致性问题。因为开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付与部署
对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在各种环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好地在生产环境中部署该镜像。
迁移更轻松
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻松地将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境变化导致应用无法正常运行的情况。
维护和扩展更轻松
Docker 使用的分层存储以及镜像技术,使得应用重复部分的复用更为容易,也使得应用的维护更新和基于基础镜像进一步扩展镜像变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本。
3、Docker的镜像和容器
Docker的口号是“Build, Ship and Run Any App, Anywhere.”,大意是编译好一个应用后,可以在任何地方运行,不会像传统的程序一样,一旦换了运行环境,往往就会出现缺这个库,少那个包的问题。那么Docker是怎么做到这点的呢?
简单说就是它在编译应用的时候把这个应用依赖的所有东西都构建到镜像里面(有点像程序的静态编译——只是像而已)。我们把这个编译构建好的东西叫Docker镜像(Image),然后当Docker daemon(Docker的守护进程/服务进程)运行这个镜像的时候,我们称其为Docker容器(Container)。可以简单理解Docker镜像和Docker容器的关系就像是程序和进程的关系一样(当然实质是不一样的)。
Images和Layers
每个Docker镜像(Image)都引用了一些只读的(read-only)层(layer),不同的文件系统layer也不同。这些layer堆叠在一起构成了容器(Container)的根文件系统(root filesystem)。
Container和Layers
容器和镜像的主要区别就是顶部的那个可写层(即之前说的那个“container layer”)。容器运行时做的所有操作都会写到这个可写层里面,当容器删除的时候,这个可写层也会被删掉,但底层的镜像依旧保持不变。所以,不同的容器都有自己的可写层,但可以共享同一个底层镜像。
Docker的storage driver负责管理只读的镜像层和可写的容器层,当然不同的driver实现的方式也不同,但其后都有两项关键技术:可堆叠的镜像层(stackable image layer)和写时拷贝技术(copy-on-write, CoW)。
Docker数据持久化
刚开始的时候,Docker一般只适用于无状态的计算场景使用。但随着发展,Docker通过data volume技术也可以做到数据持久化了。Data volume就是我们将主机的某个目录挂载到容器里面,这个data volume不受storage driver的控制,所有对这个data volume的操作会绕过storage driver直接其操作,其性能也只受本地主机的限制。而且我们可以挂载任意多个data volume到容器中,不同容器也可以共享同一个data volume。
4、Kubernetes 简介
Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg 的开源版本,主要功能包括:
基于容器的应用部署、维护和滚动升级 负载均衡和服务发现 跨机器和跨地区的集群调度 自动伸缩 无状态服务和有状态服务 广泛的 Volume 支持 插件机制保证扩展性 Kubernetes 发展非常迅速,已经成为容器编排领域的领导者。
kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。 新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。 容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。
Kubernetes 是什么
Kubernetes 提供了很多的功能,它可以简化应用程序的工作流,加快开发速度。通常,一个成功的应用编排系统需要有较强的自动化能力,这也是为什么 Kubernetes 被设计作为构建组件和工具的生态系统平台,以便更轻松地部署、扩展和管理应用程序。
用户可以使用 Label 以自己的方式组织管理资源,还可以使用 Annotation 来自定义资源的描述信息,比如为管理工具提供状态检查等。
此外,Kubernetes 控制器也是构建在跟开发人员和用户使用的相同的 API 之上。用户可以编写自己的控制器和调度器,也可以通过各种插件机制扩展系统的功能。这种设计使得用户可以方便地在 Kubernetes 之上构建各种应用系统。
Kubernetes 不是什么
Kubernetes 不是一个传统意义上,包罗万象的 PaaS (平台即服务) 系统。它给用户预留了选择的自由。
不限制支持的应用程序类型,它不插手应用程序框架, 也不限制支持的语言 (如 Java, Python, Ruby 等),Kubernetes 旨在支持极其多样化的工作负载,包括无状态、有状态和数据处理工作负载。只要应用可以在容器中运行,那么它就可以很好地在 Kubernetes 上运行。 不提供内置的中间件 (如消息中间件)、数据处理框架 (如 Spark)、数据库 (如 mysql) 或集群存储系统 (如 Ceph) 等。这些应用直接运行在 Kubernetes 之上。 不提供点击即部署的服务市场。 不直接部署代码,也不会构建用户的应用程序,但用户可以在 Kubernetes 之上构建需要的持续集成 (CI) 工作流。 允许用户选择自己的日志、监控和告警系统。 不提供应用程序配置语言或系统 (如 jsonnet)。 不提供机器配置、维护、管理或自愈系统。 另外,已经有很多 PaaS 系统运行在 Kubernetes 之上,如 Openshift, Deis 和 Eldarion 等。 你也可以构建自己的 PaaS 系统,或者只使用 Kubernetes 管理你的容器应用。
当然了,Kubernetes 不仅仅是一个 “编排系统”,它消除了编排的需要。Kubernetes 通过声明式的 API 和一系列独立、可组合的控制器保证了应用总是在期望的状态,而用户并不需要关心中间状态是如何转换的。这使得整个系统更容易使用,而且更强大、更可靠、更具弹性和可扩展性。