本教程介绍如何使用 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,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,并移除与该项目关联的所有资源。转到“项目选择器”确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
- 在 Google Cloud 控制台中,激活 Cloud Shell。激活 Cloud ShellCloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
- 在 Cloud Shell 中,启用 GKE 和 Cloud SQL Admin API:
设置您的环境
- 在 Cloud Shell 中,设置 Google Cloud CLI 的默认区域:gcloud config set compute/region region 请替换以下内容:region:选择离您最近的区域。如需了解详情,请参阅区域和可用区。
- 将 PROJECT_ID 环境变量设置为您的 Google Cloud 项目 ID (project-id)。export PROJECT_ID=project-id
- 从 GitHub 代码库下载应用清单文件:git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
- 转到包含 wordpress-persistent-disks 文件的目录:cd kubernetes-engine-samples/wordpress-persistent-disks
- 设置 WORKING_DIR 环境变量:WORKING_DIR=$(pwd)在本教程中,您将使用 YAML 格式的清单文件创建 Kubernetes 对象。
创建 GKE 集群
您可以创建一个 GKE 集群来托管您的 WordPress 应用容器。
- 在 Cloud Shell 中,创建一个名为 persistent-disk-tutorial 的 GKE 集群:CLUSTER_NAME=persistent-disk-tutorialgcloud 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。
- 在 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 实例
- 在 Cloud Shell 中,创建一个名为 mysql-wordpress-instance 的实例:INSTANCE_NAME=mysql-wordpress-instancegcloud sql instances create $INSTANCE_NAME
- 将实例连接名称添加为环境变量:export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME --format='value(connectionName)')
- 为 WordPress 创建一个数据库来存储其数据:gcloud sql databases create wordpress --instance $INSTANCE_NAME
- 为 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 来保存数据库凭据。
配置服务帐号并创建密钥
- 为了让您的 WordPress 应用能够通过 Cloud SQL 代理访问 MySQL 实例,请创建一个服务帐号:SA_NAME=cloudsql-proxygcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
- 将服务帐号电子邮件地址添加为环境变量:SA_EMAIL=$(gcloud iam service-accounts list --filter=displayName:$SA_NAME --format='value(email)')
- 将 cloudsql.client 角色添加到您的服务帐号:gcloud projects add-iam-policy-binding $PROJECT_ID --role roles/cloudsql.client --member serviceAccount:$SA_EMAIL
- 为服务帐号创建密钥:gcloud iam service-accounts keys create $WORKING_DIR/key.json --iam-account $SA_EMAIL此命令会下载 key.json 文件的副本。
- 为 MySQL 凭据创建 Kubernetes Secret:kubectl create secret generic cloudsql-db-credentials --from-literal username=wordpress --from-literal password=$CLOUD_SQL_PASSWORD
- 为服务帐号凭据创建 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
环境变量中设置的。
- 替换 INSTANCE_CONNECTION_NAME 环境变量,准备文件:cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > $WORKING_DIR/wordpress_cloudsql.yaml
- 部署 wordpress_cloudsql.yaml 清单文件:kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml在将永久性磁盘挂接到计算节点时,部署此清单文件需要几分钟的时间。
- 监视该部署,直至其状态变为 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 公开应用,请参阅方法指南。
- 创建一个 type:LoadBalancer Service:kubectl create -f $WORKING_DIR/wordpress-service.yaml创建负载平衡器需要几分钟时间。
- 监视该部署,并等待系统为该服务分配外部 IP 地址:kubectl get svc -l app=wordpress --watch
- 当输出显示外部 IP 地址时,您可以继续执行下一步。请注意,您的外部 IP 与以下示例不同。NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress 10.51.243.233 203.0.113.3 80:32418/TCP 1m
- 记下 EXTERNAL_IP 地址字段以便稍后使用。
- 警告:不要在按住页面上将您的 WordPress 安装交托给会公开集群的负载均衡器。其他访问者可以在您的集群上设置网站,并使用该网站来提供潜在的恶意内容。您可以继续设置 WordPress 博客或清理此部署。
设置您的 WordPress 博客
在此部分中,您将设置 WordPress 博客。
- 在浏览器中,转到以下网址,将 external-ip-address 替换为公开 WordPress 实例的服务的 EXTERNAL_IP 地址:http://external-ip-address
- 在 WordPress installation 页面上,选择一种语言,然后点击 Continue。
- 在 Information needed 页面中填写相应信息,然后点击 Install WordPress。
- 点击 Log In。
- 输入您之前创建的用户名和密码。
- 您现在有了一个博客网站。若要访问您的博客,请在浏览器中访问以下网址:http://external-ip-address
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
警告:删除项目会产生以下影响项目中的所有内容都会被删除。如果您将现有项目用于本教程,则在删除该项目后,还将删除您已在该项目中完成的任何其他工作。自定义项目 ID 丢失。创建此项目时,您可能创建了要在将来使用的自定义项目 ID。要保留使用该项目 ID 的网址(例如 appspot.com 网址),请删除项目内的所选资源,而不是删除整个项目。
- 在 Google Cloud 控制台中,转到管理资源页面:
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
逐个删除资源
如果您使用的是现有项目,并且不想将其删除,请逐个删除资源。
- 删除服务:kubectl delete service wordpress等待系统完成删除为 wordpress Service 预配的负载平衡器。负载平衡器会在后台被异步删除。监视删除过程:watch gcloud compute forwarding-rules list当您看到以下输出时,即表示负载平衡器已被删除:Listed 0 items.
- 删除 Deployment:kubectl delete deployment wordpress
- 删除用于 WordPress 的 PVC:kubectl delete pvc wordpress-volumeclaim此命令还会自动删除 PV 和永久性磁盘。
- 删除 GKE 集群:gcloud container clusters delete $CLUSTER_NAME
- 删除 Cloud SQL 实例:gcloud sql instances delete $INSTANCE_NAME
- 从服务帐号中移除角色:gcloud projects remove-iam-policy-binding $PROJECT_ID --role roles/cloudsql.client --member serviceAccount:$SA_EMAIL
- 删除服务帐号:gcloud iam service-accounts delete $SA_EMAIL