PuppetConf2016。面向系统管理员的Kubernetes。第1部分

我是一名与计算机打交道的系统管理员,今天我们将讨论Kubernetes。我将尝试更深入地研究该主题,考虑系统管理员可以使用此应用程序解决的问题,并且还涉及Puppet操作的某些方面,借助新的一组抽象使应用程序可以工作,Puppet操作似乎适合这个世界。
五六年前,Luis Andre Barroso和Urs Hoesl在“数据中心作为计算机”一文中建议,我们应该将数据中心视为一台大型计算机。有必要从数据中心由独立的机器组成这一事实中抽象出来,并将其视为一个逻辑实体。一旦您尝试在实践中使用此想法,就可以将构建分布式系统和分布式计算的原理应用于数据中心。



为了将数据中心视为计算机,您需要一个操作系统。它看起来与在另一台计算机上使用的计算机非常相似,但是必须具有不同的界面,因为您不需要访问另一台计算机,也不需要访问内核。因此,让我们将数据中心视为一台大型计算机。今天,我将告诉您如果您似乎无法使用SSH控制任何计算机,该怎么办。您将无法登录,尽管有些人认为没有此权限就无法控制系统,但我将告诉您使用Kubernetes可以完成多少工作。首先,您应该将Kubernetes视为构建分布式平台的框架。



这并不意味着下载Kubernetes之后,您将获得一个用户界面,该界面将为您提供您要使用该系统进行的所有操作。不,这只是创建运行基础架构所需工具的基础。我将向您展示如何使用Let's Encrypt证书颁发机构创建集成,从而为使用Kubernetes作为框架的应用程序自动化证书过程。



许多人确切地问Kubernetes有什么用。我在Puppet Labs工作了很多年,发现此东西已安装在计算机上,以便为系统提供迄今为止尚不存在的API。代替Bash,YAML脚本和类似的东西,Puppet提供了一个DSL用户,该用户允许他以编程方式与计算机进行交互,而无需外壳脚本。 Kubernetes之间的区别在于它位于“铁”之上。让我们不仅关注该系统的自动化和抽象,而关注我们将从任何节点提取的基础架构和应用程序之间的关系或合同。在Kubernetes中,我们不为计算机分配任何应用程序,不存在“节点清单”之类的东西,调度程序仅将单个节点视为数据中心资源,代表一台大型计算机。

问题:“ Kubernetes是否可以在OpenStack,VMware,Bare Metal和云中运行?”没道理正确的问题是:“我可以运行Kubernetes代理来检索这些资源吗?”答案是“是”。因为此应用程序的操作完全独立于您选择的平台。



Kubernetes是平台无关的。 Kubernetes的声明方式与Puppet相同。因此,您要报告要为哪个应用程序使用它-在本示例中为nginx。这是您,开发人员和Kubernetes之间的合同,是创建容器映像的一种方式。

我喜欢与FedEx快递公司进行类比-您不能将它们拖到整个车厢中,而是等到它们全部分类并发送到应有的位置。他们有一个规则:将您的东西装在一个盒子里。完成操作后,他们将发送您的盒子,并能够告知盒子何时到达目的地。 “如果没有盒子,那么您将无法使用我们的系统。”

因此,在使用容器时,讨论您所拥有的内容(Python,Java等)没什么用,没关系-只需获取所有依赖项并将它们放入容器中即可。许多人谈到容器,他们似乎解决了整个基础设施的问题。但是,问题在于人们不会将容器理解为真实的两种不同事物。首先是包装格式的思想,其次是容器运行时的思想。这是两个不同的事物,不一定需要相同的工具。

哪个在场的人创造了容器?谁在使用Puppet来构建容器?是的,我也不同意!您可以说:“如何?您正在参加人偶会议,您必须同意!”我不同意在Puppet中构建容器的想法是因为:我根本不知道是否需要它,因为创建图像所需的内容与启动生产过程所需的内容有所不同。

让我们将其视为构建软件管道并查看此Dockerfile。对那些从未看过这些文件的人闭上眼睛,因为对您来说,它们看起来令人生畏。该文件显示了如何创建Ruby on Rails应用程序-具有Rails框架的Ruby应用程序。



