如何在兩個OpenShift集群間遷移有狀態(tài)應(yīng)用

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)境之間,無縫的遷移卷型宝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末八匠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子趴酣,更是在濱河造成了極大的恐慌梨树,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖寞,死亡現(xiàn)場離奇詭異抡四,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仗谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門指巡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隶垮,你說我怎么就攤上這事藻雪。” “怎么了狸吞?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵勉耀,是天一觀的道長指煎。 經(jīng)常有香客問我,道長瑰排,這世上最難降的妖魔是什么贯要? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮椭住,結(jié)果婚禮上崇渗,老公的妹妹穿的比我還像新娘。我一直安慰自己京郑,他們只是感情好宅广,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著些举,像睡著了一般跟狱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上户魏,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天驶臊,我揣著相機(jī)與錄音,去河邊找鬼叼丑。 笑死关翎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸠信。 我是一名探鬼主播纵寝,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼星立!你這毒婦竟也來了爽茴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绰垂,失蹤者是張志新(化名)和其女友劉穎室奏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲装,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胧沫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酱畅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳袄。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纺酸,靈堂內(nèi)的尸體忽然破棺而出窖逗,到底是詐尸還是另有隱情,我是刑警寧澤餐蔬,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布碎紊,位于F島的核電站佑附,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仗考。R本人自食惡果不足惜音同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秃嗜。 院中可真熱鬧权均,春花似錦、人聲如沸锅锨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽必搞。三九已至必指,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恕洲,已是汗流浹背塔橡。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霜第,地道東北人葛家。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像庶诡,于是被迫代替她去往敵國和親惦银。 傳聞我的和親對象是個殘疾皇子咆课,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354