Deploying WordPress on LKE using OpenEBS NFS Provisioner

LinodeのManaged Kubernetesサービス(LKE)上でOpenEBS NFS Provisionerを使って、WordPressをdeployしてみる。LKEクラスターは下記の環境。

 linode-cli lke clusters-list                                                                                                                                           ✘ 1
┌────────┬───────┬──────────────┬─────────────┬───────────────────┐
│ id     │ label │ region       │ k8s_version │ high_availability │
├────────┼───────┼──────────────┼─────────────┼───────────────────┤
│ 109026 │ lke2  │ ap-northeast │ 1.26        │ False             │
└────────┴───────┴──────────────┴─────────────┴───────────────────┘
linode-cli lke pools-list 109026                                                                                                                                       ✘ 2
┌────────┬───────────────┬─────────────────────┬─────────────┬────────┐
│ id     │ type          │ id                  │ instance_id │ status │
├────────┼───────────────┼─────────────────────┼─────────────┼────────┤
│ 162782 │ g6-standard-1 │ 162782-6465b2c3de59 │ 46243910    │ ready  │
│ 162782 │ g6-standard-1 │ 162782-6465b2c446d7 │ 46243912    │ ready  │
│ 162782 │ g6-standard-1 │ 162782-6465b2c4afbc │ 46243911    │ ready  │
└────────┴───────────────┴─────────────────────┴─────────────┴────────┘

OpenEBS Dynamic NFS Provisionerのインストール

helmレポジトリを追加

helm repo add openebs-nfs https://openebs.github.io/dynamic-nfs-provisioner
helm repo update

下記のhelmチャートを用意

nfsStorageClass:
  backendStorageClass: "linode-block-storage"

helmでインストール

helm install -n openebs --create-namespace  openebs-nfs openebs-nfs/nfs-provisioner -f openEBS-nfs-provisioner-values.yaml   

deployのステータス確認

helm ls -n openebs
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
openebs-nfs     openebs         1               2023-05-18 15:19:14.116389 +0900 JST    deployed        nfs-provisioner-0.10.0  0.10.0

nfs-rwx用StorageClass用manifestを作成

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: openebs-rwx
  annotations:
    openebs.io/cas-type: nfsrwx
    cas.openebs.io/config: |
      - name: NFSServerType
        value: "kernel"
      - name: BackendStorageClass
        value: "linode-block-storage"
provisioner: openebs.io/nfsrwx
reclaimPolicy: Delete

上記manifestを適用

kubectl apply -f sc-nfs-rwx.yaml

StorageClassの確認

kubectl get storageclasses.storage.k8s.io
NAME                                    PROVISIONER               RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
linode-block-storage                    linodebs.csi.linode.com   Delete          Immediate           true                   138m
linode-block-storage-retain (default)   linodebs.csi.linode.com   Retain          Immediate           true                   138m
openebs-kernel-nfs                      openebs.io/nfsrwx         Delete          Immediate           false                  68m
openebs-rwx                             openebs.io/nfsrwx         Delete          Immediate           false                  115m
kubectl describe storageclasses.storage.k8s.io openebs-rwx
Name:            openebs-rwx
IsDefaultClass:  No
Annotations:     cas.openebs.io/config=- name: NFSServerType
  value: "kernel"
- name: BackendStorageClass
  value: "linode-block-storage"
,kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"cas.openebs.io/config":"- name: NFSServerType\n  value: \"kernel\"\n- name: BackendStorageClass\n  value: \"linode-block-storage\"\n","openebs.io/cas-type":"nfsrwx"},"name":"openebs-rwx"},"provisioner":"openebs.io/nfsrwx","reclaimPolicy":"Delete"}
,openebs.io/cas-type=nfsrwx
Provisioner:           openebs.io/nfsrwx
Parameters:            <none>
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

MySQLセットアップ

下記と同様にLKE上にMySQLをセットアップ。

WordPressセットアップ

MySQLにWordPress用DB作成

create database wordpress;
create user hogehoge identified by 'hogehoge';
GRANT ALL PRIVILEGES ON wordpress.* TO hogehoge@'%';
FLUSH PRIVILEGES;

chartファイル作成

storageClass:”openebs-rwx”, access-Modes: “ReadWriteMany”にする。

wordpressUsername: hogehoge
wordpressPassword: "fugafuga"
existingSecret: ""
wordpressEmail: hogehoge@example.net
wordpressFirstName: wpadm
wordpressLastName: dok8s
wordpressBlogName: dok8s-blog
wordpressScheme: http

service:
  type: ClusterIP

persistence:
  enabled: true
  storageClass: "openebs-rwx"
  accessModes:
​    - ReadWriteMany
  size: 10Gi

mariadb:
  enabled: false

externalDatabase:
  host: mysql.mysql
  port: 3306
  user: hogehoge
  password: "fugafuga"
  database: wordpress
  existingSecret: ""

helmでインストール

helm install wordpress bitnami/wordpress --create--namespace wp -f wp-values.yml      

インストール時は下記エラーが発生する。

cp: cannot create regular file '/bitnami/wordpress/wp-config.php': Permission denied

