KubernetesでWordPressを構築する方法【Secret・PVC・StatefulSetを使った手順を解説】

kubenetesロゴ

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.yaml

MySQL用の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.yaml

MySQL(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.yaml

WordPress用の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.yaml

WordPressの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で構成を整理