以前の
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経由で利用する形になります。
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をインストール
- WordPressをダウンロード
- ダウンロードしたファイルをapp/ディレクトリに格納
- wp-config.sample.phpをwp-config.phpにリネーム
- 各環境の設定を変更
- DB_NAME:wordpress
- DB_USER:root
- DB_PASSWORD:password
- DB_HOST:mysqlpodのIPを指定
サービスを確認する。