使用 Persistent Disk 和 Cloud SQL 在 GKE 上部署 WordPress


本教程介绍如何使用 MySQL 数据库在 Google Kubernetes Engine (GKE) 上设置单副本 WordPress 部署。您可以使用 Cloud SQL,该服务提供了托管版的 MySQL,因此您无需安装 MySQL。WordPress 使用 PersistentVolumes (PV)PersistentVolumeClaims (PVC) 存储数据。

PV 表示集群中由管理员预配或由 Kubernetes 动态预配的存储卷,用于处理 PVC 中提出的请求。PVC 是由用户发出的某个存储类别的存储请求,可由 PV 处理。PV 和 PVC 独立于 pod 生命周期,其保存的数据不受 pod 重新启动、重新调度甚至删除的影响。WordPress 使用 Persistent Disk 作为存储方案,为 PV 提供支持。

背景

WordPress 是一款博客工具,该工具使用关系型数据库来存储博客文章及其相关的对象和元数据,并使用本地文件系统来存储素材资源(例如博客文章中的图片)。本教程使用 Docker Hub 中的官方 WordPress Docker 映像

通常,容器的根文件系统不适合存储永久性数据。您在 GKE 上运行的容器通常是一次性实体,并且集群管理器可以删除、逐出或重新安排由于节点故障或其他原因而变得不可用的任何容器。当节点发生故障时,保存到容器根文件系统的所有数据都将丢失。

使用由永久性磁盘提供支持的 PV,您可以将 WordPress 平台数据存储在容器之外。这样,即使容器被删除,其数据仍然存在。使用默认存储类别时,如果 pod 被重新安排到另一个节点,您的永久性磁盘(亦即您的数据)不会随 pod 一起移动。有几种不同的转移数据的方法,但这不在本教程探讨范围之内。如需了解详情,请参见具有永久性磁盘的永久性卷

WordPress 需要使用 PV 来存储数据。在本教程中,您将使用默认存储类别来动态创建永久性磁盘,并为部署创建 PVC。

目标

  • 创建 GKE 集群。
  • 创建由永久性磁盘提供支持的 PV 和 PVC。
  • 创建 Cloud SQL for MySQL 实例。
  • 部署 WordPress。
  • 设置您的 WordPress 博客。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  7. 在 Cloud Shell 中,启用 GKE 和 Cloud SQL Admin API:
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

设置您的环境

  1. 在 Cloud Shell 中,设置 Google Cloud CLI 的默认区域:

    gcloud config set compute/region region
    

    请替换以下内容:

    • region:选择离您最近的区域。如需了解详情,请参阅区域和可用区
  2. PROJECT_ID 环境变量设置为您的 Google Cloud 项目 ID (project-id)。

    export PROJECT_ID=project-id
    

  3. GitHub 代码库下载应用清单文件:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 转到包含 wordpress-persistent-disks 文件的目录:

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. 设置 WORKING_DIR 环境变量:

    WORKING_DIR=$(pwd)
    

    在本教程中,您将使用 YAML 格式的清单文件创建 Kubernetes 对象。

创建 GKE 集群

您可以创建一个 GKE 集群来托管您的 WordPress 应用容器。

  • 在 Cloud Shell 中,创建一个名为 persistent-disk-tutorial 的 GKE 集群:

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create-auto $CLUSTER_NAME
    

    创建后,连接到新集群:

    gcloud container clusters get-credentials $CLUSTER_NAME --region REGION
    

创建由永久性磁盘提供支持的 PV 和 PVC

创建一个 PVC 作为 WordPress 所需的存储空间。GKE 安装了默认的 StorageClass 资源,可让您动态预配由永久性磁盘提供支持的 PV。您可以使用 wordpress-volumeclaim.yaml 文件来创建部署所需的 PVC。

此清单文件描述的是请求 200 GB 存储空间的 PVC。StorageClass 资源尚未在该文件中定义,因此该 PVC 使用默认的 StorageClass 资源来预配由永久性磁盘提供支持的 PV。

  1. 在 Cloud Shell 中,部署该清单文件:

    kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
    

    预配由永久性磁盘提供支持的 PV 并将其绑定到您的 PVC 最多可能需要 10 秒钟。您可以使用以下命令检查状态:

    kubectl get persistentvolumeclaim
    

    输出显示状态为 Pending 的 PersistentVolumeClaim,类似于以下内容:

    NAME                    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Pending                                      standard-rwo   5s
    

    此 PersistentVolumeClaim 将保持 Pending 状态,直到您在本教程的后面部分使用它为止。

创建 Cloud SQL for MySQL 实例

  1. 在 Cloud Shell 中,创建一个名为 mysql-wordpress-instance 的实例:

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. 将实例连接名称添加为环境变量:

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. 为 WordPress 创建一个数据库来存储其数据:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. 为 WordPress 创建一个名为 wordpress 的数据库用户和相应的密码,以便向该实例进行身份验证:

    CLOUD_SQL_PASSWORD=$(openssl rand -base64 18)
    gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \
        --password $CLOUD_SQL_PASSWORD
    

    如果您关闭 Cloud Shell 会话,则会丢失密码。请记下该密码,因为您需要在本教程的后面部分用到它。

