範例:使用 Redis 部署 PHP Guestbook 應用程式
本教學課程示範如何使用 Kubernetes 和 Docker 建置及部署一個簡單的(非生產就緒)多層級 Web 應用程式。此範例包含以下元件
- 單一執行個體 Redis,用於儲存 Guestbook 項目
- 多個 Web 前端執行個體
目標
- 啟動 Redis Leader。
- 啟動兩個 Redis Followers。
- 啟動 Guestbook 前端。
- 公開與檢視前端服務。
- 清理。
開始之前
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes Playground 之一
您的 Kubernetes 伺服器必須是 v1.14 或更新版本。若要檢查版本,請輸入kubectl version
。啟動 Redis 資料庫
Guestbook 應用程式使用 Redis 儲存其資料。
建立 Redis Deployment
以下包含的 Manifest 檔案指定一個 Deployment 控制器,該控制器執行單一副本 Redis Pod。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: leader
tier: backend
spec:
containers:
- name: leader
image: "docker.io/redis:6.0.5"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
在您下載 Manifest 檔案的目錄中啟動終端機視窗。
從
redis-leader-deployment.yaml
檔案套用 Redis Deploymentkubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
查詢 Pod 清單以驗證 Redis Pod 正在執行中
kubectl get pods
回應應類似於此
NAME READY STATUS RESTARTS AGE redis-leader-fb76b4755-xjr2n 1/1 Running 0 13s
執行以下命令以檢視來自 Redis Leader Pod 的日誌
kubectl logs -f deployment/redis-leader
建立 Redis Leader 服務
Guestbook 應用程式需要與 Redis 通訊以寫入其資料。您需要套用 服務 以將流量 Proxy 到 Redis Pod。服務定義了存取 Pod 的原則。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: leader
tier: backend
從以下
redis-leader-service.yaml
檔案套用 Redis 服務kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
查詢服務清單以驗證 Redis 服務正在執行中
kubectl get service
回應應類似於此
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1m redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 16s
注意
此 Manifest 檔案建立一個名為redis-leader
的服務,其中包含一組與先前定義的標籤相符的標籤,因此服務會將網路流量路由到 Redis Pod。設定 Redis Followers
雖然 Redis Leader 是單一 Pod,但您可以透過新增一些 Redis Followers 或副本來使其具備高可用性並滿足流量需求。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
replicas: 2
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: follower
tier: backend
spec:
containers:
- name: follower
image: us-docker.pkg.dev/google-samples/containers/gke/gb-redis-follower:v2
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
從以下
redis-follower-deployment.yaml
檔案套用 Redis Deploymentkubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
透過查詢 Pod 清單來驗證兩個 Redis Follower 副本正在執行中
kubectl get pods
回應應類似於此
NAME READY STATUS RESTARTS AGE redis-follower-dddfbdcc9-82sfr 1/1 Running 0 37s redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 38s redis-leader-fb76b4755-xjr2n 1/1 Running 0 11m
建立 Redis Follower 服務
Guestbook 應用程式需要與 Redis Followers 通訊以讀取資料。為了使 Redis Followers 可探索,您必須設定另一個 服務。
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
ports:
# the port that this service should serve on
- port: 6379
selector:
app: redis
role: follower
tier: backend
從以下
redis-follower-service.yaml
檔案套用 Redis 服務kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
查詢服務清單以驗證 Redis 服務正在執行中
kubectl get service
回應應類似於此
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 9s redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 6m10s
注意
此 Manifest 檔案建立一個名為redis-follower
的服務,其中包含一組與先前定義的標籤相符的標籤,因此服務會將網路流量路由到 Redis Pod。設定與公開 Guestbook 前端
現在您已經啟動並執行 Guestbook 的 Redis 儲存,請啟動 Guestbook Web 伺服器。與 Redis Followers 類似,前端是使用 Kubernetes Deployment 部署的。
Guestbook 應用程式使用 PHP 前端。它被設定為與 Redis Follower 或 Leader 服務通訊,具體取決於請求是讀取還是寫入。前端公開 JSON 介面,並提供基於 jQuery-Ajax 的 UX。
建立 Guestbook 前端 Deployment
# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
env:
- name: GET_HOSTS_FROM
value: "dns"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
從
frontend-deployment.yaml
檔案套用前端 Deploymentkubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
查詢 Pod 清單以驗證三個前端副本正在執行中
kubectl get pods -l app=guestbook -l tier=frontend
回應應類似於此
NAME READY STATUS RESTARTS AGE frontend-85595f5bf9-5tqhb 1/1 Running 0 47s frontend-85595f5bf9-qbzwm 1/1 Running 0 47s frontend-85595f5bf9-zchwc 1/1 Running 0 47s
建立前端服務
您套用的 Redis
服務只能在 Kubernetes 叢集內存取,因為服務的預設類型是 ClusterIP。ClusterIP
為服務指向的 Pod 集提供單一 IP 位址。此 IP 位址僅可在叢集內存取。
如果您希望訪客能夠存取您的 Guestbook,則必須將前端服務設定為外部可見,以便用戶端可以從 Kubernetes 叢集外部請求服務。但是,即使 Kubernetes 使用者使用 kubectl port-forward
來存取服務,即使它使用 ClusterIP
也是如此。
注意
有些雲端供應商,例如 Google Compute Engine 或 Google Kubernetes Engine,支援外部負載平衡器。如果您的雲端供應商支援負載平衡器,且您想要使用它,請取消註解type: LoadBalancer
。# SOURCE: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced IP for the frontend service.
# type: LoadBalancer
#type: LoadBalancer
ports:
# the port that this service should serve on
- port: 80
selector:
app: guestbook
tier: frontend
從
frontend-service.yaml
檔案套用 frontend Servicekubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
查詢 Service 列表以驗證 frontend Service 正在執行
kubectl get services
回應應類似於此
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend ClusterIP 10.97.28.230 <none> 80/TCP 19s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 5m48s redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 11m
透過 kubectl port-forward
檢視 Frontend Service
執行以下指令,將您本機的 port
8080
轉發到 service 的 port80
。kubectl port-forward svc/frontend 8080:80
回應應類似於此
Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80
在您的瀏覽器中載入頁面 http://localhost:8080 以檢視您的 guestbook。
透過 LoadBalancer
檢視 Frontend Service
如果您部署的 frontend-service.yaml
清單檔案類型為 LoadBalancer
,您需要找到 IP 位址才能檢視您的 Guestbook。
執行以下指令以取得 frontend Service 的 IP 位址。
kubectl get service frontend
回應應類似於此
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend LoadBalancer 10.51.242.136 109.197.92.229 80:32372/TCP 1m
複製外部 IP 位址,並在您的瀏覽器中載入頁面以檢視您的 guestbook。
注意
嘗試新增一些 guestbook 條目,方法是輸入訊息,然後點擊「提交」。您輸入的訊息會出現在前端。此訊息表示資料已透過您先前建立的 Service 成功新增至 Redis。擴展 Web 前端
您可以根據需要向上或向下擴展,因為您的伺服器定義為使用 Deployment 控制器的 Service。
執行以下指令以向上擴展 frontend Pod 的數量
kubectl scale deployment frontend --replicas=5
查詢 Pod 列表以驗證正在執行的 frontend Pod 數量
kubectl get pods
回應應如下所示
NAME READY STATUS RESTARTS AGE frontend-85595f5bf9-5df5m 1/1 Running 0 83s frontend-85595f5bf9-7zmg5 1/1 Running 0 83s frontend-85595f5bf9-cpskg 1/1 Running 0 15m frontend-85595f5bf9-l2l54 1/1 Running 0 14m frontend-85595f5bf9-l9c8z 1/1 Running 0 14m redis-follower-dddfbdcc9-82sfr 1/1 Running 0 97m redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 97m redis-leader-fb76b4755-xjr2n 1/1 Running 0 108m
執行以下指令以向下擴展 frontend Pod 的數量
kubectl scale deployment frontend --replicas=2
查詢 Pod 列表以驗證正在執行的 frontend Pod 數量
kubectl get pods
回應應如下所示
NAME READY STATUS RESTARTS AGE frontend-85595f5bf9-cpskg 1/1 Running 0 16m frontend-85595f5bf9-l9c8z 1/1 Running 0 15m redis-follower-dddfbdcc9-82sfr 1/1 Running 0 98m redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 98m redis-leader-fb76b4755-xjr2n 1/1 Running 0 109m
清理
刪除 Deployment 和 Service 也會刪除任何正在執行的 Pod。使用標籤以一個指令刪除多個資源。
執行以下指令以刪除所有 Pod、Deployment 和 Service。
kubectl delete deployment -l app=redis kubectl delete service -l app=redis kubectl delete deployment frontend kubectl delete service frontend
回應應如下所示
deployment.apps "redis-follower" deleted deployment.apps "redis-leader" deleted deployment.apps "frontend" deleted service "frontend" deleted
查詢 Pod 列表以驗證沒有 Pod 正在執行
kubectl get pods
回應應如下所示
No resources found in default namespace.
接下來是什麼
- 完成 Kubernetes 基礎知識 互動式教學課程
- 使用 Kubernetes 建立部落格,使用 Persistent Volumes for MySQL and Wordpress
- 閱讀更多關於 使用 Service 連接應用程式 的資訊
- 閱讀更多關於 有效使用標籤 的資訊