1. 程式人生 > >在Kubernetes叢集中使用Redis部署PHP留言簿應用程式

在Kubernetes叢集中使用Redis部署PHP留言簿應用程式

在Kubernetes叢集中使用Redis部署PHP留言簿應用

這裡寫圖片描述

實驗目標

  • 啟動一個Redis Master
  • 啟動一個Redis Slave
  • 啟動guestbook程式
  • 展示和檢視前端服務
  • 清理

實驗環境

需要有一個Kubernetes叢集,以及kubectl命令列工具必須配置與叢集通訊

在此可以檢查k8s及相關工具版本:kubectl version

[[email protected] ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.2"
, GitCommit:"5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", GitTreeState:"clean", BuildDate:"2018-01-18T10:09:24Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"
} Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.2", GitCommit:"5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", GitTreeState:"clean"
, BuildDate:"2018-01-18T09:42:01Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"
}

下載實驗用到的配置檔案:

筆者在k8s叢集master伺服器上建立了/opt/k8s/guestbook目錄,下載上面的檔案到目錄如下:

[[email protected]-k8s ~]# cd /opt/k8s/guestbook/
[[email protected]-k8s guestbook]# ll
total 24
-rw-r--r-- 1 root root 1086 Feb
6 16:28 frontend-deployment.yaml -rw-r--r-- 1 root root 438 Feb 6 16:29 frontend-service.yaml -rw-r--r-- 1 root root 561 Feb 6 17:01 redis-master-deployment.yaml -rw-r--r-- 1 root root 233 Feb 6 17:14 redis-master-service.yaml -rw-r--r-- 1 root root 1117 Feb 6 16:28 redis-slave-deployment.yaml -rw-r--r-- 1 root root 209 Feb 6 16:28 redis-slave-service.yaml

啟動Redis Master

留言簿應用程式使用Redis來儲存其資料。它將其資料寫入Redis主例項,並從多個Redis從例項中讀取資料

建立Redis Master部署配置檔案

清單檔案(如下所示)指定執行單個副本Redis master Pod的Deployment Controller。

  • 在下載清單檔案的目錄中啟動一個終端視窗
  • redis-master-deployment.yaml檔案應用Redis Master部署:
[root@aniu-k8s guestbook]# kubectl apply -f redis-master-deployment.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment "redis-master" configured
  • 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
  • 查詢Pod的列表以驗證Redis Master Pod正在執行
[root@aniu-k8s guestbook]# kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
redis-master-585798d8ff-g69wc   1/1       Running   0          28m
  • 執行以下命令檢視Redis Master Pod中的日誌:
[root@aniu-k8s guestbook]# kubectl logs -f redis-master-585798d8ff-g69wc
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 2.8.19 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               
[1] 06 Feb 09:14:33.096 # Server started, Redis version 2.8.19
[1] 06 Feb 09:14:33.097 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
[1] 06 Feb 09:14:33.097 * The server is now ready to accept connections on port 6379

建立Redis Master服務

留言簿應用程式需要與Redis主站通訊以寫入其資料。您需要應用服務將流量代理到Redis主Pod。服務定義訪問Pod的策略

  • 應用以下redis-master-service.yaml檔案中的Redis Master服務:
[root@aniu-k8s guestbook]# kubectl apply -f redis-master-service.yaml
service "redis-master" created
  • 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主服務正在執行:
[root@aniu-k8s guestbook]# kubectl get service
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP    6d
redis-master   ClusterIP   10.109.193.22   <none>        6379/TCP   6s

啟動Redis Slaves服務

雖然Redis master是一個單獨的pod,但是可以通過新增副本Redis Slaves來使其高度可用以滿足流量需求

建立Redis Slaves部署

部署根據清單檔案中設定的配置進行縮放。在這種情況下,Deployment物件指定兩個副本

如果沒有任何副本正在執行,則此部署將在您的容器群集上啟動兩個副本。相反,如果有兩個以上的副本正在執行,則會縮小直到兩個副本正在執行

  • redis-slave-deployment.yaml檔案應用Redis Slave部署:
[root@aniu-k8s guestbook]# kubectl apply -f redis-slave-deployment.yaml
deployment "redis-slave" created
  • redis-slave-deployment.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
[[email protected] guestbook]# cat 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
          # 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
  • 查詢Pod的列表以驗證Redis Slave Pod是否正在執行:
