kubernetesでwordpress環境を構築する

以前の
<a href ="https://qiita.com/k_r_5376/items/552e4902d41c15d5e745">apacheとphpの環境をkubernetesで構築する</a>
からの続きです。

## ディレクトリ構成
```
$ workspace .
├── app
|   └── wordpressのパッケージ
└── docker
    ├── db
    │   ├── create_schema.sql（新規）
    │   └── Dockerfile（新規）
    ├── apache-php
    │   ├── vhost.conf
    │   └── Dockerfile
    ├── templates
    |   ├── mysql-deploy.yaml（新規）
    |   ├── mysql-pv.yaml（新規）
    |   ├── mysql-pvc-claim.yaml（新規）
    |   ├── mysql-service.yaml（新規）
    |   ├── secret.yaml（新規）
    |   ├── strageclass.yaml（新規）
    |   └── main.yaml
    └── skaffold.yaml
```

## StorageClass
ストレージの種類を示すオブジェクト

```
kubernetes.io/gce-pd
kubernetes.io/aws-ebs
kubernetes.io/glusterfs
```
など

- Provisioner
  - クラウド環境のAPIを呼び出すなどして動的にPersistentVolumeの準備を行う仕組み。

- Dynamic Provisioningとは
  - Persistent Volume Claimを作成した際に、自動的にPersistent Volumeが作成され、またPVCを削除した際にも自動的にPVが削除されるようになります


## PersistentVolumeとは
永続化領域として確保されるVolume

## PersistentVolumeClaimとは
永続化領域の要求を行うリソースで、前述のPersistentVolumeは、PersistentVolumeClaim経由で利用する形になります。

![pv-fig.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113395/9effe673-cb44-04db-c1a2-fbe47ca206cc.jpeg)



## Database作成用のスキーマを準備

```sql:create_schema.sql
create database `wordpress`;
use `wordpress`;
```

## MySQLのDockerを準備
MySQLのDockerfileを作成

```Dockerfile
FROM mysql:5.7.22
COPY ./create_schema.sql /docker-entrypoint-initdb.d/
```

## mysqlのmanifestを作成

```yaml:mysql-service.yaml
apiVersion: v1
kind: Service # リソースの種類
metadata:
  name: mysql # Serviceリソース名
  labels:
    app: dev # Serviceリソースｍのラベル名
spec:
  ports:
    - port: 3306 # ServiceのPort
  selector:
    app: dev
    tier: db
  type: NodePort
```

```yaml:mysql-deploy.yaml
apiVersion: apps/v1beta2
kind: Deployment # リソースの種類
metadata:
  name: mysql # Deploymentリソース名
  labels:
    app: dev # Deploymentリソースのラベル名
spec:
  selector:
    matchLabels: # 等価比較
      app: dev # app=devのpodを指定
      tier: db # tire=dbのpodを指定
  strategy: # Podを置き換えるときの戦略
    type: Recreate #一度すべてのPodを削除してから新たなPodを起動
  template: # Pod Templateを指定
    metadata:
      labels:
        app: dev
        tier: db
    spec:
      containers:
      - image: k8sdemo/db:latest # コンテナイメージ
        name: mysql # コンテナ名
        env: # 環境
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef: # 環境変数としてSeacretを取り込む
              name: mysql-secret # 環境変数として取り込みたい secret の名前
              key: rootPassword  # 環境変数として取り込みたい値の名前、この場合 rootPassword
        ports:
        - containerPort: 3306 # ContainerのPort番号
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Pod内のmount位置
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc-claim
```

## mysqlのパスワード情報を管理するmanifestを作成

```yaml:secret.yaml
apiVersion: v1
kind: Secret # リソースの種類
metadata:
  name: mysql-secret # リソース名
type: Opaque # 通常のパスワード管理で指定するtype
data:
  rootPassword: c29waGlhd2ViZGV2 # password（Base64エンコード）
```

## mysqlのストレージ情報を管理するmanifestを作成

```yaml:strageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass # リソースの種類
metadata:
  name: ss-db # リソース名
provisioner: kubernetes.io/no-provisioner # Dynamic Provisioningが非サポートとのため、kubernetes.io/no-provisionerを指定
```

```yaml:mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume # リソースの種類
metadata:
  name: demo-local-pv # PersistentVolumeリソース名
  labels:
    type: local # Docker for macを使用しているためlocalを指定
spec:
  storageClassName: ss-db # storageClassを指定
  capacity:
    storage: 20Gi # strage容量
  accessModes:
    - ReadWriteOnce # 単一Nodeで読み書きが可能
  hostPath:
    path: "/Users/ytada/Documents/k8sdemo/docker/db/data" # ローカルPCの適当なパスを指定
```

```yaml:mysql-pvc-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim # リソースの種類
metadata:
  name: mysql-pvc-claim # リソース名
  labels:
    app: dev
spec:
  storageClassName: ss-db # 使用するStrageClass
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
```

## skaffoldを編集してクラスタにデプロイ

```yaml:skaffold.yaml
apiVersion: skaffold/v1alpha2
kind: Config
build:
  tagPolicy:
    sha256: {} #コンテナのTagをハッシュ
  artifacts:
  - imageName: k8sdemo/php-apache # apache-phpのコンテナ
    workspace: ./docker/apache-php # apache-phpのworkSpace
  - imageName: k8sdemo/db # dbのコンテナ
    workspace: ./docker/db # dbのworkSpace
  local:
deploy:
  kubectl:
    manifests: # 監視対象のyamlファイルを指定
      - ./templates/main.yaml
      - ./templates/mysql-deploy.yaml
      - ./templates/mysql-pv.yaml
      - ./templates/mysql-pvc-claim.yaml
      - ./templates/mysql-service.yaml
      - ./templates/secret.yaml
      - ./templates/strageclass.yaml
```

※skaffoldについては「<a href="https://qiita.com/k_r_5376/items/a9f5ea563b5510edca40">開発環境のkubernetesにskaffoldを使って自動デプロイ</a>」を参照ください。

## WordPressをインストール

1. WordPressを<a href="https://ja.wordpress.org/download/" target="_blank">ダウンロード</a>
1. ダウンロードしたファイルをapp/ディレクトリに格納
1. wp-config.sample.phpをwp-config.phpにリネーム
1. 各環境の設定を変更
  - DB_NAME：wordpress
  - DB_USER：root
  - DB_PASSWORD：password
  - DB_HOST：mysqlpodのIPを指定


## サービスを確認する。
http://localhost/

![wp-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113395/cf06cfe9-a8ea-7499-a755-a7a4ef98583b.png)