本教程介绍了如何使用 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 使用永久性磁盘作为存储空间来为 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 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- 在 Cloud Shell 中,启用 GKE 和 Cloud SQL Admin API:
gcloud services enable container.googleapis.com sqladmin.googleapis.com
设置您的环境
在 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/quickstarts/wordpress-persistent-disks
设置
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。
在 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-instance gcloud 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-proxy gcloud 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 博客。
在浏览器中,转到以下网址,将 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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
逐个删除资源
如果您使用的是现有项目,并且不想将其删除,请逐个删除资源。
删除服务:
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
后续步骤
- 为您的应用配置静态 IP 和域名。
浏览其他 Kubernetes Engine 教程。
探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud 架构中心。