它说``FROM ruby​​ 2.3.1'',它可能会将整个操作系统插入容器中,在这种情况下是基本的alpine-linux Ruby映像。有谁知道为什么我们在这些容器中嵌入Ubuntu或Red Hat映像?大多数人不知道什么是依赖项,而是使用偶然的方法,只是将整个操作系统填充到一个容器中,以确保他们的依赖项位于内部。因此,构建完此东西后,只需运行一次。这就是误解的根源:如果这件事不起作用,请更改代码行,直到它起作用为止。只是检查!您不需要对这些文件太过精打细算,您的目标是建立具有所有依赖关系的应用程序的脱机表示。这只是我们从Ubuntu使用的拐杖。

如果您刚刚创建并启动了应用程序,则将使用静态链接之类的内容。没有对主机的依赖,在您的容器中,您只有一个单行Docker文件的二进制文件,并且没有基本映像。实际上,这只是平常事物的转移。查看该程序集的外观。



我以前创建了此文件,但通常看起来像是尝试构建整个Internet。我对此大会有点害怕,因为我不确定本地Internet是否可以处理Ruby。看看发生了什么。



您如何看待这个1 Gig的量?而且,源文件(即您的应用程序本身)只能占用100 kB。那么,我们如何获得整个千兆字节?这是因为我们使用效率低下的工具来构建独立应用程序。它们全部设计为在计算机上运行,​​并使用从外部环境加载的动态库。

现在,我们将尝试在移动电话上做的事情-应用程序的便携式版本,您和基础架构之间要签订合同。一旦有了这样的合同,我们就可以准确地告诉系统它应该做什么,而不必关心该做什么。

您没有任何特殊的,专门创建的应用程序。我遇到的公司说:“我们有一个特殊的应用程序!”。我说:“让我们猜猜它是做什么的:它启动,绑定到端口,接收流量,对数据进行某些处理,”它们是:“哇,你怎么知道的?”我知道,因为这里没有什么特别的!

因此,我们将样本放入容器中,然后将其发送到API服务器。接下来,我们需要将其转换为可以在我们的计算机上运行的功能。但是,为了从机器上收集资源,我们需要安装几件东西:Docker文件的容器运行时,了解如何与向导进行通信以运行所有必要内容的代理,应用程序应开始工作的系统响应是什么。这个代理只是在观察-没有30秒的间隔,重复检查,没有类似的事情。他只是观察说:“如果对我有用,请让我知道,然后我将开始并将不断告知您该过程的状态”,以便您知道它是有效的。



一旦我们驾车完成,就需要一个调度程序。有多少人使用调度程序?你们都必须举手!这与问题的答案相同:“你们中的哪个人拥有一台笔记本电脑而不是单核处理器?”。确实,当我问有关计划者的问题时,大多数人都不会举手。

在计算机上启动过程时,应该选择使用哪个处理器。谁在工作?是的,核心。现在,我将向大家解释什么是规划师。最快的方法是玩俄罗斯方块。我们将讨论的第一件事是自动部署。



你们中有多少人使用了全自动部署?显然,我认为这就是为什么我们都在这里。因此,我按下按钮,砖块开始从上方掉落,现在您可以去喝啤酒了。但是请注意左右发生了什么:您的处理器和内存变成了垃圾。



发生这种情况是因为大多数人使用的计算机资源不超过5%。您可以使流程自动化,但会损失大量资金。我是一名云提供商,拥有大量的资源,但是当人们以相似的方式花钱时,这简直太糟糕了。

当您使用调度程序时,类似于Tetris,可以控制运动场并控制每个块,将其定向到正确的位置,即以最佳方式使用机器的资源。 Kubernetes为此使用了两种算法。主要算法称为Bin Packing-相同的“俄罗斯方块”将有助于理解它。 Kubernetes承担着各种形状和大小的工作量,我们的任务是以最佳方式将其包装在机器中。

我们的目标是重用随着工作的进展而可用的所有资源。并非所有工作负载都相同,因此很难将它们放在同一个盒子中。但是在Kubernetes中,当出现一小部分工作负载时(或者如果继续我们的类推,则是Tetris块),总是存在正确的集群,您可以在其中放置和运行它。与任何批处理一样,在任务完成后,我们将取回先前占用的所有资源,以便可以将其用于将来的任务。

由于我们不是生活在游戏中,而是生活在现实世界中,因此您拥有许多年前开发的解决方案。然后,您成为系统管理员,雇主向您展示了他们的产品,并且您注意到他们的部署还不够好。



