使用永久性磁盘和 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 使用 Google 永久性磁盘作为存储方案,为 PVs 提供支持。

背景

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

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

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

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

目标

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

费用

本教程使用 Google Cloud 的以下收费组件:

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

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 在 Cloud Console 中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Cloud Console 的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Cloud SDK 的 Shell 环境,其中包括 gcloud 命令行工具以及已为当前项目设置的值。该会话可能需要几秒钟时间来完成初始化。

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

设置环境

  1. 在 Cloud Shell 中,为 gcloud 命令行工具设置默认地区:

    gcloud config set compute/zone zone
    

    替换以下内容:

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

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

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

    WORKING_DIR=$(pwd)
    

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

创建 GKE 集群

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

  • 在 Cloud Shell 中,创建一个名为 persistent-disk-tutorial 的集群,其中包含三个节点:

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create $CLUSTER_NAME \
        --num-nodes=3 --enable-autoupgrade --no-enable-basic-auth \
        --no-issue-client-certificate --enable-ip-alias --metadata \
        disable-legacy-endpoints=true
    

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

为了创建 WordPress 所需的存储空间,您需要创建一个 PVC。 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 秒钟。

    该过程完成后,输出会类似于以下内容:

    NAME                    STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Bound     pvc-89d49350-3c44-11e8-80a6-42010a800002   200G       RWO            standard       5s
    

创建 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 创建一个名为 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 $DEVSHELL_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 清单文件描述了一个部署,该部署创建一个运行包含 WordPress 实例的容器的 pod。此容器会读取 WORDPRESS_DB_PASSWORD 环境变量,该变量包含您创建的 cloudsql-db-credentials Secret。

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

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

    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
    

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

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

公开 WordPress 服务

在上一步中,您部署了 WordPress 容器,但目前无法从集群外部访问该容器,因为它没有外部 IP 地址。您可以通过创建和配置负载平衡器,向来自互联网的流量公开您的 WordPress 应用。

  1. 创建一项 type:LoadBalancer 服务

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

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

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

    kubectl get svc -l app=wordpress --watch
    
  3. 当输出显示外部 IP 地址时,您可以继续执行下一步:

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 请记下该 IP 地址,稍后您将用到它。

设置您的 WordPress 博客

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

  1. 在浏览器中,转到以下网址(将 external-ip-address 替换为公开 WordPress 实例的服务的外部 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 Platform 帐号产生费用,请执行以下操作:

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

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

逐个删除资源

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

  1. 删除服务:

    kubectl delete service wordpress
    

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

    监视删除过程:

    watch gcloud compute forwarding-rules list
    

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

    Listed 0 items.
    
  2. 删除该部署:

    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 $DEVSHELL_PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. 删除服务帐号:

    gcloud iam service-accounts delete $SA_EMAIL
    

后续步骤