如何跨不同版本K8S,為有狀態工作負載做藍綠部署
容器的生態正在爆發!不僅僅應用層在快速變化,還有用於管理應用程式的平臺:Kubernetes,也在快速變化。這就為Ops團隊帶來了一個必須要解決的難題。 IT團隊如何才能保證一款應用程式能夠在各種不同版本的Kubernetes上都能良好執行呢?
PX-Motion演示影片:如何跨不同版本Kubernetes,為有狀態的工作負載做藍綠部署
https://v.qq.com/x/page/o3028vm9mk6.html
藍-綠部署是一種專門用於解決這一問題的技術,並能夠降低生產環境部署的過程中的停機或錯誤風險。在藍綠部署場景下,使用者需要構建兩個完全相同的生產環境(分別稱為藍與綠),這兩個環境之間僅在需要部署的新的變更方面存在差異。每一次僅啟用一個環境,兩個環境之間的資料傳輸也是部署過程的一部分。 該技術對於不含任何資料的無狀態應用非常有效,但對於資料庫這類有狀態應用則存在一定的困難,因為使用者不得不保留兩份生產資料副本。這種情況下可能會需要使用Postgres、MySQL以及其他資料庫備份和恢復指令碼,或定製化操作手冊或自動指令碼等將資料從一個資料來源人工移動到另一個資料來源,這個過程將會非常複雜並且會耗費大量的時間。
Portworx採用PX-Motion解決了有狀態應用程式的藍綠部署過程中的資料管理問題。PX-Motion使IT團隊能夠很方便地在各種環境之間進行資料和應用配置的遷移,極大地簡化了有狀態應用的藍綠部署。
本篇博文將對PX-Motion的功能與能力進行探討。具體地說, 筆者將展示如何對兩個不同版本的Kubernetes上執行的有狀態LAMP堆疊進行藍綠部署。
總結來說,我們會:
1. 將兩個Kubernetes叢集(分別稱為來源叢集和目標叢集)配對,從而使資料、配置和Pods能夠這兩個叢集之間進行轉移,這是藍綠部署的一部分。
2. 使用Kubernetes將一個LAMP堆疊部署到來源叢集上,並驗證應用程式能夠執行。
3. 使用PX-Motion可以將Kubernetes的部署、加密檔案、副本集、服務、持久卷、持久卷連線以及資料等,從來源叢集遷移到目標叢集上進行測試和驗證。在遷移完成之後,所有的Pods都能夠在來源叢集上繼續執行。現在我們已經有了兩個叢集在執行,分別是藍色和綠色。
4. 使用Kubernetes驗證我們的應用以及自身資料是否正在目標叢集上正常執行。
5. 在新叢集上的部署驗證完成之後,我們就可以更新我們的負載平衡設定,從而使所有的流量指向新叢集。此時藍綠部署就完成了。
我們開始吧!
安裝PX-Motion
前提條件
如果你正在嘗試PX-Migration,請確認已經滿足所有的前提條件()。
叢集配對首先要做的是對目標叢集進行配置。首先,建立對於 pxctl (“pixie-cuttle”)的訪問,即Portworx CLI。下面將介紹如何在可被kubectl訪問的工作站上使用pxctl。
$ kubectl config use-context <destination-cluster>
$ PX_POD_DEST_CLUSTER=$(kubectl get pods --context <DESTINATION_CLUSTER_CONTEXT> -l name=portworx -n kube-system -o jsonpath='{.items[0].metadata.name}')
$ alias pxctl_dst="kubectl exec $PX_POD_DEST_CLUSTER \ --context <DESTINATION_CLUSTER_CONTEXT> -n kube-system /opt/pwx/bin/pxctl"
下一步,對目標叢集物件儲存進行設定,使其準備好與來源叢集進行配對。我們需要在目標叢集上設定一個物件儲存端點,作為資料在遷移過程中進行分級的位置。
$ pxctl_dst -- volume create --size 100 objectstore $ pxctl_dst -- objectstore create -v objectstore $ pxctl_dst -- cluster token showToken is <UUID>
下一步,建立一個叢集配對YAML配置文件,從而對應到來源Kubernetes叢集上。這個clusterpair.yaml()文件將包含如何與目標叢集排程程式和Portworx儲存進行驗證的資訊。執行如下命令並編輯YAML文件即可建立配對:
$ storkctl generate clusterpair --context <destination-cluster> > clusterpair.yaml
1. 說明:你可以用你自己的名稱替換“ metadata.name”。
2. 說明:在如下示例中, options.token可以使用透過上述“ cluster tokenshow”命令生成的令牌。
3. 說明:在如下示例中,對於 options.ip,將需要負載均衡器或Portworx節點的IP或者DNS,這樣我們才能夠訪問9001和9010埠。
下一步,使用kubectl,將這個叢集配對應用到來源叢集上。
$ kubectl config use-context <source-cluster>
$ kubectl create -f clusterpair.yaml
在這種架構下,叢集配對透過網際網路(VPC至VPC)進行連線。這就需要確保我們的目標儲存能夠良好地與來源叢集連線。 請參照如下說明。()
1. 說明:這些步驟均是暫用措施,後續新版本的釋出後將由自動化過程取代。
2. 說明: 雲到雲、本地環境到雲、雲到本地環境,都需要類似的步驟。
如果所有步驟均操作成功,則請使用 storkctl列出叢集配對,程式將顯示 儲存和 排程程式的 Ready狀態。如果顯示 Error,則請使用 kubectl describe clusterpair,以獲取更多資訊。
$ storkctl get clusterpair NAME STORAGE-STATUS SCHEDULER-STATUS CREATED green Ready Ready 19 Nov 18 11:43 EST
$ kubectl describe clusterpair new-cluster | grep paired Normal Ready 2m stork Storage successfully paired Normal Ready 2m stork Scheduler successfully paired
pxctl也可以用於列出叢集配對。
$ pxctl_src cluster pair list CLUSTER-ID NAME ENDPOINT CREDENTIAL-ID c604c669 px-cluster-testing
我們的叢集現在已經配對成功了。
$ kubectl config use-context <1.10.3 source cluster context>
如果想要檢查當前使用的Kubernetes版本,請執行 kubectl version命令。這個命令能夠輸出當前的客戶端和伺服器版本。如下所示,伺服器版本為1.10.3。
$ kubectl version --short | awk -Fv '/Server Version: / {print "Kubernetes Version: " $3}'Kubernetes Version: 1.10.3-eks
在1.10.3上部署應用程式
在遷移工作負載時,我們需要一個來源叢集上已經存在的工作負載。在演示中,我們將使用Heptio的示例LAMP堆疊在來源叢集上建立一個LAMP堆疊(),從而在MySQL捲上使用Portworx。這個堆疊包含了一個儲存分類,包括Portworx、加密檔案、HPH網頁前端,以及一個具備Porworx卷副本的mySQL資料庫。
$ kubectl create ns lamp $ kubectl create -f . -n lamp job.batch "mysql-data-loader-with-timeout" created storageclass.storage.k8s.io "portworx-sc-repl3" created persistentvolumeclaim "database" created deployment.extensions "mysql" created service "mysql" created deployment.extensions "php-dbconnect" created service "web" created secret "mysql-credentials" created
使用kubectl對Pods進行檢索,確保其處於 Running狀態下。
$ kubectl get po -n lamp NAME READY STATUS RESTARTS AGE mysql-6f95f464b8-2sq4v 1/1 Running 0 1mmysql-data-loader-with-timeout-f2nwg 1/1 Running 0 1mphp-dbconnect-6599c648-8wnvf 1/1 Running 0 1mphp-dbconnect-6599c648-ckjqb 1/1 Running 0 1mphp-dbconnect-6599c648-qv2dj 1/1 Running 0 1m
提取 Web服務。記錄服務的 CLUSTER-IP和EXTERNAL-IP。遷移完成後,這兩個資料將會因為處於新的叢集上而發生變化。
$ kubectl get svc web -n lamp -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR web LoadBalancer 172.20.219.134 abe7c37c.amazonaws.com 80:31958/TCP 15m app=php-dbconnect
訪問端點或使用curl確認WordPress已安裝、執行正常且已連線至MySQL。
MySQL 連線
$ curl -s abe7c37c.amazonaws.com/mysql-connect.php | jq{ "outcome": true}
驗證是否也為MySQL容器建立了PVC。如下我們將看到PVC、 資料庫,各有三個副本用於部署。這個卷是MySQL的 ReadWriteOnce卷塊。
$ kubectl get pvc -n lamp NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE database Bound pvc-c572277d-ec15-11e8-9f4d-12563b3068d4 2Gi RWO portworx-sc-repl3 28m
卷資訊也可以使用pxctl進行展示。Volume list命令的輸出如下。
$ pxctl_src -- volume list ID NAME SIZE HA STATUS 618216855805459265 pvc-c572277d-ec15-11e8-9f4d-12563b3068d4 2 GiB 3 attached on 10.0.3.145
將應用程式遷移至Kubernetes 1.12.0
對本地kubectl客戶端進行配置,使其使用正在執行1.12.0的目標叢集。
$ kubectl config use-context <1.12.0 destination cluster context>
執行 kubectl Version命令,這個命令將輸出當前的客戶端和伺服器版本,如下看到執行的1.12.0。
$ kubectl version --short | awk -Fv '/Server Version: / {print "Kubernetes Version: " $3}'Kubernetes Version: 1.12.0
驗證LAMP堆疊Pods是否正在執行中。如下所示,該叢集的Namespace沒有資源,即表示遷移還未發生。
$ kubectl get poNo resources found.
下一步,使用Stork客戶端storkctl,建立一次遷移,將LAMP堆疊資源和卷從1.10.3叢集遷移到1.12.0叢集上。向 storkctl create migration的命令的輸入包括 clusterPair、 namespaces以及可選的 includeResources和 startApplications,從而將相關資源納入並在遷移完成後啟動應用程式。該命令的更多資訊請點選這裡(migration-stork/)。
$ storkctl --context <source-cluster-context> \ create migration test-app-on-1-12 \ --clusterPair green \ --namespaces lamp \ --includeResources \ --startApplicationsMigration test-app-on-1-12 created successfully
遷移建立後,使用storkctl獲取遷移狀態。
$ storkctl --context <source-cluster-context> get migration NAME CLUSTERPAIR STAGE STATUS VOLUMES RESOURCES CREATED test-app-on-1-12 green Volumes InProgress 0/1 0/7 19 Nov 18 13:47 EST
pxctl也可以用於檢視遷移狀態。卷將顯示出與遷移有關的 STAGE和 STATUS。
$ pxctl_src cloudmigrate status CLUSTER UUID: 33293033-063c-4512-8394-d85d834b3716 TASK-ID VOLUME-ID VOLUME-NAME STAGE STATUS 85d3-lamp-database 618216855805459265 pvc-c572277d-ec15-11e8-9f4d-12563b3068d4 Done Initialized
完成後,遷移將顯示 STAGE → Final和 STATUS → Successful。
$ storkctl --context <source-cluster-context> get migration NAME CLUSTERPAIR STAGE STATUS VOLUMES RESOURCES CREATED test-app-on-1-12 green Final Successful 1/1 7/7 19 Nov 18 13:47 EST
現在從目標叢集中獲得Pods。如下所示,PHP與MySQL現在都在目的叢集上執行。
$ kubectl get po -n lamp NAME READY STATUS RESTARTS AGE mysql-66d895ff69-z49jl 1/1 Running 0 11mphp-dbconnect-f756c7854-2fc2l 1/1 Running 0 11mphp-dbconnect-f756c7854-c48x8 1/1 Running 0 11mphp-dbconnect-f756c7854-h8tgh 1/1 Running 0 11m
注意 CLUSTER-IP和 EXTERNAL-IP現在已經發生了變化。這表示服務現在在新的Kubernetes 1.12叢集上執行,並且因此包含了與此前不同的子網。
$ kubectl get svc web -n lamp -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR web LoadBalancer 10.100.0.195 aacdee.amazonaws.com 80:31958/TCP 12m app=php-dbconnect
如果網站能夠在1.12.0叢集上被訪問、執行正常並且資料已經正確遷移到了1.12.0叢集,則將會返回相同的輸出內容。
Web 網頁前端
MySQL連線
$ curl -s | jq{ "outcome": true}
如下我們可以看到來源(下)和目標(上)叢集上, kubectl get po -n lamp的輸出。注意Pods的 AGE,目的叢集(上)中有最近遷移進來的LAMP堆疊。
兩個叢集在遷移後執行的是相同的程式和資料。
回顧整個過程:
1. 第一步,1.10.3 EKS叢集與1.12.0叢集配對。
2. LAMP堆疊(Linux, Apache, MySQL, PHP)部署到1.10.3叢集上。
3. 使用PX-Motion將Kubernetes部署、加密檔案、副本集、服務、持久卷、持久卷連線,以及LAMP堆疊資料遷移到1.12.0叢集上。
4. 應用程式在1.12.0叢集上被訪問,並驗證其是否正確執行。
持久卷和連線都使用PX-Motion()在各個叢集之間進行遷移,Kubernetes資源和副本都使用Portworx Stork在目標叢集上進行啟動。
現在我們擁有了兩個完全可執行的Kubernetes叢集和兩個環境,即藍色和綠色部署環境。在實際操作中,你需要在綠色叢集上進行所有測試,從而確保應用程式不會在新的叢集上發生預期之外的問題。確認測試完成之後,將負載均衡從藍色叢集切換至新的綠色叢集,此時部署就完成了!
結論
PX-Motion具有將Portworx卷和Kubernetes資源在叢集之間進行遷移的能力。 上述樣例就是使用PX-Motion幫助團隊實現藍綠部署的過程: 對其工作負載和資料在新版本的Kubernetes上進行測試,並幫助團隊在新的綠色叢集上執行應用程式。 在不同版本的Kubernetes上進行真實負載和資料測試,使得運營團隊能夠在釋出新版本的Kubernetes之前獲得充足的信心。 藍綠部署並不是PX-Motion唯一的功能,請檢視我們其他的PX-Motion博文了解更多。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69950566/viewspace-2666485/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- k8s pod狀態有哪些K8S
- k8s工作負載資源之deploymentK8S負載
- k8s工作負載控制器--DeploymentK8S負載
- k8s工作負載控制器--DaemonSetK8S負載
- k8s工作負載控制器--StatefulsetK8S負載
- 負載均衡器部署方式和工作原理負載
- 擁抱藍綠部署,推動AKS群集版本平滑升級
- 灰度部署、滾動部署與藍綠部署
- 擁抱藍綠部署,推動AKS群集版本平滑升級(下篇)
- 負載均衡是什麼?怎麼理解負載均衡的部署方式和工作原理負載
- nginx+consul做動態負載均衡(docker)Nginx負載Docker
- KubeVela 1.7 版本解讀:接管你的已有工作負載負載
- 工作流從無狀態切換到有狀態的好處
- java檢測當前CPU負載狀態的方法Java負載
- 【VMware VCF】VMware Cloud Foundation Part 06:部署 VI 工作負載域。Cloud負載
- 工作混沌狀態
- 在K8S中,負載均衡器有何作用?K8S負載
- statefulset詳解及為何結合headless service部署有狀態應用
- 更貼近業務場景的 K8s 工作負載:GameDeployment & GameStatefulSetK8S負載GAM
- K8S有狀態服務-StatefulSet使用最佳實踐K8S
- 程控水冷阻性負載主要工作方式有哪些負載
- hadoop不同版本有哪些Hadoop
- Java 原始碼刨析 - 執行緒的狀態有哪些?它是如何工作的?Java原始碼執行緒
- 有狀態軟體如何在 k8s 上快速擴容甚至自動擴容K8S
- 如何為你的平臺部署一個公開的系統狀態頁
- Gavin King為有狀態Bean SFSB平反Bean
- 在K8S中,PV的生命週期狀態有哪些?K8S
- SAP BSP應用有狀態和無狀態行為差異比較
- 為什麼對gRPC做負載均衡會很棘手?RPC負載
- 利用nginx做後臺伺服器的動態載入和負載均衡Nginx伺服器負載
- 為不同專案指定不同的 PHP 版本PHP
- 有狀態Stateful,富含資料的CI/CD怎麼做?
- k8s給多個外部靜態IP作負載均衡、反向代理K8S負載
- 資料管理方案Portworx在K8S上是如何支撐有狀態應用的?K8S
- Docker 與 K8S學習筆記(二十四)—— 工作負載的使用DockerK8S筆記負載
- SAP Fiori和WebClient UI的有狀態和無狀態行為設計原理WebclientUI
- 有狀態和無狀態的區別
- 狀態機工作流