您可以在部分计算机上安装集群管理器,并让它们管理某些资源。在这种情况下,您可以使用Kubernetes,随着您的前进,它会开始填补俄罗斯方块的空白。
让那些在该行业工作的人举手。是的,这是一个经典的薪水。假设您的企业中有几个问题。首先是,所有内容都是用Java甚至是COBOL编写的-通常没有人为此做好准备。

企业中经常遇到的第二个问题是Oracle DBMS。这样的事情位于软件的后部,上面说:“不要试图使任何东西自动化!”。如果您使软件自动化,您的成本将会增加。因此,没有自动化-我们正在促进我们的咨询生态系统!

通常,在这种情况下,人们会问Kubernetes是否可以简单地用于解决这些问题。我回答:“不”,因为在类似俄罗斯方块失败的情况下,没有什么可以帮助您。您需要做其他事情,即使用调度程序。
现在,我们有了一个可以成功理解工作负载的调度程序,您只需将所有内容放入框中,该调度程序便会开始工作。



让我们谈谈Kubernetes的关键实体。首先,这些是Pod豆荚,是容器的集合。在大多数情况下,一个应用程序包含多个组件。您可以为自己附加一个不用Java脚本编写的应用程序,但是您可能希望使用nginx来完成TLS并仅在应用程序的后台使用一个代理,然后将这些内容连接在一起,因为它们是硬编码的依赖项。松散耦合的依赖性是您独立扩展的数据库。



第二个重要的事情是复制控制器,它是Kubernetes集群中发生的进程的管理器。它允许您创建多个炉膛实例并监视它们的状况。

当您说要开始某个过程时,这意味着它将一直在群集中的某个位置工作。

第三个重要元素是服务,这是一组协作平台。您的部署基于对所需状态的动态确定-应用程序应在何处工作,使用哪个IP地址等,因此您需要某种形式的服务。

第四个元素是卷存储库,可以将其视为炉膛中容器可用的目录。 Kubernetes具有不同类型的卷,这些卷确定如何创建此存储以及包含的存储。卷的概念也出现在Docker中,但是问题是那里的存储仅限于特定的炉膛。一经消失,Volume就消失了。

Kubernetes创建的存储不限于任何容器。它支持在炉膛内部署的任何或所有容器。 Kubernetes Volume的主要优势在于它支持Pod可以同时使用的各种类型的存储。

让我们看看什么是容器。这是映像格式,其中包含所有依赖项的应用程序打包在一起,并且是运行时环境的主要配置,以显示此应用程序应如何工作。这是两个不同的元素,尽管您可以将任何您喜欢的东西打包到此东西中,尤其是将根文件系统打包为压缩的Tarball tar文件,其中包含特定系统的许多配置文件。



然后,我们可以执行分发,这是大家都熟悉的过程-这里使用RPM或另一个存储库系统。您将所有这些东西放到存储库中。此过程与OS软件包非常相似,仅适用于从映像创建的容器。



Pod允许您编写逻辑应用程序所需的所有内容。逻辑应用程序是用于管理同一系统概要文件中的多个应用程序的工具。子程序是一种资源包,包括一个或多个容器和存储,一个公共名称空间以及每个子程序一个IP地址。保管库可以分布在容器之间。



通常,炉膛设计类似于虚拟机。它确保应用程序将作为原子单元启动和停止。下一张幻灯片显示复制控制器的外观。如果我将此声明发送到服务器并说:“嘿,我希望Foo应用程序的一个副本可以工作!”,控制器将从模板创建它,然后将其发送到调度程序,该调度程序会将应用程序放置在节点1上。我们未指定尽管我们可以做到,但应该在哪台机器上运行。现在将副本数量增加到3。



如果其中一台机器出现故障,您希望系统采取什么措施?在这种情况下,复制控制器将使系统的当前状态达到所需状态,将其在容器下从第三台非工作机移动到第二台。



您无需深入研究并将其引导-将工作委托给控制器,您可以通过不断监视基础结构当前状态的变化并做出确保系统正常工作的决策来确保正确确保应用程序的工作。

