Posted at

kubernetesでwordpress環境を構築する

以前の

apacheとphpの環境をkubernetesで構築する

からの続きです。


ディレクトリ構成

$ 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


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


create_schema.sql

create database `wordpress`;

use `wordpress`;


MySQLのDockerを準備

MySQLのDockerfileを作成

FROM mysql:5.7.22

COPY ./create_schema.sql /docker-entrypoint-initdb.d/


mysqlのmanifestを作成


mysql-service.yaml

apiVersion: v1

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


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を作成


secret.yaml

apiVersion: v1

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


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


strageclass.yaml

apiVersion: storage.k8s.io/v1

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


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の適当なパスを指定


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を編集してクラスタにデプロイ


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については「開発環境のkubernetesにskaffoldを使って自動デプロイ」を参照ください。


WordPressをインストール


  1. WordPressをダウンロード

  2. ダウンロードしたファイルをapp/ディレクトリに格納

  3. wp-config.sample.phpをwp-config.phpにリネーム

  4. 各環境の設定を変更


    • DB_NAME:wordpress

    • DB_USER:root

    • DB_PASSWORD:password

    • DB_HOST:mysqlpodのIPを指定




サービスを確認する。

http://localhost/

wp-login.png