系统操作和维护
越来越多的企业选择Kubernetes作为基础设施,它可以帮助我们缩短软件项目的上市时间,降低基础设施成本,提高软件质量。由于Kubernetes相对较新,IT团队正在学习如何在生产环境中运行和维护Kubernetes上的应用程序。本文将讨论当需要额外的计算能力时,将Kubernetes应用程序迁移到另一个新的集群。
Portworx演示视频链接
当前Kubernetes集群需要扩展的一些原因。
1.集群的资源即将被完全占用,因此您需要将工作负载转移到一个具有更多计算资源的新位置。
2.你想使用的服务在另一个区域或云中,但要使用这些服务,你需要传输应用程序和数据。
3.由于硬件到期,需要将硬件升级到下一代,新硬件的计算规格、要求、内存容量都发生了变化,导致迁移的必要性。
4.集群资源有限,扩展实例的成本越来越高,需要采用新的集群架构。这样的集群需要使用连接到网络的块存储,而不是本地磁盘,以便存储可以独立于计算进行扩展。
5.开发人员希望将工作负载转移到具有不同硬件、网络、操作系统或其他配置的集群中进行测试或分级。
上面列出的原因并不详尽,但是它们也表明了在许多情况下扩展Kubernetes环境并将工作负载从一个集群迁移到另一个集群是必要的。这个问题对于无状态的应用来说很简单,但是对于有状态的服务,比如数据库、队列、关键存储、大数据和机器学习应用,你必须将数据转移到一个新的、扩展的环境中,然后应用设计可以加快操作。
解决数据移动性问题:PX-Enterprise?新功能
PX-Motion不仅能够跨环境传输数据,还可以传输应用配置和相关的有状态资源,如PV(永久卷),以便运营团队可以轻松地在环境之间传输卷、Kubernetes命名空间或整个Kubernetes集群,即使其中有永久数据。
本文将讨论PX-Motion的功能和性能。同时,我们将演示如何将一个Kubernetes名称空间和其中运行的所有应用程序转移到一个新的具有资源扩展能力的Kubernetes集群。在本演示中,群集1代表一个资源过度利用且不灵活的群集,它不再能满足我们不断增长的应用程序需求。集群2代表一个更加灵活和可伸缩的集群,我们将把工作负载转移到这个集群2。
除了在集群之间转移整个Kubernetes名称空间之外,我们还将展示如何将使用本地存储的集群1中配置的应用程序迁移到使用网络连接块存储的集群2。
通过这种方式,您将看到我们需要传输真实的数据,而不是通过管理块设备映射的技巧。
一般来说,当将有状态的Kubernetes应用程序转移到另一个集群时,您需要:
将两个集群配对以指定目标集群和目的地集群;
使用PX-Motion启动迁移,包括移动数据卷和配置;
数据和配置迁移完成后,Kubernetes会自动将应用程序部署到新环境中。
我们开始吧!
配置和设置
在演示中,我们使用google Kubernetes引擎(GKE)作为Kubernetes集群,但是您也可以在任何Kubernetes集群中执行以下操作。使用portworx安装程序在线规范生成器获取的DaemonSet规范在每个集群上安装Portworx。逐步完成安装。Portworx的安装过程在此不赘述。您可以查看portworx.com上的文档,了解如何在Kubernetes上安装Portworx。环境建筑示意图如下。请注意集群1和集群2的以下方面:
集群名称
机器类型
存储类型
群组1(来源)
n1-标准-2
本地固态硬盘
集群2(目的地)
n1-标准-8
调配的PDs
在这种情况下,第一个集群(集群1)的资源是有限的,运营团队希望从本地SSD转移到更大实例的自动配置的持久磁盘(PD)。
为什么?本地SSD在处理特定工作负载时是有效的,但它也有自己的局限性,这就是为什么我们在这里讨论应用程序从一个名称空间转移到另一个名称空间。根据谷歌的描述,本地SSD的局限性包括:
“因为本地SSD物理连接到节点的虚拟机实例,所以其中存储的所有数据只存在于此节点上。因为数据存储在本地,所以您的应用程序必须能够面对数据不可用的情况。”
“存储在SSD中的数据是短暂的。当写入本地SSD的Pod被安排离开该节点时,它将失去访问存储在磁盘中的数据的能力。此外,如果节点被取消、升级或修复,数据将被擦除。
“我们不能将本地固态硬盘添加到现有的节点池中。”
Portworx可以克服上述一些限制,因为它可以将数据复制到集群中的其他高可用性主机。然而,如果我们想在不扩大计算的情况下向集群添加额外的存储,那么在使用本地存储时仍然会有一些限制。上面提到的GKE上的第二个集群使用Portworx磁盘模板,它自动允许Portworx从Google Cloud管理磁盘,比本地磁盘更灵活。
第二个集群提前运行,现在它使用自动配置的PD,可以迁移工作负载。
运行大量应用程序需要更多的计算能力。
源集群如下。它由运行在单一名称空间中的大量应用程序组成:Cassandra、Postgres、WordPress和mysql。所有这些应用程序都会在集群中产生非常高的负载。以下是在演示命名空间中运行的应用程序。注意,在一个Kubernetes集群上运行多个名称空间是可行的,也是常见的。在演示中,我们只移动了一个名称空间,让其余的名称空间继续运行,不做任何更改。
$ kubectlconfig使用上下文源群集
$ kubectlget po -n演示
名称就绪状态重新开始老化
卡珊德拉-1-0 1/1跑0 17米
卡珊德拉-1-1 1/1跑0 16米
卡珊德拉-1-2 1/1跑0 14米
卡珊德拉-2-0 1/1跑0 17米
卡珊德拉-2-1 1/1跑0 16米
卡珊德拉-2-2 1/1跑0 14米
Mysql-1-7f58cf8c7c-srnth 1/1运行0 2m
MYSQL-2-8498757465-gqs5h 1/1运行0 2m
postgres-2-68c5d6b845-c4gbw 1/1运行0 26m
postgres-77bf94ccb5-hs7dh 1/1运行0 26m
运行0 17m的dpqm9 1/1
在某个时间点,当增加了更多的应用,比如MySQL数据库,集群就会遇到它的内存限制,出现“OutOfmemory”等错误,如下图。为了解决这个问题,我们将演示命名空间迁移到一个新的集群,从而向演示命名空间添加了新的可用资源。
$ kubectlget po -n演示
名称就绪状态重新开始老化
卡珊德拉-1-0 1/1跑0 16米
卡珊德拉-1-1 1/1跑0 14米
卡珊德拉-1-2 1/1跑0 13米
卡珊德拉-2-0 1/1跑0 16米
卡珊德拉-2-1 1/1跑0 14米
卡珊德拉-2-2 1/1跑0 13米
mysql-1-7f58cf8c7c-srnth 1/1运行0 1m
mysql-2-8498757465-gqs5h 1/1运行0 25s
MySQL-3-859 C5 DC 68 f-2g cdj 0/1 out of memory 0 10s
MySQL-3-859 C5 DC 68 f-4 wzmd 0/1 out of memory 0 9s
MySQL-3-859 C5 DC 68 f-57 NPR 0/1 out of memory 0 11s
mysql-3-859c5dc68f-6t8fn 0/1端接0 16s
MySQL-3-859 C5 DC 68 f-7hc F6 0/1 out of memory 0 6s
MySQL-3-859 C5 DC 68 f-7 zbkh 0/1 out of memory 0 5s
MySQL-3-859 C5 DC 68 f-8s5k 6 0/1 out of memory 0 9s
MySQL-3-859 C5 DC 68 f-d49nv 0/1 out of memory 0 10s
MySQL-3-859 C5 DC 68 f-dbtd 7 0/1 out of memory 0 15s
MySQL-3-859 C5 DC 68 f-hwhxw 0/1 out of memory 0 19s
MySQL-3-859 C5 DC 68 f-rc8tg 0/1 out of memory 0 12s
MySQL-3-859 C5 DC 68 f-vnp9x 0/1 out of memory 0 18s
MySQL-3-859 C5 DC 68 f-xh gbx 0/1 out of memory 0 12s
MySQL-3-859 C5 DC 68 f-ZJ 945 0/1 out of memory 0 14s
postgres-2-68c5d6b845-c4gbw 1/1运行0 24m
postgres-77bf94ccb5-hs7dh 1/1运行0 24m
运行0 16m的dpqm9 1/1
除了PX-Motion,新发布的PX-Enterprise还包括PX-Central?一个用于监控、数据分析和管理的界面,可以配置Grafana、Prometheus和Alertmanager。这些控制面板监控卷、集群等内容。在本文讨论的案例中,您可以通过查看集群级别的仪表板来了解资源问题。
下面显示的PX-Central的屏幕截图显示了集群正在使用的内存和CPU。集群的高CPU和内存占用率为扩展带来了问题,并且由于集群的过载问题,很可能导致上述的“内存不足”问题。
使用PX-Motion迁移Kubernetes名称空间,包括其数据。
现在我们已经发现了问题,让我们使用PX-Motion将数据迁移到新的集群。首先,我们将两个GKE集群配对,以实现源集群和目标集群之间的迁移连接。集群的配对类似于蓝牙播放器和手机的配对。配对过程是连接两个不同的设备。
前提
如果您正在尝试PX迁移,请确保满足所有先决条件。
为了将工作负载从集群1迁移到集群2,我们需要配置PX-Motion。首先要做的是配置目标集群。要实现这一点,首先,建立对PXCTL(“Pixie-Cuttle”)的访问,即Portworx CLI。下面是pxctl在具有kubectl访问的工作站中的操作。
$ kubectl配置使用-上下文目标-群集
$ PX _ POD _ DEST _ CLUSTER=$(ku bectl get podscontext
DESTINATION _ CLUSTER _ CONTEXT-lname=portworx-n kube-system
-o jsonpath=\\\'{。items[0].metadata.name} ')
$ aliaspxctl _ dst=" ku bectl exec $ PX _ POD _ DEST _ CLUSTER
上下文目标群集上下文\\\\
-n kube-system/opt/pwx/bin/pxctl "
接下来,将目标集群设置为准备好与源集群配对。目标集群应该首先运行Portworx objectstore。我们需要在目标集群上设置一个对象存储端点,这是在迁移期间对数据进行分级的位置。然后,为源群集创建一个令牌,以便在配对过程中使用。
$ pxctl _ dst卷创建-大小为100的对象存储
$ pxctl _ dstobjectstore create-v objectstore
$pxctl_dst —集群令牌显示
令牌isUUID
现在,您可以创建一个集群配对YAML配置文档,并将其应用到源Kubernetes集群。此clusterpair.yaml文档将包含有关如何验证目标集群调度程序和Portworx存储的信息。运行以下命令并编辑YAML文档以建立集群配对:
$ storkctlgenerate cluster pair上下文lt;目的地-集群gt。gt;clusterpair.yaml
描述:您可以用自己的名字替换“metadata.name”。
注意:在以下示例中,options.token可以使用由上述“cluster token show”命令生成的令牌。
描述:在以下示例中,对于options.ip,需要负载平衡或Portworx节点的可访问ip或dns来访问端口9001和9
使用GKE时,我们需要先向Stork添加许可证,然后再将其应用到集群。Strok是PX-Enterprise使用的Kubernetes的OSS智能调度程序扩展和迁移工具。同时,我们还需要知道如何验证新的集群,以便迁移应用程序。首先,使用Google Cloud生成服务帐户。然后,编辑Stork部署和验证,以确保它可以访问目标集群。请参见下面的说明。
接下来,应用这个集群并使用kubectl与源集群配对。
$ kubectl配置使用上下文源群集
$ kubectlcreate-f cluster pair . YAML
应用程序完成后,使用set storkctl检查集群配对的状态。
$ storkctlget集群对
Kubectl和pxctl也可以查看集群配对。
$ kubectldescribe cluster pair new-cluster | grep paired
正常就绪2m stork存储已成功配对
正常就绪2m stork调度程序已成功运行
$ pxctlcluster对列表
群集ID名称端点凭据ID
c604c 669 px-cluster-2 http://35 . 185 . 59 . 99:9001 a 821 b2e 2-788 f
开始迁移
接下来,有两种方法开始迁移:通过storkctl生成迁移CLI或参考描述迁移的规范文件。如下所示,我们使用第二种方法来迁移演示资源和卷。
API version:stork . libopenstorage . org/v1 alpha 1
种类:迁移
元数据:
名称:演示-ns-迁移
规格:
集群对:新集群
include sources:true
启动应用程序:真
命名空间:
演示
根据上面的规范文档,使用kubectl创建迁移。
` kubectlcreate -f migration.yaml '
检查迁移状态。成功的迁移分为以下几个步骤:卷应用完成。
$ storkctlget迁移
名称集群对阶段状态卷资源已创建
演示-ns迁移新群集卷正在进行中2012年0月37日08年11月18日15:14美国东部时间
$ storkctlget迁移
名称集群对阶段状态卷资源已创建
演示-ns-迁移新群集应用程序正在进行中12/12 30/37 08 Nov18 15:25 EST
$ storkctlget迁移
名称集群对阶段状态卷资源已创建
演示-ns-迁移新群集最终成功12/12 37/37 08 11/18 15:27东部时间
要了解哪些资源(如卷、PVC、状态集和复制集)处于“进行中”或“完成”状态,可以使用“kubectldescribe”命令。
$ kubectldescribe迁移演示-ns-迁移
还可以使用源Portworx集群的pxctl来查看迁移的状态。
$ pxctl云迁移状态
cluster uuid:c604c 669-c935-4c a4-a0bc-550 b 236 B2 d7b
任务ID卷ID卷名称阶段状态
6cb 407 E0-e38e-demo-Cassandra-data-1-Cassandra-1-0 673298860130267347 PVC-2c 2604 F4-e381-11e 8-a985-42010 a8e 0017完成
6cb 407 E0-e38e-demo-Cassandra-data-1-Cassandra-1-1 782119893844254444 PVC-7ef 22 f 64-e382-11e 8-a985-42010 a8e 0017完成
6cb 407 E0-e38e-demo-Cassandra-data-1-Cassandra-1-2 486611245472798631 PVC-b8 af3c 05-e382-11e 8-a985-42010 A8 e 0017完成
这样根据集群迁移资源的状态,迁移就完成了,流程如下图所示。集群1中的命名空间、应用程序、配置和数据都迁移到集群2中。
然后,检查目标集群,以确保应用程序确实已经被迁移并且可以正常运行,因为我们使用了“startApplications: true”属性。
$ kubectl配置使用-上下文目标群集
$ kubectl获取po -n演示
名称就绪状态重新开始老化