您已为新 WordPress 博客设置好了数据库!

部署 WordPress

您必须先部署服务账号,然后才能部署 WordPress。您可以创建一个 Kubernetes Secret 用以保存服务账号凭据,并创建另一个 Secret 来保存数据库凭据。

配置服务账号并创建密钥

  1. 为了让您的 WordPress 应用能够通过 Cloud SQL 代理访问 MySQL 实例,请创建一个服务账号:

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. 将服务账号电子邮件地址添加为环境变量:

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. cloudsql.client 角色添加到您的服务账号:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. 为服务账号创建密钥:

    gcloud iam service-accounts keys create $WORKING_DIR/key.json \
        --iam-account $SA_EMAIL
    

    此命令会下载 key.json 文件的副本。

  5. 为 MySQL 凭据创建 Kubernetes Secret

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. 为服务账号凭据创建 Kubernetes Secret:

    kubectl create secret generic cloudsql-instance-credentials \
        --from-file $WORKING_DIR/key.json
    

部署 WordPress

下一步是将您的 WordPress 容器部署到 GKE 集群中。

wordpress_cloudsql.yaml 清单文件描述了一个 Deployment,该 Deployment 创建一个运行包含 WordPress 实例的容器的 pod。此容器会读取 WORDPRESS_DB_PASSWORD 环境变量,该变量包含您创建的 cloudsql-db-credentials Secret。

此清单文件还对 WordPress 容器进行了配置,使其通过辅助容器中运行的 Cloud SQL 代理与 MySQL 通信。主机地址值是在 WORDPRESS_DB_HOST 环境变量中设置的。

  1. 替换 INSTANCE_CONNECTION_NAME 环境变量,准备文件:

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. 部署 wordpress_cloudsql.yaml 清单文件:

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    在将永久性磁盘挂接到计算节点时,部署此清单文件需要几分钟的时间。

  3. 监视该部署,直至其状态变为 running

    kubectl get pod -l app=wordpress --watch
    

    当输出显示 Running 状态时,您可以继续执行下一步。

    NAME                     READY     STATUS    RESTARTS   AGE
    wordpress-387015-02xxb   2/2       Running   0          2m47s
    

公开 WordPress 服务

在上一步中,您部署了 WordPress 容器,但目前无法从集群外部访问该容器,因为它没有外部 IP 地址。若要将 WordPress 应用公开给来自互联网的流量,您可以创建 Kubernetes Service 并给 Kubernetes Service 配置连接的外部负载平衡器。如需详细了解如何在 GKE 中使用 Service 公开应用,请参阅方法指南

  1. 创建一个 type:LoadBalancer Service

    kubectl create -f $WORKING_DIR/wordpress-service.yaml
    

    创建负载平衡器需要几分钟时间。

  2. 监视该部署,并等待系统为该服务分配外部 IP 地址:

    kubectl get svc -l app=wordpress --watch
    
  3. 当输出显示外部 IP 地址时,您可以继续执行下一步。请注意,您的外部 IP 与以下示例不同。

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 记下 EXTERNAL_IP 地址字段以便稍后使用。

设置您的 WordPress 博客

在此部分中,您将设置 WordPress 博客。

  1. 在浏览器中,转到以下网址,将 external-ip-address 替换为公开 WordPress 实例的服务的 EXTERNAL_IP 地址:

    http://external-ip-address
    
  2. WordPress installation 页面上,选择一种语言,然后点击 Continue

  3. Information needed 页面中填写相应信息,然后点击 Install WordPress

  4. 点击 Log In

  5. 输入您之前创建的用户名和密码。

  6. 您现在有了一个博客网站。若要访问您的博客,请在浏览器中访问以下网址:

    http://external-ip-address
    

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

逐个删除资源

如果您使用的是现有项目,并且不想将其删除,请逐个删除资源。

  1. 删除服务:

    kubectl delete service wordpress
    

    等待系统完成删除为 wordpress Service 预配的负载平衡器。负载平衡器会在后台被异步删除。

    监视删除过程:

    watch gcloud compute forwarding-rules list
    

    当您看到以下输出时,即表示负载平衡器已被删除:

    Listed 0 items.
    
  2. 删除 Deployment:

    kubectl delete deployment wordpress
    
  3. 删除用于 WordPress 的 PVC:

    kubectl delete pvc wordpress-volumeclaim
    

    此命令还会自动删除 PV 和永久性磁盘。

  4. 删除 GKE 集群:

    gcloud container clusters delete $CLUSTER_NAME
    
  5. 删除 Cloud SQL 实例:

    gcloud sql instances delete $INSTANCE_NAME
    
  6. 从服务账号中移除角色:

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. 删除服务账号:

    gcloud iam service-accounts delete $SA_EMAIL
    

后续步骤