Portworx Kubemotion:在OpenShift集群間遷移有狀態(tài)應(yīng)用
Portworx是一個支撐K8S有狀態(tài)應(yīng)用的持久存儲和數(shù)據(jù)管理平臺辰晕。通過Portworx,它為有狀態(tài)應(yīng)用提供了一個單一的數(shù)據(jù)管理層舔清,從而用戶可以在任何底層架構(gòu)上運(yùn)行類似數(shù)據(jù)庫這樣的有狀態(tài)應(yīng)用。
Kubemotion是Portworx的核心功能之一曲初,發(fā)布在Portworx企業(yè)版2.0中体谒。它賦能K8S用戶在集群間遷移應(yīng)用和數(shù)據(jù)、備份和恢復(fù)臼婆、以及做藍(lán)綠部署抒痒。(https://docs.portworx.com/portworx-install-with-kubernetes/migration/kubemotion/)
下面我們介紹如何在紅帽O(jiān)penShift集群之間,遷移有狀態(tài)應(yīng)用的持久卷和相關(guān)K8S資源颁褂。
背景
在企業(yè)客戶中故响,一個常見的場景是:在一個云區(qū)域中運(yùn)行研發(fā)測試環(huán)境,而在另一個云區(qū)域中運(yùn)行生產(chǎn)環(huán)境颁独。研發(fā)測試環(huán)境通常會選擇距離開發(fā)團(tuán)隊比較近彩届,以降低網(wǎng)絡(luò)延遲,而生產(chǎn)環(huán)境則會選擇離用戶比較近誓酒。
K8S的無狀態(tài)應(yīng)用遷移相對比較容易樟蠕,但遷移有狀態(tài)應(yīng)用是一個挑戰(zhàn)。
在演示中,我們會在AWS位于美國東部(俄亥俄)寨辩,和美國西部(俄勒岡)的兩個數(shù)據(jù)中心的Openshift集群間吓懈,遷移K8S資源。美國東部區(qū)域(俄亥俄)部署的是研發(fā)測試環(huán)境靡狞,美國西部區(qū)域(俄勒岡)部署的是生產(chǎn)環(huán)境耻警。在系統(tǒng)的測試環(huán)節(jié)完成后,開發(fā)團(tuán)隊將使用Portworx和Kubemotion耍攘,把存儲卷和應(yīng)用資源,從研發(fā)測試環(huán)境畔勤,遷移到生產(chǎn)環(huán)境中蕾各。
研發(fā)測試環(huán)境和生產(chǎn)環(huán)境
我們有兩個紅帽O(jiān)penShift集群,分別是研發(fā)測試環(huán)境庆揪、以及生產(chǎn)環(huán)境式曲,位于AWS的兩個不同區(qū)域上,兩個環(huán)境都安裝了最新版本的Portworx集群缸榛,并且正在運(yùn)行吝羞。
上面的OpenShift集群代表了運(yùn)行在AWS東部區(qū)域(俄亥俄)的研發(fā)測試環(huán)境。
上面的OpenShift集群代表了運(yùn)行在AWS西部區(qū)域(俄勒岡)的生產(chǎn)環(huán)境内颗。
現(xiàn)在有一個基于LAMP的內(nèi)容管理系統(tǒng)(CMS)運(yùn)行在研發(fā)測試環(huán)境上钧排,我們需要把它遷移到生產(chǎn)環(huán)境里。
研發(fā)測試環(huán)境里部署了MySQL和WordPress均澳,它們都位于CMS命名空間里恨溜。
關(guān)于如何在OpenShift上配置高可用的WordPress,可以參考這里的文檔找前。(https://www.portworx.com/run-multi-tenant-ha-wordpress-platform-red-hat-openshift/)
Portworx存儲集群支撐了附加在這些Pod上的持久卷糟袁。
下面的卷附加到了MySQL pod上。
對于WordPress CMS, 有個共享的Portworx卷附加到了Pod上躺盛。
配置好的應(yīng)用项戴,可以通過WordPress相關(guān)的服務(wù)來訪問。
準(zhǔn)備源環(huán)境和目標(biāo)環(huán)境
在我們遷移之前槽惫,我們需要配置源集群和目標(biāo)集群周叮。按照下面的步驟來準(zhǔn)備相關(guān)的環(huán)境。
創(chuàng)建對象存儲的訪問身份驗(yàn)證我們需要在源集群和目標(biāo)集群上都創(chuàng)建對象存儲的訪問身份驗(yàn)證信息界斜。我們需要獲得目標(biāo)集群的UUID则吟,它會被附加在訪問身份的名稱上。
為了完成這一步锄蹂,你需要AWS賬戶的訪問密鑰和Secret密鑰氓仲。如果你已經(jīng)配置好了AWS CLI,可以在這里發(fā)現(xiàn)這些密鑰。~/.aws/credentials
回到生產(chǎn)環(huán)境集群敬扛,運(yùn)行下面的命令來復(fù)制UUID晰洒。
PX_POD=$(oc get pods -l name=portworx -n kube-system -o jsonpath='{.items[0].metadata.name}')oc -n=kube-system exec $PX_POD -- /opt/pwx/bin/pxctl status
記下集群的UUID,放在一個安全的地方啥箭。
我們在生產(chǎn)環(huán)境內(nèi)谍珊,來創(chuàng)建生產(chǎn)環(huán)境集群的身份驗(yàn)證信息。
oc -n=kube-system exec $PX_POD -- /opt/pwx/bin/pxctl credentials create \
--provider s3 \
--s3-access-key? \
--s3-secret-key? \
--s3-region ap-southeast-1? \
--s3-endpoint s3.ap-southeast-1.amazonaws.com clusterPair_c02528e3-30b1-43e7-91c0-c26c111d57b3
確保身份驗(yàn)證信息的名稱按照這樣的格式:‘clusterPair_UUID’急侥。
回到研發(fā)測試集群砌滞,重復(fù)操作來創(chuàng)建身份驗(yàn)證信息。
獲取目標(biāo)集群的Token
下一步是獲取生產(chǎn)環(huán)境集群的Token坏怪,它會被用來創(chuàng)建集群配對的YAML文件贝润。
到生產(chǎn)環(huán)境集群,運(yùn)行下面的命令來訪問Token铝宵。
PX_POD=$(oc get pods -l name=portworx -n kube-system -o jsonpath='{.items[0].metadata.name}')oc -n=kube-system exec $PX_POD -- /opt/pwx/bin/pxctl cluster token show
記下集群Token打掘,放置在一個安全的地方。
為Portworx服務(wù)獲取負(fù)載均衡的端點(diǎn)
我們還需要生產(chǎn)環(huán)境集群上的鹏秋,與Portworx服務(wù)關(guān)聯(lián)的負(fù)載均衡的DNS名稱尊蚁。我們可以通過下面的命令得到。
oc describe svc portworx-service -n kube-system
到這里侣夷,你已經(jīng)準(zhǔn)備好下面的數(shù)據(jù)了:
1.???目標(biāo)集群的Token
2.???指向Portworx服務(wù)的負(fù)載均衡的CNAME
創(chuàng)建集群配對參數(shù)
我們從生產(chǎn)環(huán)境(目標(biāo)集群)來創(chuàng)建YAML文件横朋。并且把它應(yīng)用到研發(fā)測試環(huán)境(源集群)。
確保你在在生產(chǎn)環(huán)境中百拓,運(yùn)行下面的命令叶撒。
storkctl generate clusterpair -n cms prodcluster > clusterpair.yaml
打開clusterpair.yaml,在選項中增加下面的細(xì)節(jié)信息耐版。它們反映了目標(biāo)集群里的負(fù)載均衡的IP地址或者DNS名稱祠够,以及與目標(biāo)集群關(guān)聯(lián)的Token。
為Kubemotion進(jìn)行集群配對
通過為源集群配置配對參數(shù)粪牲,我們可以把集群進(jìn)行配對古瓤。
我們回到源集群(研發(fā)測試環(huán)境),來進(jìn)行集群配對腺阳。
oc apply -f clusterpair.yaml
oc get clusterpair -n cms
<pre>oc getclusterpairs</pre> 的輸出確認(rèn)了配對已經(jīng)成功落君。
驗(yàn)證配對狀態(tài)
我們可以通過storkctlCLI來驗(yàn)證配對狀態(tài)。確保存儲的狀態(tài)亭引,和調(diào)度器的狀態(tài)都是正常绎速,沒有錯誤。
storkctl -n=cms get clusterpair
我們驗(yàn)證了焙蚓,源集群和目標(biāo)集群已經(jīng)配對成功纹冤。
現(xiàn)在我們開始遷移洒宝。
從源集群向目標(biāo)集群遷移CMS應(yīng)用
在研發(fā)測試環(huán)境下,通過下面的步驟開始CMS應(yīng)用的遷移萌京。
開始遷移
用下面的內(nèi)容創(chuàng)建一個名為migration.yaml的YAML文件雁歌。
apiVersion: stork.libopenstorage.org/v1alpha1
kind: Migrationmetadata:? name: cmsmigration
? namespace: cms
spec:? # This should be the name of the cluster pair created above? clusterPair: prodcluster
? # If set to false this will migrate only the Portworx volumes. No PVCs, apps, etc will be migrated? includeResources: true? # If set to false, the deployments and stateful set replicas will be set to 0 on the destination.? # There will be an annotation with "stork.openstorage.org/migrationReplicas" on the destinationto store the replica count from the source.? startApplications: true? # List of namespaces to migrate? namespaces:? - cms
這里包括一些很重要的信息,例如集群配對的名稱知残、遷移中包括的命名空間靠瞎,需要被遷移的資源類型。
把YAML文件提交到研發(fā)測試集群求妹,來開始遷移乏盐。
oc apply -f migration.yaml
migration.stork.libopenstorage.org/cmsmigration created
監(jiān)控遷移的過程
使用storkctl我們來監(jiān)控遷移的過程。
storkctl get migration -n cms
一旦遷移完成制恍,storkctl會報告最后遷移到目標(biāo)集群的卷的數(shù)量以及資源父能。
通過下面的命令,可以得到遷移過程的詳細(xì)信息吧趣。
oc describe migration cmsmigration -n=cms% oc describe migration cmsmigration -n=cmsName:? ? ? ? cmsmigrationNamespace:? ? cmsLabels:Annotations:? kubectl.kubernetes.io/last-applied-configuration:? ? ? ? ? ? ? ? {"apiVersion":"stork.libopenstorage.org/v1alpha1","kind":"Migration","metadata":{"annotations":{},"name":"cmsmigration","namespace":"cms"}...API Version:? stork.libopenstorage.org/v1alpha1Kind:? ? ? ? MigrationMetadata:? Creation Timestamp:? 2019-11-08T02:33:44Z? Generation:? ? ? ? ? 9? Resource Version:? ? 346702? Self Link:? ? ? ? ? /apis/stork.libopenstorage.org/v1alpha1/namespaces/cms/migrations/cmsmigration
? UID:? ? ? ? ? ? ? ? 2eeb5d56-01d0-11ea-a393-02fec625b80aSpec:? Admin Cluster Pair:? Cluster Pair:? ? ? ? prodcluster
? Include Resources:? true? Include Volumes:? ? true? Namespaces:? ? cms
? Post Exec Rule:? Pre Exec Rule:? Selectors:? Start Applications:? trueStatus:? Finish Timestamp:? 2019-11-08T02:34:56Z? Resources:? ? Group:? ? ? core
? ? Kind:? ? ? PersistentVolume? ? Name:? ? ? pvc-ac60362f-0170-11ea-8418-06c5879a6a7a? ? Namespace:? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? core
? ? Kind:? ? ? PersistentVolume? ? Name:? ? ? pvc-c5dd1955-0170-11ea-a393-02fec625b80a? ? Namespace:? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? core
? ? Kind:? ? ? Service? ? Name:? ? ? mysql
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? core
? ? Kind:? ? ? Service? ? Name:? ? ? wordpress
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? core
? ? Kind:? ? ? PersistentVolumeClaim? ? Name:? ? ? px-mysql-pvc
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? core
? ? Kind:? ? ? PersistentVolumeClaim? ? Name:? ? ? px-wp-pvc
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? apps
? ? Kind:? ? ? Deployment? ? Name:? ? ? mysql
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? apps
? ? Kind:? ? ? Deployment? ? Name:? ? ? wordpress
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? ? Group:? ? ? route.openshift.io
? ? Kind:? ? ? Route? ? Name:? ? ? wp
? ? Namespace:? cms
? ? Reason:? ? Resource migrated successfully
? ? Status:? ? Successful? ? Version:? ? v1
? Stage:? ? ? ? Final? Status:? ? ? Successful? Volumes:? ? Namespace:? ? ? ? ? ? ? ? cms
? ? Persistent Volume Claim:? px-mysql-pvc
? ? Reason:? ? ? ? ? ? ? ? ? Migration successful for volume
? ? Status:? ? ? ? ? ? ? ? ? Successful? ? Volume:? ? ? ? ? ? ? ? ? pvc-ac60362f-0170-11ea-8418-06c5879a6a7a? ? Namespace:? ? ? ? ? ? ? ? cms
? ? Persistent Volume Claim:? px-wp-pvc
? ? Reason:? ? ? ? ? ? ? ? ? Migration successful for volume
? ? Status:? ? ? ? ? ? ? ? ? Successful? ? Volume:? ? ? ? ? ? ? ? ? pvc-c5dd1955-0170-11ea-a393-02fec625b80aEvents:? Type? ? Reason? ? ? Age? ? ? ? ? ? ? ? From? Message? ----? ? ------? ? ? ----? ? ? ? ? ? ? ----? -------? Normal? Successful? 82s? ? ? ? ? ? ? ? stork? Volume pvc-ac60362f-0170-11ea-8418-06c5879a6a7a migrated successfully
? Normal? Successful? 82s? ? ? ? ? ? ? ? stork? Volume pvc-c5dd1955-0170-11ea-a393-02fec625b80a migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? /v1, Kind=PersistentVolume /pvc-ac60362f-0170-11ea-8418-06c5879a6a7a: Resource migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? /v1, Kind=PersistentVolume /pvc-c5dd1955-0170-11ea-a393-02fec625b80a: Resource migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? /v1, Kind=Service cms/mysql: Resource migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? /v1, Kind=Service cms/wordpress: Resource migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? /v1, Kind=PersistentVolumeClaim cms/px-mysql-pvc: Resource migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? /v1, Kind=PersistentVolumeClaim cms/px-wp-pvc: Resource migrated successfully
? Normal? Successful? 78s? ? ? ? ? ? ? ? stork? apps/v1, Kind=Deployment cms/mysql: Resource migrated successfully
? Normal? Successful? 77s (x2 over 78s)? stork? (combined from similar events): route.openshift.io/v1, Kind=Route cms/wp: Resource migrated successfully
在生產(chǎn)環(huán)境上驗(yàn)證遷移
回到生產(chǎn)環(huán)境法竞,我們來檢查CMS命名空間里的所有資源耙厚。
oc get all -n cms
你可以通過為WordPress Pod使用port-forwardding强挫,來訪問應(yīng)用。
小結(jié)
Kubemotion為有狀態(tài)應(yīng)用增加了遷移功能薛躬。它可以在本地環(huán)境和云環(huán)境之間俯渤,以及多云環(huán)境之間,無縫的遷移卷型宝。