範例:使用 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
  1. 在您下載 Manifest 檔案的目錄中啟動終端機視窗。

  2. redis-leader-deployment.yaml 檔案套用 Redis Deployment

    kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
    
  3. 查詢 Pod 清單以驗證 Redis Pod 正在執行中

    kubectl get pods
    

    回應應類似於此

    NAME                           READY   STATUS    RESTARTS   AGE
    redis-leader-fb76b4755-xjr2n   1/1     Running   0          13s
    
  4. 執行以下命令以檢視來自 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
  1. 從以下 redis-leader-service.yaml 檔案套用 Redis 服務

    kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
    
  2. 查詢服務清單以驗證 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
    

設定 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
  1. 從以下 redis-follower-deployment.yaml 檔案套用 Redis Deployment

    kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
    
  2. 透過查詢 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
  1. 從以下 redis-follower-service.yaml 檔案套用 Redis 服務

    kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
    
  2. 查詢服務清單以驗證 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
    

設定與公開 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
  1. frontend-deployment.yaml 檔案套用前端 Deployment

    kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
    
  2. 查詢 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 叢集內存取,因為服務的預設類型是 ClusterIPClusterIP 為服務指向的 Pod 集提供單一 IP 位址。此 IP 位址僅可在叢集內存取。

如果您希望訪客能夠存取您的 Guestbook,則必須將前端服務設定為外部可見,以便用戶端可以從 Kubernetes 叢集外部請求服務。但是,即使 Kubernetes 使用者使用 kubectl port-forward 來存取服務,即使它使用 ClusterIP 也是如此。

# 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
  1. frontend-service.yaml 檔案套用 frontend Service

    kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
    
  2. 查詢 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

  1. 執行以下指令,將您本機的 port 8080 轉發到 service 的 port 80

    kubectl port-forward svc/frontend 8080:80
    

    回應應類似於此

    Forwarding from 127.0.0.1:8080 -> 80
    Forwarding from [::1]:8080 -> 80
    
  2. 在您的瀏覽器中載入頁面 http://localhost:8080 以檢視您的 guestbook。

透過 LoadBalancer 檢視 Frontend Service

如果您部署的 frontend-service.yaml 清單檔案類型為 LoadBalancer,您需要找到 IP 位址才能檢視您的 Guestbook。

  1. 執行以下指令以取得 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
    
  2. 複製外部 IP 位址,並在您的瀏覽器中載入頁面以檢視您的 guestbook。

擴展 Web 前端

您可以根據需要向上或向下擴展,因為您的伺服器定義為使用 Deployment 控制器的 Service。

  1. 執行以下指令以向上擴展 frontend Pod 的數量

    kubectl scale deployment frontend --replicas=5
    
  2. 查詢 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
    
  3. 執行以下指令以向下擴展 frontend Pod 的數量

    kubectl scale deployment frontend --replicas=2
    
  4. 查詢 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。使用標籤以一個指令刪除多個資源。

  1. 執行以下指令以刪除所有 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
    
  2. 查詢 Pod 列表以驗證沒有 Pod 正在執行

    kubectl get pods
    

    回應應如下所示

    No resources found in default namespace.
    

接下來是什麼

上次修改時間為 2023 年 8 月 24 日下午 6:38 PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)