Kubernetes 示例:使用Redis部署PHP留言板應(yīng)用程序

2022-06-25 14:42 更新

示例:使用 Redis 部署 PHP 留言板應(yīng)用程序

本教程向你展示如何使用 Kubernetes 和 Docker 構(gòu)建和部署一個(gè)簡(jiǎn)單的 (非面向生產(chǎn)的) 多層 web 應(yīng)用程序。本例由以下組件組成:

  • 單實(shí)例 Redis 以保存留言板條目
  • 多個(gè) web 前端實(shí)例

教程目標(biāo)

  • 啟動(dòng) Redis 領(lǐng)導(dǎo)者(Leader)
  • 啟動(dòng)兩個(gè) Redis 跟隨者(Follower)
  • 公開并查看前端服務(wù)
  • 清理

在開始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

  • Katacoda
  • 玩轉(zhuǎn) Kubernetes

您的 Kubernetes 服務(wù)器版本必須不低于版本 v1.14. 要獲知版本信息,請(qǐng)輸入 ?kubectl version?。

啟動(dòng) Redis 數(shù)據(jù)庫(kù)

留言板應(yīng)用程序使用 Redis 存儲(chǔ)數(shù)據(jù)。

創(chuàng)建 Redis Deployment 

下面包含的清單文件指定了一個(gè) Deployment 控制器,該控制器運(yùn)行一個(gè) 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. 在下載清單文件的目錄中啟動(dòng)終端窗口。
  2. 從 ?redis-leader-deployment.yaml? 文件中應(yīng)用 Redis Deployment:
  3. kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
    
  4. 查詢 Pod 列表以驗(yàn)證 Redis Pod 是否正在運(yùn)行:
  5. kubectl get pods
    

    響應(yīng)應(yīng)該與此類似:

    NAME                           READY   STATUS    RESTARTS   AGE
    redis-leader-fb76b4755-xjr2n   1/1     Running   0          13s
  6. 運(yùn)行以下命令查看 Redis Deployment 中的日志:
  7. kubectl logs -f deployment/redis-leader
    

創(chuàng)建 Redis 領(lǐng)導(dǎo)者服務(wù)

留言板應(yīng)用程序需要往 Redis 中寫數(shù)據(jù)。因此,需要?jiǎng)?chuàng)建 Service 來轉(zhuǎn)發(fā) Redis Pod 的流量。Service 定義了訪問 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? 文件創(chuàng)建 Redis的服務(wù):
  2. kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
    
  3. 查詢服務(wù)列表驗(yàn)證 Redis 服務(wù)是否正在運(yùn)行:
  4. kubectl get service
    

    響應(yīng)應(yīng)該與此類似:

    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

說明: 這個(gè)清單文件創(chuàng)建了一個(gè)名為 ?redis-leader? 的 Service,其中包含一組 與前面定義的標(biāo)簽匹配的標(biāo)簽,因此服務(wù)將網(wǎng)絡(luò)流量路由到 Redis Pod 上。

設(shè)置 Redis 跟隨者

盡管 Redis 領(lǐng)導(dǎo)者只有一個(gè) Pod,你可以通過添加若干 Redis 跟隨者來將其配置為高可用狀態(tài), 以滿足流量需求。

# 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: gcr.io/google_samples/gb-redis-follower:v2
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 6379
  1. 應(yīng)用下面的 ?redis-follower-deployment.yaml? 文件創(chuàng)建 Redis Deployment:
  2. kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
    
  3. 通過查詢 Pods 列表,驗(yàn)證兩個(gè) Redis 跟隨者副本在運(yùn)行:
  4. kubectl get pods
    

    響應(yīng)應(yīng)該類似于這樣:

    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

創(chuàng)建 Redis 跟隨者服務(wù)

Guestbook 應(yīng)用需要與 Redis 跟隨者通信以讀取數(shù)據(jù)。 為了讓 Redis 跟隨者可被發(fā)現(xiàn),你必須創(chuàng)建另一個(gè) Service。

# 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. 應(yīng)用如下所示 ?redis-follower-service.yaml? 文件中的 Redis Service:
  2. kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
    
  3. 查詢 Service 列表,驗(yàn)證 Redis 服務(wù)在運(yùn)行:
  4. kubectl get service
    

    響應(yīng)應(yīng)該類似于這樣:

    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
說明:
清單文件創(chuàng)建了一個(gè)名為 ?redis-follower? 的 Service,該 Service 具有一些與之前所定義的標(biāo)簽相匹配的標(biāo)簽,因此該 Service 能夠?qū)⒕W(wǎng)絡(luò)流量 路由到 Redis Pod 之上。

設(shè)置并公開留言板前端

現(xiàn)在你有了一個(gè)為 Guestbook 應(yīng)用配置的 Redis 存儲(chǔ)處于運(yùn)行狀態(tài), 接下來可以啟動(dòng) Guestbook 的 Web 服務(wù)器了。 與 Redis 跟隨者類似,前端也是使用 Kubernetes Deployment 來部署的。

Guestbook 應(yīng)用使用 PHP 前端。該前端被配置成與后端的 Redis 跟隨者或者 領(lǐng)導(dǎo)者服務(wù)通信,具體選擇哪個(gè)服務(wù)取決于請(qǐng)求是讀操作還是寫操作。 前端對(duì)外暴露一個(gè) JSON 接口,并提供基于 jQuery-Ajax 的用戶體驗(yàn)。

