--- title: 示例:使用 Persistent Volumes 部署 WordPress 和 MySQL content_type: tutorial weight: 20 card: name: tutorials weight: 40 title: "有状态应用示例: 带持久卷的 Wordpress" --- 本示例描述了如何通过 Minikube 在 Kubernetes 上安装 WordPress 和 MySQL。这两个应用都使用 PersistentVolumes 和 PersistentVolumeClaims 保存数据。 [PersistentVolume](/zh/docs/concepts/storage/persistent-volumes/)(PV)是一块集群里由管理员手动提供,或 kubernetes 通过 [StorageClass](/zh/docs/concepts/storage/storage-classes) 动态创建的存储。 [PersistentVolumeClaim](/zh/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)(PVC)是一个满足对 PV 存储需要的请求。PersistentVolumes 和 PersistentVolumeClaims 是独立于 Pod 生命周期而在 Pod 重启,重新调度甚至删除过程中保存数据。 {{< warning >}} deployment 在生产场景中并不适合,它使用单实例 WordPress 和 MySQL Pods。考虑使用 [WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress) 在生产场景中部署 WordPress。 {{< /warning >}} {{< note >}} 本教程中提供的文件使用 GA Deployment API,并且特定于 kubernetes 1.9 或更高版本。如果您希望将本教程与 Kubernetes 的早期版本一起使用,请相应地更新 API 版本,或参考本教程的早期版本。 {{< /note >}} ## {{% heading "objectives" %}} * 创建 PersistentVolumeClaims 和 PersistentVolumes * 创建 `kustomization.yaml` 使用 * Secret 生成器 * MySQL 资源配置 * WordPress 资源配置 * 应用整个 kustomization 目录 `kubectl apply -k ./` * 清理 ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} 此例在`kubectl` 1.14 或者更高版本有效。 下载下面的配置文件: 1. [mysql-deployment.yaml](/examples/application/wordpress/mysql-deployment.yaml) 2. [wordpress-deployment.yaml](/examples/application/wordpress/wordpress-deployment.yaml) ## 创建 PersistentVolumeClaims 和 PersistentVolumes MySQL 和 Wordpress 都需要一个 PersistentVolume 来存储数据。他们的 PersistentVolumeClaims 将在部署步骤中创建。 许多群集环境都安装了默认的 StorageClass。如果在 PersistentVolumeClaim 中未指定 StorageClass,则使用群集的默认 StorageClass。 创建 PersistentVolumeClaim 时,将根据 StorageClass 配置动态设置 PersistentVolume。 {{< warning >}} 在本地群集中,默认的 StorageClass 使用`hostPath`供应器。 `hostPath`卷仅适用于开发和测试。使用 `hostPath` 卷,您的数据位于 Pod 调度到的节点上的`/tmp`中,并且不会在节点之间移动。如果 Pod 死亡并被调度到群集中的另一个节点,或者该节点重新启动,则数据将丢失。 {{< /warning >}} {{< note >}} 如果要建立需要使用`hostPath`设置程序的集群,则必须在 controller-manager 组件中设置`--enable-hostpath-provisioner`标志。 {{< /note >}} {{< note >}} 如果你已经有运行在 Google Kubernetes Engine 的集群,请参考 [this guide](https://cloud.google.com/kubernetes-engine/docs/tutorials/persistent-disk)。 {{< /note >}} ## 创建 kustomization.yaml ### 创建 Secret 生成器 A [Secret](/zh/docs/concepts/configuration/secret/) 是存储诸如密码或密钥之类的敏感数据的对象。从 1.14 开始,`kubectl`支持使用 kustomization 文件管理 Kubernetes 对象。您可以通过`kustomization.yaml`中的生成器创建一个 Secret。 通过以下命令在`kustomization.yaml`中添加一个 Secret 生成器。您需要用您要使用的密码替换`YOUR_PASSWORD`。 ```shell cat <./kustomization.yaml secretGenerator: - name: mysql-pass literals: - password=YOUR_PASSWORD EOF ``` ## 补充 MySQL 和 WordPress 的资源配置 以下 manifest 文件描述了单实例 MySQL 部署。MySQL 容器将 PersistentVolume 挂载在`/var/lib/mysql`。 `MYSQL_ROOT_PASSWORD`环境变量设置来自 Secret 的数据库密码。 {{< codenew file="application/wordpress/mysql-deployment.yaml" >}} 以下 manifest 文件描述了单实例 WordPress 部署。WordPress 容器将网站数据文件位于`/var/www/html`的 PersistentVolume。`WORDPRESS_DB_HOST`环境变量集上面定义的 MySQL Service 的名称,WordPress 将通过 Service 访问数据库。`WORDPRESS_DB_PASSWORD`环境变量设置从 Secret kustomize 生成的数据库密码。 {{< codenew file="application/wordpress/wordpress-deployment.yaml" >}} 1. 下载 MySQL deployment 配置文件。 ```shell curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml ``` 2. 下载 WordPress 配置文件。 ```shell curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml ``` 3. 补充到 `kustomization.yaml` 文件。 ```shell cat <>./kustomization.yaml resources: - mysql-deployment.yaml - wordpress-deployment.yaml EOF ``` ## 应用和验证 `kustomization.yaml`包含用于部署 WordPress 网站的所有资源以及 MySQL 数据库。您可以通过以下方式应用目录 ```shell kubectl apply -k ./ ``` 现在,您可以验证所有对象是否存在。 1. 通过运行以下命令验证 Secret 是否存在: ```shell kubectl get secrets ``` 响应应如下所示: ```shell NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9s ``` 2. 验证是否已动态配置 PersistentVolume: ```shell kubectl get pvc ``` {{< note >}} 设置和绑定 PV 可能要花费几分钟。 {{< /note >}} 响应应如下所示: ```shell NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s ``` 3. 通过运行以下命令来验证 Pod 是否正在运行: ```shell kubectl get pods ``` {{< note >}} 等待 Pod 状态变成`RUNNING`可能会花费几分钟。 {{< /note >}} 响应应如下所示: ``` NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s ``` 4. 通过运行以下命令来验证 Service 是否正在运行: ```shell kubectl get services wordpress ``` 响应应如下所示: ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress ClusterIP 10.0.0.89 80:32406/TCP 4m ``` {{< note >}} Minikube 只能通过 NodePort 公开服务。EXTERNAL-IP 始终处于挂起状态 {{< /note >}} 5. 运行以下命令以获取 WordPress 服务的 IP 地址: ```shell minikube service wordpress --url ``` 响应应如下所示: ``` http://1.2.3.4:32406 ``` 6. 复制 IP 地址,然后将页面加载到浏览器中来查看您的站点。 您应该看到类似于以下屏幕截图的 WordPress 设置页面。 ![wordpress-init](https://raw.githubusercontent.com/kubernetes/examples/master/mysql-wordpress-pd/WordPress.png) {{< warning >}} 不要在此页面上保留 WordPress 安装。如果其他用户找到了它,他们可以在您的实例上建立一个网站并使用它来提供恶意内容。

通过创建用户名和密码来安装 WordPress 或删除您的实例。 {{< /warning >}} ## {{% heading "cleanup" %}} 1. 运行一下命令删除您的 Secret,Deployments,Services and PersistentVolumeClaims: ```shell kubectl delete -k ./ ``` ## {{% heading "whatsnext" %}} * 了解更多关于 [Introspection and Debugging](/zh/docs/tasks/debug-application-cluster/debug-application-introspection/) * 了解更多关于 [Jobs](/zh/docs/concepts/workloads/controllers/jobs-run-to-completion/) * 了解更多关于 [Port Forwarding](/zh/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) * 了解如何 [Get a Shell to a Container](/zh/docs/tasks/debug-application-cluster/get-shell-running-container/)