这些事情超出了他们的时间范围-您只需要告诉系统:“我希望这三台机器都能工作!”,这就是您控制结束的地方。当您确实需要管理当前正在发生的事情以影响将来的决策时,此方法与脚本编写和纯自动化完全不同。没有能力接收传入信息以正确响应情况,就无法对所有这些进行整理。上述方法为您提供了这个机会。
您如何看待配置-服务的配置文件的概念?当涉及到容器时,很多人对此问题保持沉默,但是我们仍然需要配置,它不会在任何地方消失!

Kubernetes还使用Secrets概念,该概念用于在管理者和Nods节点之间存储和传输加密的数据。

我们从来没有在容器中运行Puppet,因为没有理由这样做。您可以使用Puppet生成配置文件,但仍希望将其存储在Kubernetis中,因为它允许您使用运行时进行分发。让我们看看它的外观。



在此示例中,我们从文件创建密钥,并将其保存在Kubernetes API服务器上。您可以想象您用Puppet之类的东西代替了这一部分,它使用eRB模板和隐藏数据来填充秘密的内容-谁来做都不重要,但是您仍然可以这样做。

一旦建立了秘密,它就可以用作创建部署的链接,该部署显示“我要使用这个秘密!”在这种情况下,Kubernetes将执行以下操作。



它创建了一个pod,从机密中获取数据,将其放入一个临时文件系统中,并将其呈现为一个容器,就像Puppet在计算机上创建一个副本一样。这遵循应用程序的生命周期,并且当应用程序死亡时,配置随之消失。如果需要10,000个应用程序实例,则需要创建并注入到10,000个以下的临时文件系统中。

服务使您可以在群集中运行所有这些元素,并将它们与另一个端点同步。实际上,服务是一组用作单个炉床的炉床。它包含一个永久性的IP地址和端口,可集成到DNS中,使用负载平衡,并在固件更改时进行更新。



现在让我们看一下Kubernetes概念组件的协作。我们有乐高积木和配置,必须彼此交互。如果您打算在集群中运行数据库,那么您确实可以在Kubernetes上运行它。许多人说您将无法在容器中运行有状态的应用程序,但这是完全错误的。

如果考虑一下虚拟机管理程序的工作原理,您可以理解它们的功能几乎与您相同:创建虚拟机,调度程序将其移至虚拟机管理程序并附加存储。有时,您使用的是来自虚拟机管理程序的本地存储,而没有理由容器不能做同样的事情。

但是,容器的问题在于,大多数人不习惯于拥有他们必须提供给应用程序的文件路径的明确列表。大多数人将无法准确告诉您数据仓库所需的设备和文件。他们将所有东西都包装在容器中,结果没有任何好处。因此,不要相信容器不能运行状态保存应用程序-您可以很好地做到这一点。



在幻灯片上,您可以看到Ruby-on-Rails的示例,在使用我们的应用程序之前,我们需要迁移数据库。让我们开始进行程序的现场演示。为了进行部署,我使用MY_SQL,您会在屏幕上看到很多数据。



我正在向您展示所有这些内容,因为作为系统管理员,您必须了解很多事情。在此部署中,我优化了应用程序的某些元数据,但主要要用灰色突出显示:我想启动mysql应用程序的1个副本,并使用mysql容器版本5.6.32。



注意,这里我从Kubernetes中选择了一些秘密作为链接,在这种情况下,我将其作为环境变量注入。稍后,当我们将它们插入文件系统时,我将向您展示另一种情况。因此,我不需要“烘烤”配置中的秘密。下一个重要的行是资源块。



在您知道方块的大小之前,您不能玩俄罗斯方块。许多人开始部署时没有在此过程中使用资源限制。结果,RAM被完全堵塞,您可以“堆叠”整个服务器。

22:09分钟

要很快继续...


一点广告:)


感谢您与我们在一起。你喜欢我们的文章吗?想看更多有趣的资料吗?通过下订单或向您的朋友推荐给开发人员的基于云的VPS,最低价格为4.99美元这是我们为您发明的入门级服务器 独特类似物:关于VPS(KVM)E5-2697 v3(6核)的全部真相10GB DDR4 480GB SSD 1Gbps从$ 19还是如何划分服务器?(RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

阿姆斯特丹的Equinix Tier IV数据中心的戴尔R730xd便宜2倍吗?在荷兰2台Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100电视戴尔R420-2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB-$ 99起!阅读有关如何构建基础设施大厦的信息。使用Dell R730xd E5-2650 v4服务器花费一欧元9000欧元的c类?

All Articles