創(chuàng)建 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: gcr.io/google_samples/gb-frontend:v5
        env:
        - name: GET_HOSTS_FROM
          value: "dns"
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
  1. 應(yīng)用來自 ?frontend-deployment.yaml? 文件的前端 Deployment:
  2. kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
    
  3. 查詢 Pod 列表,驗(yàn)證三個(gè)前端副本正在運(yùn)行:
  4. kubectl get pods -l app=guestbook -l tier=frontend
    

    響應(yīng)應(yīng)該與此類似:

    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

創(chuàng)建前端服務(wù)

應(yīng)用的 ?Redis ?服務(wù)只能在 Kubernetes 集群中訪問,因?yàn)榉?wù)的默認(rèn)類型是 ?ClusterIP?。 ?ClusterIP ?為服務(wù)指向的 Pod 集提供一個(gè) IP 地址。這個(gè) IP 地址只能在集群中訪問。

如果你希望訪客能夠訪問你的 Guestbook,你必須將前端服務(wù)配置為外部可見的, 以便客戶端可以從 Kubernetes 集群之外請(qǐng)求服務(wù)。 然而即便使用了 ?ClusterIP?,Kubernetes 用戶仍可以通過 ?kubectl port-forward? 訪問服務(wù)。

說明: 一些云提供商,如 Google Compute Engine 或 Google Kubernetes Engine, 支持外部負(fù)載均衡器。如果你的云提供商支持負(fù)載均衡器,并且你希望使用它, 只需取消注釋 ?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
  1. 應(yīng)用來自 ?frontend-service.yaml? 文件中的前端服務(wù):
  2. kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
    
  3. 查詢 Service 列表以驗(yàn)證前端服務(wù)正在運(yùn)行:
  4. kubectl get services
    

    響應(yīng)應(yīng)該與此類似:

    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 查看前端服務(wù)

  1. 運(yùn)行以下命令將本機(jī)的 8080 端口轉(zhuǎn)發(fā)到服務(wù)的 80 端口。
  2. kubectl port-forward svc/frontend 8080:80
    

    響應(yīng)應(yīng)該與此類似:

    Forwarding from 127.0.0.1:8080 -> 80
    Forwarding from [::1]:8080 -> 80
  3. 在瀏覽器中加載 http://localhost:8080 頁面以查看 Guestbook。

通過 LoadBalancer 查看前端服務(wù)

如果你部署了 ?frontend-service.yaml?,需要找到用來查看 Guestbook 的 IP 地址。

  1. 運(yùn)行以下命令以獲取前端服務(wù)的 IP 地址。
  2. kubectl get service frontend
    

    響應(yīng)應(yīng)該與此類似:

    NAME       TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)        AGE
    frontend   LoadBalancer   10.51.242.136   109.197.92.229     80:32372/TCP   1m
  3. 復(fù)制這里的外部 IP 地址,然后在瀏覽器中加載頁面以查看留言板。
說明:
嘗試通過輸入消息并點(diǎn)擊 Submit 來添加一些留言板條目。 你所輸入的消息會(huì)在前端顯示。這一消息表明數(shù)據(jù)被通過你 之前所創(chuàng)建的 Service 添加到 Redis 存儲(chǔ)中。

擴(kuò)展 Web 前端

你可以根據(jù)需要執(zhí)行伸縮操作,這是因?yàn)榉?wù)器本身被定義為使用一個(gè) Deployment 控制器的 Service。

  1. 運(yùn)行以下命令擴(kuò)展前端 Pod 的數(shù)量:
  2. kubectl scale deployment frontend --replicas=5
    
  3. 查詢 Pod 列表驗(yàn)證正在運(yùn)行的前端 Pod 的數(shù)量:
  4. kubectl get pods
    

    響應(yīng)應(yīng)該類似于這樣:

    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
  5. 運(yùn)行以下命令縮小前端 Pod 的數(shù)量:
  6. kubectl scale deployment frontend --replicas=2
    
  7. 查詢 Pod 列表驗(yàn)證正在運(yùn)行的前端 Pod 的數(shù)量:
  8. kubectl get pods
    

    響應(yīng)應(yīng)該類似于這樣:

    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

清理

刪除 Deployments 和服務(wù)還會(huì)刪除正在運(yùn)行的 Pod。 使用標(biāo)簽用一個(gè)命令刪除多個(gè)資源。

  1. 運(yùn)行以下命令以刪除所有 Pod,Deployments 和 Services。
  2. kubectl delete deployment -l app=redis
    kubectl delete service -l app=redis
    kubectl delete deployment frontend
    kubectl delete service frontend

    響應(yīng)應(yīng)該是:

    deployment.apps "redis-follower" deleted
    deployment.apps "redis-leader" deleted
    deployment.apps "frontend" deleted
    service "frontend" deleted
  3. 查詢 Pod 列表,確認(rèn)沒有 Pod 在運(yùn)行:
  4. kubectl get pods
    

    響應(yīng)應(yīng)該是:

    No resources found in default namespace.
    


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)