永続ストレージの利用-DigitalOceanのkubernetes環境にwordpressを構築する06

2024年1月14日

永続ストレージの利用

最初は/var/www/htmlはイメージ化して利用する予定
でしたが、CMSには向いていないと思い永続ボリュームを利用することにしました。

  • redisで利用しているものと同じNFSコントローラーを利用します。
  • 料金は10GBの場合は$1のようです。
  • redisのmanifestを転用して作成します。
  • pvの方は不要でした。pvcのmanifestだけでpvの方も作成されます。

redisのpvcのmanifestをダウンロード

cd ~/work/doks-wp/dev/k8s
kubectl get pvc -A|grep redis

redis redis-data-redis-master-0 Bound pvc-b7222f8f-1247-4074-a73b-3697de6e63f7 5Gi RWX rwx-storage 30h

kubectl get pvc/redis-data-redis-master-0 -n redis -o yaml > pvc-redis.yaml

wordpressのpvc作成

cp -ip pvc-{redis,web}.yaml
vi pvc-web.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    volume.beta.kubernetes.io/storage-provisioner: openebs.io/nfsrwx
    volume.kubernetes.io/storage-provisioner: openebs.io/nfsrwx
  name: doks-wp-dev-data-pvc
  namespace: doks-wp
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: rwx-storage
  volumeMode: Filesystem
kubectl apply -f pvc-web.yaml 
kubectl get pv | grep doks

pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e 10Gi RWX Delete Bound doks-wp/doks-wp-dev-data-pvc rwx-storage 29h

kubectl get pvc -A | grep doks

doks-wp doks-wp-dev-data-pvc Bound pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e 10Gi RWX rwx-storage 29h

STATUSがBoundは利用されている状態となります。

初回のデータコピーどうする?

幸いworkerノードにはコンソール上からsshできるので、ローカルとsshしてもってきます。

  • workerノードにはssh出来ませんでしたので、workerノードから家に繋ぐようにします。

事前準備

  • ssh鍵の登録
    • Settings > Security SSH Keys > Add SSH Key
    • コンソールに繋いでいるIPアドレスの操作端末のssh公開鍵を登録
  • digitalocean のfirewallのpublic側でsshをanyで許可(実際には外部からworkerノードに直接つながらないので問題ありません。)コンソール接続に必要です。(外部-->digitaloceanネットワーク上からproxyでsshしているようです)また、一定時間経過でこの設定は消えるようです。

PVCのボリューム名を特定

local

kubectl get pvc -n doks-wp
NAME                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
doks-wp-dev-data-pvc   Bound    pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e   10Gi       RWX            rwx-storage    2d19h

workerノードにてマウントされたディレクトリを特定

Droplets > poolXXX > Console

root@pool-15ef8usof-x44tj:~# df -h | grep pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e
10.245.42.82:/    9.8G   79M  9.2G   1% /var/lib/kubelet/pods/7ea6754c-b9e0-4629-88b7-07697644e856/volumes/kubernetes.io~nfs/pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e

root@pool-15ef8usof-x44tj:~# ls -ltr /var/lib/kubelet/pods/7ea6754c-b9e0-4629-88b7-07697644e856/volumes/kubernetes.io~nfs/pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e
drwx------  2 www-data www-data 16384 Dec 31 06:40 lost+found
root@pool-15ef8usof-x44tj:~# 
root@pool-15ef8usof-xvy6a:~# cat rsync-dev.sh 
#!/bin/bash

#set -eu

PVC=pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e
CHK=`df -h | grep $PVC | awk '{print $6}'`
if [ $? != 0 ]; then
  exit 1
fi

TGT=$CHK
REMOTE=home:/home/ocarina/work/doks-wp/docker/files/html

if [ "$2" = "yes" ]; then
 OPT="--delete -av --exclude=lost+found"
else
 OPT="--delete -avn --exclude=lost+found"
fi

function rsync_get ()
{
 rsync $OPT -e "ssh -p22221" ${REMOTE}/ ${TGT}/
}

function rsync_put ()
{
 rsync $OPT ${TGT}/ -e "ssh -p22221" ${REMOTE}/
}

if [ "$1" = "get" ]; then
 rsync_get
elif [ "$1" = "put" ]; then
 rsync_put
else
 echo "error"
  exit 1
fi

dry-runして問題なければ実行します。

rsync-dev.sh get yes
root@pool-15ef8usof-x44tj:~# ls -ltr /var/lib/kubelet/pods/7ea6754c-b9e0-4629-88b7-07697644e856/volumes/kubernetes.io~nfs/pvc-37792aaa-506a-4686-8fbc-99d53acf5e3e| tail -n1
-rw-rw-rw-  1 www-data www-data  4076 Dec 31 08:56 wp-config.php
root@pool-15ef8usof-x44tj:~# 

PVボリュームのpodへのマウント

https://kubernetes.io/ja/docs/concepts/storage/volumes/

  • .spec.volumesでPodに提供するボリュームを指定
  • .spec.containers[*].volumeMountsでそれらのボリュームをコンテナにマウントする場所を宣言

backup

kubectl get deployment/doks-wp-dev-web -n doks-wp -o yaml > Deployment-doks-wp-web.yaml

editかapplyで適用します。

kubectl edit deployment/doks-wp-dev-web -n doks-wp

or

vi Deployment-doks-wp-web.yaml
kubdctl apply -f Deployment-doks-wp-web.yaml

編集内容

.spec.volumes
      - name: doks-wp-dev-storage
        persistentVolumeClaim:
          claimName: doks-wp-dev-data-pvc
.spec.containers[*].volumeMounts
        - mountPath: /var/www/html
          name: doks-wp-dev-storage

Posted by ocarina