[root@aniu-k8s guestbook]# kubectl get pods
NAME                            READY     STATUS              RESTARTS   AGE
redis-master-585798d8ff-g69wc   1/1       Running             0          3m
redis-slave-865486c9df-tjvfn    0/1       ContainerCreating   0          27s
redis-slave-865486c9df-x76gb    1/1       Running    

建立Redis Slave服務

留言簿應用程式需要與Redis Slave進行通訊以讀取資料。為了使Redis Slave可以被發現,需要建立一個服務。服務為一組Pod提供透明的負載平衡。

  • 應用以下redis-slave-service.yaml檔案中的Redis從服務
[root@aniu-k8s guestbook]# kubectl apply -f redis-slave-service.yaml
service "redis-slave" created
  • 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
  • 查詢服務列表以驗證Redis Slave服務是否正在執行
[[email protected] guestbook]# kubectl get services
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes     ClusterIP   10.96.0.1        <none>        443/TCP    6d
redis-master   ClusterIP   10.109.193.22    <none>        6379/TCP   2m
redis-slave    ClusterIP   10.101.252.227   <none>        6379/TCP   21s

設定和公開留言簿前端

留言簿應用程式有一個Web前端,用於使用PHP編寫的HTTP請求。它被配置為連線到redis-master服務的寫請求和redis-slave服務的讀請求

建立留言簿前端部署

  • 從以下frontend-deployment.yaml檔案應用前端部署:
[root@aniu-k8s guestbook]# kubectl apply -f frontend-deployment.yaml
deployment "frontend" created
  • 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
          # 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
  • 查詢Pod的列表以驗證三個前端副本正在執行:
[[email protected] guestbook]# kubectl get pods -l app=guestbook -l tier=frontend
NAME                       READY     STATUS    RESTARTS   AGE
frontend-67f65745c-lr25s   1/1       Running   0          1m
frontend-67f65745c-n798g   1/1       Running   0          1m
frontend-67f65745c-n92r4   1/1       Running   0          1m

建立前端服務

應用的redis-slave和redis-master服務只能在容器群集內訪問,因為服務的預設型別是ClusterIP。 ClusterIP為服務指向的一組Pod提供一個IP地址。 該IP地址只能在群集內訪問。

如果希望guest虛擬機器能夠訪問您的留言簿,則必須將前端服務配置為外部可見,以便客戶端可以從容器群集外部請求該服務。 Minikube只能通過NodePort公開服務

  • 應用以下frontend-service.yaml檔案中的前端服務
[root@aniu-k8s guestbook]# kubectl apply -f frontend-service.yaml
service "frontend" created
  • 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
  • 查詢服務列表以驗證前端服務正在執行
[[email protected] guestbook]# kubectl get services 
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
frontend       NodePort    10.103.1.159     <none>        80:31546/TCP   7s
kubernetes     ClusterIP   10.96.0.1        <none>        443/TCP        6d
redis-master   ClusterIP   10.109.193.22    <none>        6379/TCP       5m
redis-slave    ClusterIP   10.101.252.227   <none>        6379/TCP       4m

通過NodePort檢視前端服務

如果您將此應用程式部署到Minikube或本地群集,則需要查詢IP地址才能檢視您的留言簿。

  • 行以下命令獲取前端服務的IP地址
minikube service frontend --url

複製IP地址,然後在瀏覽器中載入頁面以檢視您的留言簿。

通過LoadBalancer檢視前端服務

  • 執行以下命令獲取前端服務的IP地址
[root@aniu-k8s guestbook]# kubectl get service frontend

複製外部IP地址,並在瀏覽器中載入頁面以檢視您的留言簿

擴充套件Web前端

放大或縮小很容易,因為我們的伺服器被定義為使用部署控制器的服務

  • 執行以下命令以放大前端Pod的數量
[root@aniu-k8s guestbook]# kubectl scale deployment frontend --replicas=5
deployment "frontend" scaled
  • 查詢Pod的列表以驗證正在執行的前端Pod的數量:
