2020-07-04 13:18:34 +00:00
---
2020-07-04 15:44:50 +00:00
title: "例: Persistent Volumeを使用したWordpressとMySQLをデプロイする"
2020-07-04 13:18:34 +00:00
content_type: tutorial
weight: 20
card:
name: tutorials
weight: 40
2020-07-04 15:44:50 +00:00
title: "ステートフルの例: Persistent Volumeを使用したWordpress"
2020-07-04 13:18:34 +00:00
---
<!-- overview -->
2020-07-04 15:44:50 +00:00
このチュートリアルでは、WordPressのサイトとMySQLデータベースをMinikubeを使ってデプロイする方法を紹介します。2つのアプリケーションとも、データを保存するためにPersistentVolumeとPersistentVolumeClaimを使用します。
2020-07-04 13:18:34 +00:00
2020-07-07 17:01:00 +00:00
[PersistentVolume ](/ja/docs/concepts/storage/persistent-volumes/ )(PV)とは、管理者が手動でプロビジョニングを行うか、[StorageClass](/docs/concepts/storage/storage-classes)を使ってKubernetesによって動的にプロビジョニングされた、クラスター内のストレージの一部です。[PersistentVolumeClaim](/ja/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)(PVC)は、PVによって満たすことができる、ユーザーによるストレージへのリクエストのことです。PersistentVolumeとPersistentVolumeClaimは、Podのライフサイクルからは独立していて、Podの再起動、Podの再スケジューリング、さらにはPodの削除が行われたとしても、その中のデータは削除されずに残ります。
2020-07-04 13:18:34 +00:00
{{< warning > }}
2020-07-04 15:44:50 +00:00
シングルインスタンスのWordPressとMySQLのPodを使用しているため、ここで行うデプロイは本番のユースケースには適しません。WordPressを本番環境にデプロイするときは、[WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress)を使用することを検討してください。
2020-07-04 13:18:34 +00:00
{{< / warning > }}
{{< note > }}
2020-07-07 16:59:17 +00:00
このチュートリアルで提供されるファイルは、GAとなっているDeployment APIを使用しているため、Kubernetesバージョン1.9以降のためのものになっています。もしこのチュートリアルを古いバージョンのKubernetesで使いたい場合は、APIのバージョンを適切にアップデートするか、このチュートリアルの古いバージョンを参照してください。
2020-07-04 13:18:34 +00:00
{{< / note > }}
## {{% heading "objectives" %}}
2020-07-04 15:44:50 +00:00
* PersistentVolumeClaimとPersistentVolumeを作成する
* 以下を含む`kustomization.yaml`を作成する
* Secret generator
* MySQLリソースの設定
* WordPressリソースの設定
* kustomizationディレクトリを`kubectl apply -k ./`で適用する
* クリーンアップする
2020-07-04 13:18:34 +00:00
## {{% heading "prerequisites" %}}
{{< include " task-tutorial-prereqs . md " > }} {{< version-check > }}
2020-07-04 15:44:50 +00:00
このページで示された例は、`kubectl` 1.14以降で動作します。
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
以下の設定ファイルをダウンロードします。
2020-07-04 13:18:34 +00:00
1. [mysql-deployment.yaml ](/examples/application/wordpress/mysql-deployment.yaml )
1. [wordpress-deployment.yaml ](/examples/application/wordpress/wordpress-deployment.yaml )
<!-- lessoncontent -->
2020-07-04 15:44:50 +00:00
## PersistentVolumeClaimとPersistentVolumeを作成する
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
MySQLとWordpressはそれぞれ、データを保存するためのPersistentVolumeを必要とします。各PersistentVolumeClaimはデプロイの段階で作成されます。
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
多くのクラスタ環境では、デフォルトのStorageClassがインストールされています。StorageClassがPersistentVolumeClaim中で指定されていなかった場合、クラスターのデフォルトのStorageClassが代わりに使われます。
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
PersistentVolumeClaimが作成されるとき、StorageClassの設定に基づいてPersistentVolumeが動的にプロビジョニングされます。
2020-07-04 13:18:34 +00:00
{{< warning > }}
2020-07-04 15:44:50 +00:00
ローカルのクラスターでは、デフォルトのStorageClassには`hostPath`プロビジョナーが使われます。`hostPath`ボリュームは開発およびテストにのみ適しています。`hostPath`ボリュームでは、データはPodがスケジュールされたノ ード上の`/tmp`内に保存されます。そのため、もしPodが死んだり、クラスター上の他のノ ードにスケジュールされたり、ノ ードが再起動すると、データは失われます。
2020-07-04 13:18:34 +00:00
{{< / warning > }}
{{< note > }}
2020-07-07 17:01:00 +00:00
`hostPath` プロビジョナーを使用する必要があるクラスターを立ち上げたい場合は、`--enable-hostpath-provisioner`フラグを `controller-manager` コンポーネントで設定する必要があります。
2020-07-04 13:18:34 +00:00
{{< / note > }}
{{< note > }}
2020-07-04 15:44:50 +00:00
Google Kubernetes Engine上で動作するKubernetesクラスターを使っている場合は、[このガイド](https://cloud.google.com/kubernetes-engine/docs/tutorials/persistent-disk?hl=ja)に従ってください。
2020-07-04 13:18:34 +00:00
{{< / note > }}
2020-07-04 15:44:50 +00:00
## kustomization.yamlを作成する
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
### Secret generatorを追加する
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
[Secret ](/docs/concepts/configuration/secret/ )とは、パスワードやキーのような機密性の高いデータ片を保存するためのオブジェクトです。バージョン1.14からは、`kubectl`がkustomizationファイルを使用したKubernetesオブジェクトの管理をサポートしています。`kustomization.yaml`内のgeneratorによってSecretを作成することができます。
以下のコマンドを実行して、`kustomization.yaml`の中にSecret generatorを追加します。`YOUR_PASSWORD`の部分を使いたいパスワードに置換してください。
2020-07-04 13:18:34 +00:00
```shell
cat < < EOF > ./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=YOUR_PASSWORD
EOF
```
2020-07-04 15:44:50 +00:00
## MySQLとWordPressのためのリソースの設定を追加する
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
以下のマニフェストには、シングルインスタンスのMySQLのDeploymentが書かれています。MySQLコンテナはPersistentVolumeを`/var/lib/mysql`にマウントします。`MYSQL_ROOT_PASSWORD`環境変数には、Secretから得られたデータベースのパスワードが設定されます。
2020-07-04 13:18:34 +00:00
{{< codenew file = "application/wordpress/mysql-deployment.yaml" > }}
2020-07-07 16:59:17 +00:00
以下のマニフェストには、シングルインスタンスのWordPressのDeploymentが書かれています。WordPressコンテナはPersistentVolumeをウェブサイトのデータファイルのために`/var/www/html`にマウントします。`WORDPRESS_DB_HOST`環境変数に上で定義したMySQLのServiceの名前を設定すると、WordPressはServiceによってデータベースにアクセスします。`WORDPRESS_DB_PASSWORD`環境変数には、kustomizeが生成したSecretから得たデータベースのパスワードが設定されます。
2020-07-04 15:44:50 +00:00
2020-07-04 13:18:34 +00:00
{{< codenew file = "application/wordpress/wordpress-deployment.yaml" > }}
2020-07-04 15:44:50 +00:00
1. MySQLのDeploymentの設定ファイルをダウンロードします。
2020-07-04 13:18:34 +00:00
```shell
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
```
2020-07-04 15:44:50 +00:00
2. WordPressの設定ファイルをダウンロードします。
2020-07-04 13:18:34 +00:00
```shell
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
```
2020-07-04 15:44:50 +00:00
3. これらを`kustomization.yaml`ファイルに追加します。
2020-07-04 13:18:34 +00:00
```shell
cat < < EOF > >./kustomization.yaml
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
```
2020-07-04 15:44:50 +00:00
## 適用と確認
`kustomization.yaml` には、WordPressのサイトとMySQLデータベースのためのすべてのリソースが含まれています。次のコマンドでこのディレクトリを適用できます。
2020-07-04 13:18:34 +00:00
```shell
kubectl apply -k ./
```
2020-07-04 15:44:50 +00:00
これで、すべてのオブジェクトが存在していることを確認できます。
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
1. 次のコマンドを実行して、Secretが存在していることを確認します。
2020-07-04 13:18:34 +00:00
```shell
kubectl get secrets
```
2020-07-04 15:44:50 +00:00
結果は次のようになるはずです。
2020-07-04 13:18:34 +00:00
```shell
NAME TYPE DATA AGE
mysql-pass-c57bb4t7mf Opaque 1 9s
```
2020-07-04 15:44:50 +00:00
1. 次のコマンドを実行して、PersistentVolumeが動的にプロビジョニングされていることを確認します。
2020-07-04 13:18:34 +00:00
```shell
kubectl get pvc
```
{{< note > }}
2020-07-04 15:44:50 +00:00
PVがプロビジョニングされてバインドされるまでに、最大で数分かかる場合があります。
2020-07-04 13:18:34 +00:00
{{< / note > }}
2020-07-04 15:44:50 +00:00
結果は次のようになるはずです。
2020-07-04 13:18:34 +00:00
```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
```
2020-07-04 15:44:50 +00:00
3. 次のコマンドを実行して、Podが実行中であることを確認します。
2020-07-04 13:18:34 +00:00
```shell
kubectl get pods
```
{{< note > }}
2020-07-04 15:44:50 +00:00
PodのStatusが`Running`の状態になる前に、最大で数分かかる場合があります。
2020-07-04 13:18:34 +00:00
{{< / note > }}
2020-07-04 15:44:50 +00:00
結果は次のようになるはずです。
2020-07-04 13:18:34 +00:00
```
NAME READY STATUS RESTARTS AGE
wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
```
2020-07-04 15:44:50 +00:00
4. 次のコマンドを実行して、Serviceが実行中であることを確認します。
2020-07-04 13:18:34 +00:00
```shell
kubectl get services wordpress
```
2020-07-04 15:44:50 +00:00
結果は次のようになるはずです。
2020-07-04 13:18:34 +00:00
```
2020-09-11 08:33:58 +00:00
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 10.0.0.89 < pending > 80:32406/TCP 4m
2020-07-04 13:18:34 +00:00
```
{{< note > }}
2020-07-04 15:44:50 +00:00
MinikubeではServiceを`NodePort`経由でしか公開できません。EXTERNAL-IPは常にpendingのままになります。
2020-07-04 13:18:34 +00:00
{{< / note > }}
2020-07-04 15:44:50 +00:00
5. 次のコマンドを実行して、WordPress ServiceのIPアドレスを取得します。
2020-07-04 13:18:34 +00:00
```shell
minikube service wordpress --url
```
2020-07-04 15:44:50 +00:00
結果は次のようになるはずです。
2020-07-04 13:18:34 +00:00
```
http://1.2.3.4:32406
```
2020-07-04 15:44:50 +00:00
6. IPアドレスをコピーして、ブラウザーで読み込み、サイトを表示しましょう。
2020-07-04 13:18:34 +00:00
2020-07-04 15:44:50 +00:00
WordPressによりセットアップされた次のスクリーンショットのようなページが表示されるはずです。
2020-07-04 13:18:34 +00:00
![wordpress-init ](https://raw.githubusercontent.com/kubernetes/examples/master/mysql-wordpress-pd/WordPress.png )
{{< warning > }}
2020-07-04 15:44:50 +00:00
WordPressのインストールをこのページのまま放置してはいけません。もしほかのユーザーがこのページを見つけた場合、その人はインスタンス上にウェブサイトをセットアップして、悪意のあるコンテンツの配信に利用できてしまいます。< br / > < br / > ユーザー名とパスワードを決めてWordPressをインストールするか、このインスタンスを削除してください。
2020-07-04 13:18:34 +00:00
{{< / warning > }}
## {{% heading "cleanup" %}}
2020-07-04 15:44:50 +00:00
1. 次のコマンドを実行して、Secret、Deployment、Service、およびPersistentVolumeClaimを削除します。
2020-07-04 13:18:34 +00:00
```shell
kubectl delete -k ./
```
## {{% heading "whatsnext" %}}
2020-07-04 15:44:50 +00:00
* [イントロスペクションとデバッグ ](/docs/tasks/debug-application-cluster/debug-application-introspection/ )についてさらに学ぶ
* [Job ](/docs/concepts/workloads/controllers/job/ )についてさらに学ぶ
* [Portフォワーディング ](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/ )についてさらに学ぶ
* [コンテナへのシェルを取得する ](/ja/docs/tasks/debug-application-cluster/get-shell-running-container/ )方法について学ぶ
2020-07-04 13:18:34 +00:00