2.你希望使用的服務(wù)在另一個(gè)區(qū)域或云中,但想要使用這些服務(wù),你需要轉(zhuǎn)移應(yīng)用程序和數(shù)據(jù)。
3.硬件到期,需要升級(jí)硬件到下一代,而新硬件的計(jì)算的規(guī)格、要求以及內(nèi)存容量都已經(jīng)發(fā)生了變化,這就導(dǎo)致了遷移的必要性。
4.集群資源受限并且進(jìn)行擴(kuò)展instance的成本越來(lái)越高,因此你需要采用新的集群架構(gòu),這樣的集群需要使用網(wǎng)絡(luò)附加的塊存儲(chǔ)而非本地磁盤,這樣才能夠?qū)⒋鎯?chǔ)獨(dú)立于計(jì)算進(jìn)行擴(kuò)展。
5.開(kāi)發(fā)人員希望將工作負(fù)載轉(zhuǎn)移到一個(gè)具有不同的硬件、網(wǎng)絡(luò)、操作系統(tǒng)或其他配置的集群進(jìn)行測(cè)試或分級(jí)。
上述所列原因并不詳盡,但也說(shuō)明在許多條件下擴(kuò)充Kubernetes環(huán)境和將工作負(fù)載從一個(gè)集群遷移到另一個(gè)集群是有必要的。這個(gè)問(wèn)題在涉及無(wú)狀態(tài)應(yīng)用時(shí)較為簡(jiǎn)單,但對(duì)于有狀態(tài)的服務(wù),如數(shù)據(jù)庫(kù)、隊(duì)列、關(guān)鍵存儲(chǔ)、大數(shù)據(jù)以及機(jī)器學(xué)習(xí)應(yīng)用時(shí)等時(shí),你就必須將數(shù)據(jù)轉(zhuǎn)移到新的、擴(kuò)容的環(huán)境中去,然后應(yīng)用程序設(shè)計(jì)才能加速運(yùn)行。
解決數(shù)據(jù)移動(dòng)性問(wèn)題:PX-Enterprise?新功能
PX-Motion不僅具有對(duì)數(shù)據(jù)進(jìn)行跨環(huán)境轉(zhuǎn)移的能力,它還能夠?qū)?yīng)用程序配置以及相關(guān)的有狀態(tài)的資源,如PV(永久卷)等進(jìn)行轉(zhuǎn)移,使得操作團(tuán)隊(duì)能夠非常方便地將一個(gè)卷、一個(gè)Kubernetes名字空間、或整個(gè)Kubernetes集群在環(huán)境之間進(jìn)行轉(zhuǎn)移,即便其中存在永久數(shù)據(jù)。
本文將對(duì)PX-Motion的功能與能力進(jìn)行探討。同時(shí),我們將演示如何將一個(gè)Kubernetes命名空間以及其中運(yùn)行的所有應(yīng)用程序轉(zhuǎn)移到一個(gè)具有資源拓展能力的新的Kubernetes集群上。在這個(gè)演示中,集群1表示資源已經(jīng)過(guò)度利用的、不靈活的,已經(jīng)無(wú)法滿足我們不斷增長(zhǎng)的應(yīng)用程序需求的集群。集群2表示一個(gè)更加靈活且可擴(kuò)展的集群,我們將把工作負(fù)載轉(zhuǎn)移到這個(gè)集群2上。
除了在集群之間進(jìn)行整個(gè)Kubernetes命名空間的轉(zhuǎn)移之外,我們還將展示如何將配置在集群1中使用本地存儲(chǔ)的應(yīng)用程序,遷移到使用網(wǎng)絡(luò)附加的塊存儲(chǔ)的集群2中。
通過(guò)這種方式,你將看到我們需要轉(zhuǎn)移真正的數(shù)據(jù),而不是通過(guò)管理塊設(shè)備映射這種小伎倆來(lái)實(shí)現(xiàn)的。
總的來(lái)說(shuō),在將一個(gè)有狀態(tài)的Kubernetes應(yīng)用程序轉(zhuǎn)移到另一個(gè)集群時(shí),你需要:
將這兩個(gè)集群進(jìn)行配對(duì),從而指定一個(gè)目標(biāo)集群和一個(gè)目的集群;
使用PX-Motion開(kāi)始遷移,其中包括移動(dòng)數(shù)據(jù)卷和配置;
數(shù)據(jù)和配置遷移完成后,Kubernetes會(huì)自動(dòng)將應(yīng)用程序部署到新的環(huán)境中。
我們開(kāi)始吧!
配置與設(shè)置
在展示中,我們使用google Kubernetes Engine (GKE)作為Kubernetes集群,但你也可以在任意的Kubernetes集群中進(jìn)行如下的操作。使用Portworx installer online spec generator獲得的DaemonSet Spec, 將Portworx安裝到各個(gè)集群上。逐步完成安裝,Portworx安裝過(guò)程在此不作贅述,可以查看portworx.com上的文檔了解如何在Kubernetes上安裝Portworx 。環(huán)境架構(gòu)示意圖如下。注意集群1和集群2的如下方面:
Cluster 1 (Source)
n1-standard-2
local-ssd
Cluster 2 (Destination)
n1-standard-8
provisioned PDs
在這種情況下,第一個(gè)集群(集群1)資源面臨限制,操作團(tuán)隊(duì)希望從本地SSD轉(zhuǎn)移到更大instance的自動(dòng)配置的永久磁盤(PD)中。
為什么?本地SSD在處理特定工作負(fù)載時(shí)較為有效,但其自身也存在著局限性,這也是我們?cè)谶@里討論將應(yīng)用程序從一個(gè)命名空間轉(zhuǎn)移到另一個(gè)命名空間的原因所在。依照谷歌的描述,本地SSD的限制包括:
“由于本地SSD是以物理方式附加到節(jié)點(diǎn)的虛擬機(jī)instance上的,其中存儲(chǔ)的所有數(shù)據(jù)都只存在于這個(gè)節(jié)點(diǎn)上。而由于數(shù)據(jù)是本地存儲(chǔ)的,因此你的應(yīng)用必須要能夠面對(duì)數(shù)據(jù)不可用的情況。”
“存儲(chǔ)在SSD的數(shù)據(jù)是短期性的。向本地SSD寫入內(nèi)容的Pod會(huì)在被調(diào)度離開(kāi)這一節(jié)點(diǎn)時(shí)失去對(duì)磁盤中存儲(chǔ)的數(shù)據(jù)進(jìn)行訪問(wèn)的能力。” 此外,如果節(jié)點(diǎn)被撤銷、升級(jí)或維修,則數(shù)據(jù)就會(huì)被擦除。
“我們并不能向現(xiàn)有的節(jié)點(diǎn)池添加本地SSD。”
Portworx能夠克服對(duì)上述部分限制,因?yàn)樗軌驅(qū)?shù)據(jù)復(fù)制到集群中的其他提供高可用的主機(jī)上。但如果我們希望在不對(duì)計(jì)算按比例進(jìn)行擴(kuò)展的情況下,不斷向我們的集群添加額外的存儲(chǔ),那么使用本地存儲(chǔ)仍舊會(huì)存在一定的限制。上文所述的GKE上的第二個(gè)集群使用Portworx Disk Template,從而自動(dòng)允許Portworx從Google云對(duì)磁盤進(jìn)行管理,這比本地磁盤更加靈活一些。
第二個(gè)集群提前運(yùn)行,現(xiàn)在使用的是自動(dòng)配置的PD,可以進(jìn)行工作負(fù)載的遷移。
大量應(yīng)用程序的運(yùn)行需要更多的計(jì)算能力
源集群如下。它是由單個(gè)命名空間(NameSpace)內(nèi)運(yùn)行的大量應(yīng)用構(gòu)成的:Cassandra, Postgres,WordPress和mysql。所有的這些應(yīng)用程序都會(huì)在集群中產(chǎn)生非常高的負(fù)載。如下是demo命名空間內(nèi)運(yùn)行的應(yīng)用。注意,在單個(gè)Kubernetes集群上運(yùn)行多個(gè)命名空間是可行且常見(jiàn)的。在演示中,我們只移動(dòng)一個(gè)命名空間,讓剩余的其他命名空間繼續(xù)運(yùn)行,不做變動(dòng)。
$ kubectlconfig use-context <source-cluster>
$ kubectlget po -n demo
NAME READY STATUS RESTARTS AGE
cassandra-1-0 1/1 Running 0 17m
cassandra-1-1 1/1 Running 0 16m
cassandra-1-2 1/1 Running 0 14m
cassandra-2-0 1/1 Running 0 17m
cassandra-2-1 1/1 Running 0 16m
cassandra-2-2 1/1 Running 0 14m
Mysql-1-7f58cf8c7c-srnth 1/1 Running 0 2m
MYSQL-2-8498757465-gqs5h 1/1 Running 0 2m
postgres-2-68c5d6b845-c4gbw 1/1 Running 0 26m
postgres-77bf94ccb5-hs7dh 1/1 Running 0 26m
wordpress-mysql-2-5fdffbdbb4-dpqm9 1/1 Running 0 17m
在某一個(gè)時(shí)間點(diǎn)上,當(dāng)添加了更多的應(yīng)用程序,如MySQL數(shù)據(jù)庫(kù)時(shí),這個(gè)集群就會(huì)遭遇其內(nèi)存限制并出現(xiàn)“OutOfmemory”等錯(cuò)誤,見(jiàn)如下。為解決這個(gè)問(wèn)題,我們將demo這個(gè)命名空間遷移到一個(gè)新的集群上,從而為demo這個(gè)命名空間增添新的可用資源。
$ kubectlget po -n demo
NAME READY STATUS RESTARTS AGE
cassandra-1-0 1/1 Running 0 16m
cassandra-1-1 1/1 Running 0 14m
cassandra-1-2 1/1 Running 0 13m
cassandra-2-0 1/1 Running 0 16m
cassandra-2-1 1/1 Running 0 14m
cassandra-2-2 1/1 Running 0 13m
mysql-1-7f58cf8c7c-srnth 1/1 Running 0 1m
mysql-2-8498757465-gqs5h 1/1 Running 0 25s
mysql-3-859c5dc68f-2gcdj 0/1 OutOfmemory 0 10s
mysql-3-859c5dc68f-4wzmd 0/1 OutOfmemory 0 9s
mysql-3-859c5dc68f-57npr 0/1 OutOfmemory 0 11s
mysql-3-859c5dc68f-6t8fn 0/1 Terminating 0 16s
mysql-3-859c5dc68f-7hcf6 0/1 OutOfmemory 0 6s
mysql-3-859c5dc68f-7zbkh 0/1 OutOfmemory 0 5s
mysql-3-859c5dc68f-8s5k6 0/1 OutOfmemory 0 9s
mysql-3-859c5dc68f-d49nv 0/1 OutOfmemory 0 10s
mysql-3-859c5dc68f-dbtd7 0/1 OutOfmemory 0 15s
mysql-3-859c5dc68f-hwhxw 0/1 OutOfmemory 0 19s
mysql-3-859c5dc68f-rc8tg 0/1 OutOfmemory 0 12s
mysql-3-859c5dc68f-vnp9x 0/1 OutOfmemory 0 18s
mysql-3-859c5dc68f-xhgbx 0/1 OutOfmemory 0 12s
mysql-3-859c5dc68f-zj945 0/1 OutOfmemory 0 14s
postgres-2-68c5d6b845-c4gbw 1/1 Running 0 24m
postgres-77bf94ccb5-hs7dh 1/1 Running 0 24m
wordpress-mysql-2-5fdffbdbb4-dpqm9 1/1 Running 0 16m
除PX-Motion之外,最新發(fā)布的PX-Enterprise也包含了PX-Central?,這是一個(gè)用于監(jiān)視、數(shù)據(jù)分析和管理的界面,能夠?qū)rafana、Prometheus和Alertmanager進(jìn)行配置。這些儀表板會(huì)對(duì)卷、集群、etcd以及其他內(nèi)容進(jìn)行監(jiān)控。在本文所討論的情況下,查看集群級(jí)儀表盤,就能夠了解資源方面的問(wèn)題。
如下所示的PX-Central截屏展示了該集群正在使用的內(nèi)存和CPU的情況。該集群的高CPU和內(nèi)存占用率為擴(kuò)展帶來(lái)了問(wèn)題,并且由于集群存在過(guò)載問(wèn)題,很有可能導(dǎo)致上文所述的“OutOfMemory(內(nèi)存不足)”的問(wèn)題。
使用PX-Motion遷移一個(gè)Kubernetes命名空間,包括其數(shù)據(jù)。
既然已經(jīng)找到了問(wèn)題,現(xiàn)在我們來(lái)使用PX-Motion將數(shù)據(jù)遷移到新的集群上。首先,我們將兩個(gè)GKE集群配對(duì)起來(lái),實(shí)現(xiàn)源集群和目標(biāo)集群之間的遷移連接。集群的配對(duì)和藍(lán)牙播放器與手機(jī)的配對(duì)類似。配對(duì)過(guò)程是為了將兩個(gè)不同的設(shè)備連接起來(lái)。
前提條件
如果你正在嘗試PX-Migration,請(qǐng)確認(rèn)已經(jīng)滿足所有的前提條件。
為了將工作負(fù)載從集群1遷移到集群2,我們需要對(duì)PX-Motion進(jìn)行配置。首先要做的是配置目標(biāo)集群。為實(shí)現(xiàn)這一點(diǎn),首先建立對(duì)于pxctl (“pixie-cuttle”)的訪問(wèn),即Portworx CLI。如下是pxctl在具有kubectl訪問(wèn)的情況下在工作站的運(yùn)作情況。
$ kubectl config use-context <destination-cluster>
$PX_POD_DEST_CLUSTER=$(kubectl get pods –context
<DESTINATION_CLUSTER_CONTEXT> -lname=portworx -n kube-system
-o jsonpath=\\\'{.items[0].metadata.name}’)
$ aliaspxctl_dst=”kubectl exec $PX_POD_DEST_CLUSTER
–context <DESTINATION_CLUSTER_CONTEXT>\\\\
-n kube-system /opt/pwx/bin/pxctl”
下一步,對(duì)目標(biāo)集群進(jìn)行設(shè)置使其準(zhǔn)備好與來(lái)源集群進(jìn)行配對(duì)。目標(biāo)集群應(yīng)當(dāng)首先運(yùn)行Portworx objectstore。我們需要在目標(biāo)集群上設(shè)置一個(gè)對(duì)象存儲(chǔ)端點(diǎn),為數(shù)據(jù)在遷移過(guò)程中進(jìn)行分級(jí)的位置。然后,為來(lái)源集群創(chuàng)建一個(gè)token在配對(duì)過(guò)程中使用。
$pxctl_dst — volume create –size 100 objectstore
$ pxctl_dst– objectstore create -v objectstore
$pxctl_dst — cluster token show
Token is<UUID>
現(xiàn)在可以創(chuàng)建一個(gè)集群配對(duì)YAML配置文檔,從而應(yīng)用到來(lái)源Kubernetes集群中去。這個(gè)clusterpair.yaml文檔將包含如何與目標(biāo)集群調(diào)度程序和Portworx存儲(chǔ)進(jìn)行驗(yàn)證的信息。運(yùn)行如下命令并編輯YAML文檔即可建立集群配對(duì):
$ storkctlgenerate clusterpair –context <destination-cluster> > clusterpair.yaml
說(shuō)明:你可以用你自己的名稱替換“metadata.name”。
說(shuō)明:在如下示例中,options.token可以使用通過(guò)上述“cluster token show”命令生成的令牌。
說(shuō)明:在如下示例中,對(duì)于options.ip,將需要一個(gè)可訪問(wèn)的負(fù)載均衡或Portworx節(jié)點(diǎn)的IP或dns,來(lái)訪問(wèn)9001和9010端口。
在使用GKE時(shí),在應(yīng)用到集群之前,我們需要向Stork添加許可。Strok是由PX-Enterprise使用的Kubernetes的OSS智能調(diào)度程序擴(kuò)展和遷移工具,同時(shí)我們還需要知道如何對(duì)新集群進(jìn)行驗(yàn)證,從而對(duì)應(yīng)用程序進(jìn)行遷移。首先,使用谷歌云指令生成服務(wù)賬戶。然后,對(duì)Stork部署和驗(yàn)證進(jìn)行編輯,從而確保其能夠訪問(wèn)目標(biāo)集群。指令請(qǐng)見(jiàn)如下。
下一步,應(yīng)用這個(gè)集群并使用kubectl與來(lái)源集群進(jìn)行配對(duì)。
$ kubectl config use-context <source-cluster>
$ kubectlcreate -f clusterpair.yaml
應(yīng)用完成后,使用已經(jīng)設(shè)置的storkctl檢查集群配對(duì)的狀態(tài)。
$ storkctlget clusterpair
kubectl和pxctl也可以對(duì)集群配對(duì)進(jìn)行查看。
$ kubectldescribe clusterpair new-cluster | grep paired
Normal Ready 2m stork Storage successfully paired
Normal Ready 2m stork Scheduler successfullypaired
$ pxctlcluster pair list
CLUSTER-ID NAME ENDPOINT CREDENTIAL-ID
c604c669 px-cluster-2 http://35.185.59.99:9001 a821b2e2-788f
開(kāi)始遷移
下一步,有兩種方式開(kāi)始遷移動(dòng)作:通過(guò)storkctl生成遷移 CLI,或參考對(duì)遷移進(jìn)行描述的spec文件。我們使用第二種方法,請(qǐng)見(jiàn)如下,對(duì)演示資源和卷進(jìn)行遷移。
apiVersion:stork.libopenstorage.org/v1alpha1
kind: Migration
metadata:
name: demo-ns-migration
spec:
clusterPair: new-cluster
includeResources: true
startApplications: true
namespaces:
– demo
依照上述spec文檔使用kubectl創(chuàng)建遷移。
`kubectlcreate -f migration.yaml`
檢查遷移狀態(tài)。成功的遷移分為如下步驟:卷→應(yīng)用程序→完成
$ storkctlget migration
NAME CLUSTERPAIR STAGE STATUS VOLUMES RESOURCES CREATED
demo-ns-migration new-cluster Volumes InProgress 2/12 0/37 08 Nov 18 15:14 EST
$ storkctlget migration
NAME CLUSTERPAIR STAGE STATUS VOLUMES RESOURCES CREATED
demo-ns-migration new-cluster Application InProgress 12/12 30/37 08 Nov18 15:25 EST
$ storkctlget migration
NAME CLUSTERPAIR STAGE STATUS VOLUMES RESOURCES CREATED
demo-ns-migration new-cluster Final Successful 12/12 37/37 08 Nov 18 15:27 EST
為了解哪些資源,如卷、PVC、狀態(tài)集、復(fù)制集處于“進(jìn)行中”或“已完成”狀態(tài),可以使用“kubectldescribe”命令。
$ kubectldescribe migration demo-ns-migration
遷移的狀態(tài)也可以使用來(lái)源Portworx集群的pxctl進(jìn)行查看。
$ pxctl –cloudmigrate status
CLUSTERUUID: c604c669-c935-4ca4-a0bc-550b236b2d7b
TASK-ID VOLUME-ID VOLUME-NAME STAGE STATUS
6cb407e0-e38e-demo-cassandra-data-1-cassandra-1-0 673298860130267347 pvc-2c2604f4-e381-11e8-a985-42010a8e0017 Done Complete
6cb407e0-e38e-demo-cassandra-data-1-cassandra-1-1 782119893844254444 pvc-7ef22f64-e382-11e8-a985-42010a8e0017 Done Complete
6cb407e0-e38e-demo-cassandra-data-1-cassandra-1-2 486611245472798631 pvc-b8af3c05-e382-11e8-a985-42010a8e0017 Done Complete
這樣根據(jù)集群遷移資源的狀態(tài)顯示,遷移完成了,如下圖示展示的就是進(jìn)行的過(guò)程。來(lái)自集群1的命名空間、應(yīng)用、配置以及數(shù)據(jù)等都遷移到集群2。
隨后,查看目標(biāo)集群以確保應(yīng)用確實(shí)已經(jīng)完成遷移并且能夠良好運(yùn)行,因?yàn)槲覀兪褂玫氖恰皊tartApplications: true”屬性。
$ kubectl config use-context<destination cluster>
$ kubectl get po -n demo
NAME READY STATUS RESTARTS AGE
cassandra-1-0 1/1 Running 0 7m
cassandra-1-1 1/1 Running 0 5m
cassandra-1-2 1/1 Running 0 4m
cassandra-2-0 1/1 Running 0 7m
cassandra-2-1 1/1 Running 0 5m
cassandra-2-2 1/1 Running 0 4m
mysql-1-7f58cf8c7c-gs8p4 1/1 Running 0 7m
mysql-2-8498757465-4gkr2 1/1 Running 0 7m
postgres-2-68c5d6b845-cs9zb 1/1 Running 0 7m
postgres-77bf94ccb5-njhx4 1/1 Running 0 7m
wordpress-mysql-2-5fdffbdbb4-ppgsl 1/1 Running 0 7m
完美! 所有的程序都在運(yùn)行中! 現(xiàn)在我們返回PX-CentralGrafana儀表板就可以看到集群上使用的內(nèi)存和CPU都變少了。該截屏顯示的是工作負(fù)載遷移后的工作節(jié)點(diǎn)的CPU和內(nèi)存使用情況。
這正是我們希望達(dá)到的效果。如下是GKE儀表板上顯示的集群1和集群2之間可用CPU和內(nèi)存的量,因此上述結(jié)果是有效的。
現(xiàn)在我們擁有了額外的計(jì)算力,我們就可以創(chuàng)建額外的MySQL數(shù)據(jù)庫(kù)了。這個(gè)數(shù)據(jù)庫(kù)將在新集群上擁有足夠的資源進(jìn)行運(yùn)行。
$ kubectlcreate -f specs-common/mysql-3.yaml
storageclass.storage.k8s.io”mysql-tester-class-3″ created
persistentvolumeclaim”mysql-data-3″ created
deployment.extensions”mysql-3″ created
$ kubectlget po -n demo
NAME READY STATUS RESTARTS AGE
cassandra-1-0 1/1 Running 0 22m
cassandra-1-1 1/1 Running 0 20m
cassandra-1-2 1/1 Running 0 18m
cassandra-2-0 1/1 Running 0 22m
cassandra-2-1 1/1 Running 0 20m
cassandra-2-2 1/1 Running 0 18m
mysql-1-7f58cf8c7c-gs8p4 1/1 Running 0 22
mysql-2-8498757465-4gkr2 1/1 Running 0 22m
mysql-3-859c5dc68f-6mcc5 1/1 Running 0 12s
postgres-2-68c5d6b845-cs9zb 1/1 Running 0 22m
postgres-77bf94ccb5-njhx4 1/1 Running 0 22m
wordpress-mysql-2-5fdffbdbb4-ppgsl 1/1 Running 0 22m
成功!
集群擴(kuò)增的益處是顯而易見(jiàn)的。用戶和操作員可以將舊的命名空間或應(yīng)用從來(lái)源集群上刪除,也可以直接將整個(gè)集群刪除掉,從而回收這些資源。新的集群使用的是自動(dòng)配置PD而非本地SSD,因此其存儲(chǔ)與計(jì)算能力都能夠依照IT團(tuán)隊(duì)的需求進(jìn)行擴(kuò)展。
結(jié)論
PX-Motion具有著將Portworx卷和Kubernetes資源在集群之間進(jìn)行遷移的能力。上述案例就利用了PX-Motion這一功能,使得團(tuán)隊(duì)能夠?qū)ubernetes環(huán)境實(shí)現(xiàn)無(wú)縫擴(kuò)增。在Kubernetes上的環(huán)境之間對(duì)命名空間、卷或整個(gè)應(yīng)用程序進(jìn)行遷移就變得輕而易舉了。擴(kuò)增并不是PX-Motion唯一的功能,請(qǐng)查看我們其他的PX-Motion系列文章了解更多信息。
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)三五互聯(lián)官網(wǎng):m.shinetop.cn