[[email protected] guestbook]# kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
frontend-67f65745c-lr25s        1/1       Running   0          5m
frontend-67f65745c-n798g        1/1       Running   0          5m
frontend-67f65745c-n92r4        1/1       Running   0          5m
frontend-67f65745c-nsnfs        1/1       Running   0          7s
frontend-67f65745c-spjnm        1/1       Running   0          7s
redis-master-585798d8ff-g69wc   1/1       Running   0          10m
redis-slave-865486c9df-tjvfn    1/1       Running   0          8m
redis-slave-865486c9df-x76gb    1/1       Running   0          8m
  • 執行以下命令以縮小前端Pod的數量:
[[email protected] guestbook]# kubectl scale deployment frontend --replicas=2
deployment "frontend" scaled
[[email protected] guestbook]# kubectl get pods
NAME                            READY     STATUS        RESTARTS   AGE
frontend-67f65745c-lr25s        1/1       Running       0          50m
frontend-67f65745c-n798g        1/1       Running       0          50m
frontend-67f65745c-n92r4        0/1       Terminating   0          50m
frontend-67f65745c-spjnm        0/1       Terminating   0          45m
redis-master-585798d8ff-g69wc   1/1       Running       0          56m
redis-slave-865486c9df-tjvfn    1/1       Running       0          53m
redis-slave-865486c9df-x76gb    1/1       Running       0          53m

清理pods及services

刪除部署和服務也會刪除任何正在執行的Pod。使用標籤可以用一個命令刪除多個資源。

  • 執行以下命令刪除所有Pod,Deployments和Services。
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
  • 查詢Pod的列表以驗證沒有Pod正在執行:
kubectl get pods
# 
No resources found.

相關推薦

Kubernetes叢集中使用Redis部署PHP留言簿應用程式

在Kubernetes叢集中使用Redis部署PHP留言簿應用 實驗目標 啟動一個Redis Master 啟動一個Redis Slave 啟動guestbook程式 展示和檢視前端服務

kubernetes集群中部署php應用

支持 gis serve php-fpm nginx配置 map metadata dfa aml 本文將介紹在kubernetes環境中部署一套php應用系統。前端web采用nginx、中間件php以fastcgi的方式運行,後臺數據庫由mysql主從提供支撐。各服務組件

使用Jenkins進行持續構建與釋出應用Kubernetes集中

本文已歸檔到kubernetes-handbook中的【最佳實踐—使用Jenkins進行持續構建與釋出】章節中,一切內容以kubernetes-handbook中穩準。 我們基於Jenkins的CI/

攜程 Apollo 配置中心 | 學習筆記(六) | 詳細介紹攜程Apollo配置中心部署Kubernetes集中

專欄目錄:歡迎關注個人公眾號:  Coder程式設計歡迎關注個人網站:www.52melrin.com以上為之前寫的攜程Apollo配置中心相關文章,有需要,請自行查閱接下來將介紹攜程Apollo配置中心部署至Kubernetes叢集中注意:這裡需要有一定的Kubernete

新增calico到現有的kubernetes集中

譯自:http://docs.projectcalico.org/v1.5/getting-started/kubernetes/installation/ 要求: 1.已存在的k8s叢集版本大於v1.1,想要使用NetworkPolicy,需要大於v1.3.0 2.可以被

初試 Kubernetes 集中 Spinnaker 平臺之叢集管理

目錄 1、Spinnaker 叢集管理介紹 Spinnaker 是 Netflix 的開源專案,是一個持續交付平臺,它提供在多種平臺上實現開箱即用的叢集管理和部署功能的平臺。我們可以通過其強大的叢集管理特性,來檢視和管理叢集中的資源。叢集管理

Kubernetes集中,Node異常時Pod狀態分析

摘要:Kubernetes叢集中Node NotReady是經常遇到的現象,我們

開發筆記13 | 部署 Node.js 應用程式到雲 ECS

<<系列文章集 前言 在之前的一篇文章中,我們介紹了 如何將一個本地的 Java 應用程式直接部署到阿里雲 ECS ,有不少讀者反饋,在本文中,我們來介紹如何部署 Node.js 應用程式到阿里雲 ECS。 本地開發 本文采用一個極其基礎的樣例《在 Web 頁面列印 HelloWorl

Kubernetes(k8s)中文文件 應用程式相關的故障排查_Kubernetes中文社群

