KubernetesでWordPressを構築する方法【Secret・PVC・StatefulSetを使った手順を解説】
KubernetesでWordPress環境を構築したい方に向けて、Secret・PVC・StatefulSet・Deploymentを使った構築手順を分かりやすく解説します。
この記事では以下を実現します。
- MySQLをStatefulSetで構築
- WordPressをDeploymentで構築
- パスワードをSecretで安全に管理
- PVCでデータを永続化
- Port-forwardで動作確認
初心者の方でもそのまま再現できるよう、コマンドとマニフェストをすべて掲載しています。
記事の目次
KubernetesでWordPressを構築する全体構成
今回構築する構成は下記の通りです。

Secretの作成(MySQLパスワード)
今回構成する数が多いので「MySQLパート」と「Wordpressパート」に分けます。
まずは、MySQLのパスワードをSecretとして作成します。
Secretに埋め込む値をファイルとして作成します。
echo -n "rootpw" > ./password確認
cat password
ファイルから値を読み込んでSecretを作成します。
kubectl create secret generic --save-config sample-db-auth --from-file=./password
作成されたSecretを確認
kubectl get secret sample-db-auth -o json
base64でエンコードされていますが、passwordが作成されていればOKです。
またファイルからsecretを作成する場合、ファイル名がkeyとなります!
MySQL用のPVCを作成
MySQLのデータを永続化するため、PersistentVolumeClaimを作成します。
mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi作成
kubectl apply -f mysql-pvc.yamlMySQL用のClusterIP Serviceを作成
MySQLにWordPressから接続するため、ClusterIPを作成します。
db-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-db
spec:
selector:
db: wordpress-db
ports:
- port: 3306
targetPort: 3306作成
kubectl apply -f db-clusterip.yamlMySQL(StatefulSet)の作成
StatefulSetを使ってMySQLを作成します。
wordpress-db-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: wordpress-db
spec:
serviceName: wordpress-db # Headless Service 名と一致させる
replicas: 1
selector:
matchLabels:
db: wordpress-db # Pod ラベルは Service の selector と一致させる
template:
metadata:
labels:
db: wordpress-db # Pod ラベル(Service selector と同じ)
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: sample-db-auth # 既存 Secret 名
key: password # Secret 内のキー名
- name: MYSQL_USER
value: wordpress # 固定ユーザー名
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: sample-db-auth
key: password
- name: MYSQL_DATABASE
value: wordpress # 作成するDB名
volumeMounts:
- name: mysql-storage # volumes の名前と一致させる
mountPath: /var/lib/mysql # MySQL のデータディレクトリ
volumes:
- name: mysql-storage # volumeMounts の名前と一致させる
persistentVolumeClaim:
claimName: mysql-pvc # 既存の PVC 名を指定デプロイ
kubectl apply -f wordpress-db-statefulset.yaml確認
kubectl get pvc
kubectl get svc
kubectl get statefulset
WordPress用のPVCを作成
次にWordpressパートを作成します。
WordPressのデータも永続化します。
wordpress-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi作成
kubectl apply -f wordpress-pvc.yamlWordPress用のClusterIP Service作成
wordpress-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
type: ClusterIP作成
kubectl apply -f wordpress-clusterip.yamlWordPressのDeployment作成
wordpress-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress # Deploymentの名前
spec:
replicas: 1 # Podのレプリカ数。今回は1つだけ起動
selector:
matchLabels:
app: wordpress # Podのラベルを指定して、Deploymentが管理するPodを特定
template:
metadata:
labels:
app: wordpress # Podに付けるラベル(selectorと一致させる必要あり)
spec:
containers:
- name: wordpress # コンテナ名
image: wordpress:latest # 使用するWordPressのDockerイメージ
ports:
- containerPort: 80 # コンテナがリッスンするポート(HTTP用)
env:
- name: WORDPRESS_DB_HOST # WordPressが接続するMySQLのホスト名
value: wordpress-db.default.svc.cluster.local # ClusterIPサービスのFQDN
- name: WORDPRESS_DB_USER # MySQL接続ユーザー名
value: wordpress # 作成したDBのユーザー名
- name: WORDPRESS_DB_PASSWORD # MySQL接続パスワードをSecretから参照
valueFrom:
secretKeyRef:
name: sample-db-auth # 参照するSecret名
key: password # Secret内のキー名
- name: WORDPRESS_DB_NAME # 接続するデータベース名、なかった場合は自動で作成
value: wordpress
volumeMounts:
- name: wordpress-storage
mountPath: /var/www/html # WordPressの永続化対象パス
volumes:
- name: wordpress-storage
persistentVolumeClaim:
claimName: wordpress-pvc # 使用するPVC名デプロイ
kubectl apply -f wordpress-deployment.yaml確認
kubectl get pvc
kubectl get svc
kubectl get pod
WordPressの疎通確認(port-forward)
下記コマンドを実行します。
kubectl port-forward svc/wordpress 8080:80
ブラウザでアクセス
http://localhost:8080
WordPressの初期画面が表示されれば成功です。
Kustomizeで構成を整理(おすすめ)
ファイルが増えてきたら、Kustomizeで管理するのがおすすめです。
ディレクトリ構成
wordpress/
├── ap/
│ ├── wordpress-clusterip.yaml
│ ├── wordpress-deployment.yaml
│ ├── wordpress-pvc.yaml
│ └── kustomization.yaml
└── db/
├── db-clusterip.yaml
├── mysql-pvc.yaml
├── password
├── wordpress-db-statefulset.yaml
└── kustomization.yaml
上位kustomization.yaml
resources:
- ap
- dbデプロイ
kubectl apply -k ./wordpress/まとめ
この記事では、KubernetesでWordPressを構築する方法を以下の手順で解説しました。
- Secretでパスワードを管理
- MySQLをStatefulSetで構築
- PVCでデータ永続化
- WordPressをDeploymentで作成
- port-forwardで動作確認
- Kustomizeで構成を整理
- タグ:
- Kubenetes