《kubernetes官方文件》部署PHP redis 應用Guestbook
本教程向您展示如何使用Kubernetes和Docker構建和部署一個簡單的多層web應用程式。這個示例由以下元件組成:
目標
- 啟動 Redis master。
- 啟動 Redis slaves。
- 啟動 guestbook 前端。
- 暴露和檢視前端服務。
- 清理.
準備工作
您需要有一個Kubernetes叢集,並且必須配置kubectl命令列工具來與您的叢集通訊。如果您還沒有叢集,您可以使用Minikube建立一個叢集,或者您可以使用這些Kubernetes平臺:
檢查版本, 請輸入 kubectl version
.
下載以下配置檔案:
啟動 Redis Master
guestbook應用使用Redis儲存資料。guestbook 把資料寫入Redis master例項中,從多個redis slaves例項中讀取資料。
建立一個 Redis Master 部署(Deployment)
下面包含的清單檔案指定了一個部署控制器(Deployment controller),該控制器執行一個Redis master Pod副本。
- 在您下載清單檔案的目錄中啟動一個終端視窗.
- 使用
redis-master-deployment.yaml
檔案部署Redis Master Deployment:kubectl apply -f redis-master-deployment.yaml
|
- 查詢Pods列表,以驗證Redis Master Pod正在執行:
kubectl get pods
響應類似於:
NAME READY STATUS RESTARTS AGE redis-master-1068406935-3lswp 1/1 Running 0 28s
- 執行以下命令檢視來自Redis Master Pod的日誌:
kubectl logs -f POD-NAME
注意:將POD-NAME
替換為您的Pod名稱。
建立 Redis Master 服務
guestbook 應用程式需要與Redis master通訊來寫資料。您需要使用一個服務來將流量代理到Redis master Pod。服務定義了訪問這些Pods的策略。
- 把
redis-master-service.yaml
檔案應用到Redis Master 服務:kubectl apply -f redis-master-service.yaml
|
注意:這個清單檔案建立了一個名為redis-master
的服務,它的標籤與前面定義的標籤相匹配,因此服務將網路流量路由到Redis master Pod。
- 查詢服務列表,以驗證Redis master 服務正在執行:
kubectl get service
響應類似於:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.0.0.1 <none> 443/TCP 1m redis-master 10.0.0.151 <none> 6379/TCP 8s
啟動Redis Slaves
儘管Redis master是一個單一的pod,但是您可以通過新增副本的Redis slaves來實現它的高可用性。
建立 Redis Slave 部署(Deployment)
部署規模基於清單檔案中配置。在本例中,部署物件指定兩個副本。
如果沒有執行任何副本,這個部署將在您的容器叢集上啟動兩個副本。相反,如果有兩個以上的副本正在執行,那麼它將縮減到兩個執行副本。
- 把
redis-slave-deployment.yaml
檔案應用到Redis Slave Deploymentkubectl apply -f redis-slave-deployment.yaml
|
- 查詢 Pods 列表,以驗證Redis Slave正在執行:
kubectl get pods
響應類似於:
NAME READY STATUS RESTARTS AGE redis-master-1068406935-3lswp 1/1 Running 0 1m redis-slave-2005841000-fpvqc 0/1 ContainerCreating 0 6s redis-slave-2005841000-phfv9 0/1 ContainerCreating 0 6s
建立 Redis Slave服務
guestbook 應用程式需要與Redis slaves 進行通訊,以讀取資料。為了讓Redis slaves可發現,你需要建立一個服務。該服務為一組Pods提供透明的負載平衡。
- 把
redis-slave-service.yaml
檔案應用到Redis Slave 服務kubectl apply -f redis-slave-service.yaml
|
- 查詢服務列表,以驗證Redis Slave 服務正在執行:
kubectl get services
響應類似於:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.0.0.1 <none> 443/TCP 2m redis-master 10.0.0.151 <none> 6379/TCP 1m redis-slave 10.0.0.223 <none> 6379/TCP 6s
設定並暴露Guestbook的前端
guestbook 應用程式有一個web前端,它提供用PHP編寫的HTTP請求。它被配置為連線到用於寫請求的redis-master
服務,以及用於讀取請求的redis-slave
服務。
建立Guestbook前端部署
- 把
frontend-deployment.yaml
檔案應用到前端部署kubectl apply -f frontend-deployment.yaml
|
- 查詢Pods列表,以驗證三個前端副本正在執行:
kubectl get pods -l app=guestbook -l tier=frontend
響應類似於:
NAME READY STATUS RESTARTS AGE frontend-3823415956-dsvc5 1/1 Running 0 54s frontend-3823415956-k22zn 1/1 Running 0 54s frontend-3823415956-w9gbt 1/1 Running 0 54s
建立前端服務
您所應用的redis-slave
和redis-master
服務只能在容器叢集中訪問,因為服務的預設型別是ClusterIP。ClusterIP
為服務指向的一組Pods提供一個單一的IP地址。這個IP地址只能在叢集中訪問。
如果您希望客戶能夠訪問您的guestbook,那麼您必須將前端服務配置為外部可見,以便客戶端可以從容器叢集外部請求服務。Minikube只能通過NodePort
公開服務。
注意:一些雲端計算提供商,比如Google Compute Engine或Google Kubernetes引擎,支援外部負載平衡器。如果你的雲服務提供商支援負載平衡器,你想要使用它,簡單地刪除或註釋掉type: NodePort
並且去掉type: LoadBalancer
的註釋。
- 把
frontend-service.yaml
檔案應用到前端服務kubectl apply -f frontend-service.yaml
|
- 查詢服務列表,以驗證前端服務正在執行:
kubectl get services
響應類似於:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend 10.0.0.112 <nodes> 80:31323/TCP 6s kubernetes 10.0.0.1 <none> 443/TCP 4m redis-master 10.0.0.151 <none> 6379/TCP 2m redis-slave 10.0.0.223 <none> 6379/TCP 1m
通過NodePort
檢視前端服務
如果您將此應用程式部署到Minikube或本地叢集,您需要找到IP地址來檢視您的Guestbook。
- 執行下面的命令以獲得前端服務的IP地址.
minikube service frontend --url
響應類似於:
http://192.168.99.100:31323
- 複製IP地址,並在瀏覽器中載入頁面以檢視您的guestbook.
通過LoadBalancer
檢視前端服務
如果你通過type: LoadBalancer
部署frontend-service.yaml
,你需要找到IP地址來檢視你的Guestbook
- 執行下面的命令以獲得前端服務的IP地址.
kubectl get service frontend
響應類似於:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend 10.51.242.136 109.197.92.229 80:32372/TCP 1m
- 複製外部IP地址,並在瀏覽器中載入頁面以檢視您的guestbook.
擴充套件Web 前端
向上或向下擴充套件很容易,因為您的伺服器被定義為使用部署控制器( Deployment controller)的服務。
- 執行下面的命令來擴充套件前端Pods的數量:
kubectl scale deployment frontend --replicas=5
- 查詢Pods 的列表,以驗證前端執行的Pods 的數量:
kubectl get pods
響應類似於:
NAME READY STATUS RESTARTS AGE frontend-3823415956-70qj5 1/1 Running 0 5s frontend-3823415956-dsvc5 1/1 Running 0 54m frontend-3823415956-k22zn 1/1 Running 0 54m frontend-3823415956-w9gbt 1/1 Running 0 54m frontend-3823415956-x2pld 1/1 Running 0 5s redis-master-1068406935-3lswp 1/1 Running 0 56m redis-slave-2005841000-fpvqc 1/1 Running 0 55m redis-slave-2005841000-phfv9 1/1 Running 0 55m
- 執行下面的命令來減少前端Pods的數量:
kubectl scale deployment frontend --replicas=2
- 查詢Pods 的列表,以驗證前端執行的Pods 的數量:
kubectl get pods
響應類似於:
NAME READY STATUS RESTARTS AGE frontend-3823415956-k22zn 1/1 Running 0 1h frontend-3823415956-w9gbt 1/1 Running 0 1h redis-master-1068406935-3lswp 1/1 Running 0 1h redis-slave-2005841000-fpvqc 1/1 Running 0 1h redis-slave-2005841000-phfv9 1/1 Running 0 1h
清理
刪除部署和服務也會刪除任何執行的Pods。使用一個命令使用標籤來刪除多個資源.
- 執行以下命令刪除所有的Pods、部署和服務.
kubectl delete deployment -l app=redis kubectl delete service -l app=redis kubectl delete deployment -l app=guestbook kubectl delete service -l app=guestbook
響應應該是:
deployment "redis-master" deleted deployment "redis-slave" deleted service "redis-master" deleted service "redis-slave" deleted deployment "frontend" deleted service "frontend" deleted
- 查詢Pods列表,以驗證是否正在執行:
kubectl get pods
響應應該是:
No resources found.