譯者:林帆 這個小節將幫助讀者除錯部署在Kubernetes的應用程式執行不正常的情況。本篇並不會包含如何除錯叢集組建過程中出現錯誤的問題,這些內容在文件的下一節中進行介紹。 內容提要 應用程式故障排查 常見問題 故障診斷 排查Pods的故障 Pod始終處於Pending狀態 Pod始終處於

雲發現服務 用於在動態環境中部署Connext DDS應用程式的獨立應用程式,包括UDP / IP多播不可用的情況

在基於雲的環境中配置發現的開箱即用解決方案 介紹 RTI Cloud Discovery Service是在無法使用UDP / IP多播的動態環境中部署RTIConnext®DDS應用程式所需的獨立應用程式。 這是典型的廣域網或某些基於雲的環境,其中路由器和交換機可能會禁

生成、打包、部署和管理應用程式及型別(上)

1    生成、打包、部署和管理應用程式及型別 1.1   .net framework 部署目標 Windows一直不穩定和過於複雜(其實也很封閉,逐漸開放,如core),微軟認為主要原因是: (1)應用程式來自微軟或其他廠商的dll,多個廠商的程式碼

生成、打包、部署和管理應用程式及型別(下)

1.1   將模組合併成程式集 Clr操作的是程式集。它會載入包含清單元素據表的檔案,根據清單來獲取程式集中的其他檔名稱。程式集特點: (1)定義了可重用的型別 (2)用一個版本標記 (3)可以關聯安全資訊 使用程式集的好處: (1)不同的型別用不同的檔案,使檔案能以增量方式下

[php]wmap應用程式無法啟動解決辦法

       在安裝wamp的過程中,想必許多人都遇到了這個問題。我也在網上看了很多解決方法。下面這個教程說的解決方法比較全面: 在檢查了上面三個步驟之後仍然有問題,於是逛了逛wamp的論壇,發

在Windows平臺用visual studio編譯的可執行檔案部署時報:應用程式無法正常啟動0xc000007b(跟DirectX9無關的原因)

最近在做EasyDarwin開源流媒體伺服器Windows版本編譯與部署時發現一個問題,在開發機本機執行都很正常,但是部署到目標機器(未安裝vs等開發環境)時,莫名其妙報出了“應用程式無法正常啟動0xc000007b”的錯誤,網上搜了一遍,大多數解決方案和部落格

websphere8 從安裝到部署 測試叢集應用程式 安裝j2ee程式(非常詳細)

目錄 1. 準備安裝檔案 2. 安裝Installation Manager 3. 為Installation Manager指定安裝資源庫 4. 建立部署管理器概要檔案 5. 建立定製概要檔案並聯合到部署管理器 6. 建立應用伺服器(獨立)概要檔案 7. 合獨立伺服器節

kubernetes官方文件》部署PHP redis 應用Guestbook

本教程向您展示如何使用Kubernetes和Docker構建和部署一個簡單的多層web應用程式。這個示例由以下元件組成: 目標 啟動 Redis master。 啟動 Redis slaves。 啟動 guestbook 前端。 暴露和檢視前端服務。 清理. 準備工作 您需要有一個Ku

《架構系列四:一鍵部署應用到Tomcat集中

基於前面的《架構系列三:使用Keepalived+Nginx+tomcat實現叢集部署》,我們配置了nginx+Tomcat叢集,如果需要在VM1,VM2各部署6個Tomcat,這時候怎麼將應用部署到叢集中呢,如果手動一個一個的部署,那要部署12次,效率非常底,因此我們迫切需要一鍵自動部

PHP集中SESSION共享方案之Redis

我記得我之前有寫過在PHP叢集中使用memcached來共享SESSION的解決方法,其實redis還是一樣!出差在外,咱就別太講究了,碼篇部落格做為睡前甜點吧 搭建PHP叢集的第一步就是設定負載均衡。首先我們需要三臺主機: Nginx負載:192.166.5.111 PHP應用1:192.168.5.1

redisphp 中的應用(string篇)

否則 發現 版本 com 偏移量 .html incrby his num 本文為我閱讀了 redis參考手冊 之後結合 博友的博客 編寫,註意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法) 上一篇:redis 在 php 中

redisphp 中的應用(List篇)

color .com 博客 長度 多個 列表 conn ref ron 本文為我閱讀了 redis參考手冊 之後結合 博友的博客 編寫,註意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法) 目錄: 一、List(列表) 1、LPUS