《kubernetes官方文档》部署PHP redis 应用Guestbook

本教程向您展示如何使用Kubernetes和Docker构建和部署一个简单的多层web应用程序。这个示例由以下组件组成:

目标

  • 启动 Redis master。
  • 启动 Redis slaves。
  • 启动 guestbook 前端。
  • 暴露和查看前端服务。
  • 清理.

准备工作

您需要有一个Kubernetes集群,并且必须配置kubectl命令行工具来与您的集群通信。如果您还没有集群,您可以使用Minikube创建一个集群,或者您可以使用这些Kubernetes平台:

检查版本, 请输入 kubectl version.

下载以下配置文件:

  1. redis-master-deployment.yaml
  2. redis-master-service.yaml
  3. redis-slave-deployment.yaml
  4. redis-slave-service.yaml
  5. frontend-deployment.yaml
  6. frontend-service.yaml

启动 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
    
guestbook/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
    
guestbook/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
    
guestbook/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
    
guestbook/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
    
guestbook/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
    
guestbook/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.
    

下一节

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《kubernetes官方文档》部署PHP redis 应用Guestbook

  • Trackback 关闭
  • 评论 (1)
    • CodeNongXW
    • 2021/08/19 3:14下午

    细节满满,赞!推荐博主使用一个好用的接口管理工具-ApiPost,免费下载使用的,谢谢博主啦

return top