1. 程式人生 > >《kubernetes官方文件》部署PHP redis 應用Guestbook

《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副本。

  1. 在您下載清單檔案的目錄中啟動一個終端視窗.
  2. 使用 redis-master-deployment.yaml 檔案部署Redis Master Deployment:
    kubectl apply -f redis-master-deployment.yaml
    
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment metadata: name: redis-master spec: selector: matchLabels: app: redis role: master tier: backend replicas: 1 template: metadata: labels: app: redis role: master tier: backend spec: containers
: - name: master image: k8s.gcr.io/redis:e2e # or just image: redis resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379
  1. 查詢Pods列表,以驗證Redis Master Pod正在執行:
    kubectl get pods
    

    響應類似於:

    NAME                            READY     STATUS    RESTARTS   AGE
    redis-master-1068406935-3lswp   1/1       Running   0          28s
    
  2. 執行以下命令檢視來自Redis Master Pod的日誌:
    kubectl logs -f POD-NAME
    

注意:將POD-NAME替換為您的Pod名稱。

建立 Redis Master 服務

guestbook 應用程式需要與Redis master通訊來寫資料。您需要使用一個服務來將流量代理到Redis master Pod。服務定義了訪問這些Pods的策略。

  1. 把 redis-master-service.yaml 檔案應用到Redis Master 服務:
    kubectl apply -f redis-master-service.yaml
    
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    app: redis
    role: master
    tier: backend
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
    role: master
    tier: backend

注意:這個清單檔案建立了一個名為redis-master的服務,它的標籤與前面定義的標籤相匹配,因此服務將網路流量路由到Redis master Pod。

  1. 查詢服務列表,以驗證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)

部署規模基於清單檔案中配置。在本例中,部署物件指定兩個副本。

如果沒有執行任何副本,這個部署將在您的容器叢集上啟動兩個副本。相反,如果有兩個以上的副本正在執行,那麼它將縮減到兩個執行副本。

  1. 把 redis-slave-deployment.yaml 檔案應用到Redis Slave Deployment
    kubectl apply -f redis-slave-deployment.yaml
    
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: redis-slave
spec:
  selector:
    matchLabels:
      app: redis
      role: slave
      tier: backend
  replicas: 2
  template:
    metadata:
      labels:
        app: redis
        role: slave
        tier: backend
    spec:
      containers:
      - name: slave
        image: gcr.io/google_samples/gb-redisslave:v1
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
          # Using `GET_HOSTS_FROM=dns` requires your cluster to
          # provide a dns service. As of Kubernetes 1.3, DNS is a built-in
          # service launched automatically. However, if the cluster you are using
          # does not have a built-in DNS service, you can instead
          # access an environment variable to find the master
          # service's host. To do so, comment out the 'value: dns' line above, and
          # uncomment the line below:
          # value: env
        ports:
        - containerPort: 6379
  1. 查詢 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提供透明的負載平衡。

  1. redis-slave-service.yaml 檔案應用到Redis Slave 服務
    kubectl apply -f redis-slave-service.yaml
    
apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    app: redis
    role: slave
    tier: backend
spec:
  ports:
  - port: 6379
  selector:
    app: redis
    role: slave
    tier: backend
  1. 查詢服務列表,以驗證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前端部署

  1. frontend-deployment.yaml 檔案應用到前端部署
    kubectl apply -f frontend-deployment.yaml
    
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      app: guestbook
      tier: frontend
  replicas: 3
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google-samples/gb-frontend:v4
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
          # Using `GET_HOSTS_FROM=dns` requires your cluster to
          # provide a dns service. As of Kubernetes 1.3, DNS is a built-in
          # service launched automatically. However, if the cluster you are using
          # does not have a built-in DNS service, you can instead
          # access an environment variable to find the master
          # service's host. To do so, comment out the 'value: dns' line above, and
          # uncomment the line below:
          # value: env
        ports:
        - containerPort: 80
  1. 查詢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-slaveredis-master服務只能在容器叢集中訪問,因為服務的預設型別是ClusterIPClusterIP為服務指向的一組Pods提供一個單一的IP地址。這個IP地址只能在叢集中訪問。

如果您希望客戶能夠訪問您的guestbook,那麼您必須將前端服務配置為外部可見,以便客戶端可以從容器叢集外部請求服務。Minikube只能通過NodePort公開服務。

注意:一些雲端計算提供商,比如Google Compute Engine或Google Kubernetes引擎,支援外部負載平衡器。如果你的雲服務提供商支援負載平衡器,你想要使用它,簡單地刪除或註釋掉type: NodePort並且去掉type: LoadBalancer的註釋。

  1. frontend-service.yaml檔案應用到前端服務
    kubectl apply -f frontend-service.yaml
    
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # comment or delete the following line if you want to use a LoadBalancer
  type: NodePort 
  # if your cluster supports it, uncomment the following to automatically create
  # an external load-balanced IP for the frontend service.
  # type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: guestbook
    tier: frontend
  1. 查詢服務列表,以驗證前端服務正在執行:
    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。

  1. 執行下面的命令以獲得前端服務的IP地址.
    minikube service frontend --url
    

    響應類似於:

    http://192.168.99.100:31323
    
  2. 複製IP地址,並在瀏覽器中載入頁面以檢視您的guestbook.

通過LoadBalancer檢視前端服務

如果你通過type: LoadBalancer部署frontend-service.yaml,你需要找到IP地址來檢視你的Guestbook

  1. 執行下面的命令以獲得前端服務的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
    
  2. 複製外部IP地址,並在瀏覽器中載入頁面以檢視您的guestbook.

擴充套件Web 前端

向上或向下擴充套件很容易,因為您的伺服器被定義為使用部署控制器( Deployment controller)的服務。

  1. 執行下面的命令來擴充套件前端Pods的數量:
    kubectl scale deployment frontend --replicas=5
    
  2. 查詢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
    
  3. 執行下面的命令來減少前端Pods的數量:
    kubectl scale deployment frontend --replicas=2
    
  4. 查詢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。使用一個命令使用標籤來刪除多個資源.

  1. 執行以下命令刪除所有的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
    
  2. 查詢Pods列表,以驗證是否正在執行:
    kubectl get pods
    

    響應應該是:

    No resources found.
    

下一節