NFSボリューム内のパーミッションを確認。

 kubectl exec -n openebs -it nfs-pvc-c68a5732-dbe0-40c5-94b7-d342ee367b62-78c6c7cd-6pwpn -c nfs-server -- bash
root@nfs-pvc-c68a5732-dbe0-40c5-94b7-d342ee367b62-78c6c7cd-6pwpn:/nfsshare # cd wordpress/
root@nfs-pvc-c68a5732-dbe0-40c5-94b7-d342ee367b62-78c6c7cd-6pwpn:/nfsshare # ls -ltr
total 4
drwxr-xr-x 2 root root 4096 Nov 19 03:13 wordpress

パーミッションを変更。

root@nfs-pvc-c68a5732-dbe0-40c5-94b7-d342ee367b62-78c6c7cd-6pwpn:/nfsshare # chmod 777 wordpress/

Podを再起動

kubectl -n wp scale deploy wordpress --replicas 0
kubectl -n wp scale deploy wordpress --replicas 1

deploy確認

helm ls -n wp                                                                                                                                                          ✘ 1
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
wordpress       wp              1               2023-05-18 15:24:45.436539 +0900 JST    deployed        wordpress-16.1.5        6.2.1

k8sステータス確認

kubectl -n wp get all,pvc
NAME                                       READY   STATUS    RESTARTS   AGE
pod/wordpress-6dd798577-5bn6k              1/1     Running   0          80m
pod/wordpress-memcached-79db4454b4-tq84x   1/1     Running   0          80m

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/wordpress             ClusterIP   10.128.208.239   <none>        80/TCP,443/TCP   80m
service/wordpress-memcached   ClusterIP   10.128.129.57    <none>        11211/TCP        80m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress             1/1     1            1           80m
deployment.apps/wordpress-memcached   1/1     1            1           80m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/wordpress-6dd798577              1         1         1       80m
replicaset.apps/wordpress-memcached-79db4454b4   1         1         1       80m

NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/wordpress   Bound    pvc-8ecc04c3-9790-429b-8aab-7b0d89076e04   10Gi       RWX            openebs-rwx    80m

Horizontal Pod Scaling

RWO(ReadWriteOnce)のPVCで水平スケーリングは出来ないが、ReadWriteManyのNFS PVCでは水平スケーリングが可能なので、Pod数を増やしてみる。

kubectl -n wp scale deploy wordpress --replicas 3

増えた

 kubectl -n wp get po -o wide
NAME                                   READY   STATUS    RESTARTS   AGE     IP         NODE                            NOMINATED NODE   READINESS GATES
wordpress-6dd798577-5bn6k              1/1     Running   0          88m     10.2.1.8   lke109026-162782-6465b2c3de59   <none>           <none>
wordpress-6dd798577-5f7fl              1/1     Running   0          3m58s   10.2.2.9   lke109026-162782-6465b2c4afbc   <none>           <none>
wordpress-6dd798577-cvhk7              1/1     Running   0          3m58s   10.2.0.8   lke109026-162782-6465b2c446d7   <none>           <none>

各PodからNFSマウントされている

kubectl exec -n wp -it wordpress-6dd798577-5bn6k -c wordpress -- df -h /bitnami/wordpress
Filesystem                Size  Used Avail Use% Mounted on
10.128.39.109:/wordpress  9.8G  175M  9.6G   2% /bitnami/wordpress

kubectl exec -n wp -it wordpress-6dd798577-5f7fl -c wordpress -- df -h /bitnami/wordpress
Filesystem                Size  Used Avail Use% Mounted on
10.128.39.109:/wordpress  9.8G  175M  9.6G   2% /bitnami/wordpress

kubectl exec -n wp -it wordpress-6dd798577-cvhk7 -c wordpress -- df -h /bitnami/wordpress
Filesystem                Size  Used Avail Use% Mounted on
10.128.39.109:/wordpress  9.8G  175M  9.6G   2% /bitnami/wordpress

“10.128.38.109”が所謂NFS ServerのIPアドレス

kubectl -n openebs get all                                                                                                                                           ✘ 130
NAME                                                                READY   STATUS    RESTARTS      AGE
pod/nfs-pvc-8ecc04c3-9790-429b-8aab-7b0d89076e04-77b6648c88-l98nf   1/1     Running   0             94m
pod/openebs-nfs-nfs-provisioner-7fcbdc4b6b-7hsnm                    1/1     Running   1 (79m ago)   99m

NAME                                                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)            AGE
service/nfs-pvc-8ecc04c3-9790-429b-8aab-7b0d89076e04   ClusterIP   10.128.39.109   <none>        2049/TCP,111/TCP   94m

NAME                                                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-pvc-8ecc04c3-9790-429b-8aab-7b0d89076e04   1/1     1            1           94m
deployment.apps/openebs-nfs-nfs-provisioner                    1/1     1            1           99m

NAME                                                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nfs-pvc-8ecc04c3-9790-429b-8aab-7b0d89076e04-77b6648c88   1         1         1       94m
replicaset.apps/openebs-nfs-nfs-provisioner-7fcbdc4b6b                    1         1         1       99m

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です