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

guestbook/redis-master-deployment.yaml 《kubernetes官方文档》部署PHP redis 应用Guestbook
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-NAME替换为您的Pod名称。

创建 Redis Master 服务

guestbook 应用程序需要与Redis master通信来写数据。您需要使用一个服务来将流量代理到Redis master Pod。服务定义了访问这些Pods的策略。

guestbook/redis-master-service.yaml 《kubernetes官方文档》部署PHP redis 应用Guestbook
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。

启动Redis Slaves

尽管Redis master是一个单一的pod,但是您可以通过添加副本的Redis slaves来实现它的高可用性。

创建 Redis Slave 部署(Deployment)

部署规模基于清单文件中配置。在本例中,部署对象指定两个副本。

如果没有运行任何副本,这个部署将在您的容器集群上启动两个副本。相反,如果有两个以上的副本正在运行,那么它将缩减到两个运行副本。

guestbook/redis-slave-deployment.yaml 《kubernetes官方文档》部署PHP redis 应用Guestbook
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

创建 Redis Slave服务

guestbook 应用程序需要与Redis slaves 进行通信,以读取数据。为了让Redis slaves可发现,你需要建立一个服务。该服务为一组Pods提供透明的负载平衡。

guestbook/redis-slave-service.yaml 《kubernetes官方文档》部署PHP redis 应用Guestbook
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

设置并暴露Guestbook的前端

guestbook 应用程序有一个web前端,它提供用PHP编写的HTTP请求。它被配置为连接到用于写请求的redis-master服务,以及用于读取请求的redis-slave 服务。

创建Guestbook前端部署

guestbook/frontend-deployment.yaml 《kubernetes官方文档》部署PHP redis 应用Guestbook
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

创建前端服务

您所应用的redis-slaveredis-master服务只能在容器集群中访问,因为服务的缺省类型是ClusterIPClusterIP为服务指向的一组Pods提供一个单一的IP地址。这个IP地址只能在集群中访问。

如果您希望客户能够访问您的guestbook,那么您必须将前端服务配置为外部可见,以便客户端可以从容器集群外部请求服务。Minikube只能通过NodePort公开服务。

注意:一些云计算提供商,比如Google Compute Engine或Google Kubernetes引擎,支持外部负载平衡器。如果你的云服务提供商支持负载平衡器,你想要使用它,简单地删除或注释掉type: NodePort并且去掉type: LoadBalancer的注释。

guestbook/frontend-service.yaml 《kubernetes官方文档》部署PHP redis 应用Guestbook
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

通过NodePort查看前端服务

如果您将此应用程序部署到Minikube或本地集群,您需要找到IP地址来查看您的Guestbook。

通过LoadBalancer查看前端服务

如果你通过type: LoadBalancer部署frontend-service.yaml,你需要找到IP地址来查看你的Guestbook

扩展Web 前端

向上或向下扩展很容易,因为您的服务器被定义为使用部署控制器( Deployment controller)的服务。

清理

删除部署和服务也会删除任何运行的Pods。使用一个命令使用标签来删除多个资源.

下一节

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98144.html

(0)
上一篇 2021年8月20日 22:10
下一篇 2021年8月20日 22:26

相关推荐

发表回复

登录后才能评论

WordPress 数据库错误: [Duplicate entry '81-7bc5f87d83893fa5db53603967a72d35' for key 'task_id_source_url_key']
insert into wp_autoblog_queue(task_id,source_url,source_url_key,create_date_time,not_check_stoped,post_interval) values(81,'http://www.52im.net/forum.php?mod=collection&action=view&ctid=16&page=3','7bc5f87d83893fa5db53603967a72d35',1735189327,0,0)