(O+P)ut

アウトプット



(O+P)ut

Output Log

【Kubernetes】永続化ボリュームPersistentVolumeClaimを利用する

スポンサーリンク

はじめに

コンテナは基本的にステートレスで削除してしまえば再度作成しても中で作成したファイルは消えています。

が、Dockerでは例えば以下のように一部ファイルを外出しすることで永続的に利用できます。

Kubernetesにも永続ストレージという概念にてPersistentVolumeClaimという設定にてデータを維持することが可能になります。
本記事ではその使い方をハンズオン形式で紹介します。

環境情報
  • DocerDesktop
  • Windows10
  • kubectl 1.15

使用するYAML

Pod&Service&Volumeで3つのファイルです。

$ cat nginx-pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: test-nginx-volume
  volumes:
    - name: test-nginx-volume
      persistentVolumeClaim:
        claimName: test-nginx-disk
$ cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
$ cat nginx-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-nginx-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

PersistentVolumeClaimのポイント

test-nginx-diskという名前でストレージ領域を1Gi確保しています。

accessModesで指定する項目は以下がありますが今回は単一PodなのでReadWriteOnceを指定しています。

  • ReadWriteOnce 単一Nodeから読み取り/書き込み
  • ReadOnlyMany 多数Nodeから読み取り専用
  • ReadWriteMany 多数Nodeで読み取り/書き込み

そしてPodからはmountPathの部分で永続化したいディレクトリを選択しています。
今回はindex.htmlが格納されている

/usr/share/nginx/html

としました。

そしてボリューム情報を記載します。claimNameにはVolume側で指定した名前を指定することで結びつけます。

ハンズオン

Volumeを作成せずに試しにPodを動かすとPendingになるはずです。

> kubectl apply -f .\nginx-pod.yaml
pod/nginx-pod created
> kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   0/1     Pending   0          ...

kubectl describeで詳細を見れば以下のメッセージが原因で起動失敗していることが確認できました。

<span style="color: #ff0000"><b>  Warning  FailedScheduling  29s   default-scheduler  persistentvolumeclaim "test-nginx-disk" not found</b></span>

一度Podは落としておきます。

> kubectl delete -f .\nginx-pod.yaml

永続化ボリュームを立ち上げる

以下コマンドでディスクを確保します。

> kubectl apply -f .\nginx-pvc.yaml
persistentvolumeclaim/test-nginx-disk created

そうすると以下コマンドで情報が確認できます。

> kubectl get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-nginx-disk   Bound    pvc-xx-d15c-4b23-9518-6d9515f551fc   1Gi        RWO            hostpath       xs

詳細情報はPodと同じく以下コマンドで確認できます。

> kubectl describe pvc

ちなみに以下が正常起動のメッセージです。

Normal ExternalProvisioning 27s (x2 over 27s) persistentvolume-controller waiting for a volume to be created, either by external provisioner "docker.io/hostpath" or manually created by system administrator
Normal Provisioning 27s docker.io/hostpath xx External provisioner is provisioning volume for claim "default/test-nginx-disk"
Normal ProvisioningSucceeded 27s docker.io/hostpath xx Successfully provisioned volume pvc-xx-d15c-4b23-9518-6d9515f551fc

Pod&Serviceを立ち上げる

ボリュームが立ち上がったのでPodを立ち上げると

> kubectl apply -f .\nginx-pod.yaml
pod/nginx-pod created

今度は正常に起動できました。

...
Normal Started 12s kubelet, docker-desktop Started container nginx

同じくServiceを起動し

> kubectl apply -f .\nginx-service.yaml

ブラウザやcurlにて以下を入力すればウェルカムページが立ち上がります。

localhsot

永続化されていることを確認する

以下のようにPodに接続し

> kubectl exec -it nginx-pod /bin/bash

index.htmlに追記を行い

root@nginx-pod:/# echo textadd >> /usr/share/nginx/html/index.html
root@nginx-pod:/# exit
exit

Podを落とし上げします。

> kubectl delete -f .\nginx-pod.yaml
pod "nginx-pod" deleted
> kubectl apply -f .\nginx-pod.yaml
pod/nginx-pod created

本来であれば追記されたindex.htmlは元に戻っているはずですがブラウザやcurlで確認すると追記部分が確認できます。

f:id:mtiit:20200509135355p:plain
永続化領域のファイルは変更が保持されている

終わりに

不要になったボリュームは以下コマンドで消去できます。ここを削除してしまえば保持していたデータは消えてしまいます。

> kubectl delete -f .\pvc.yaml

実際に手を動かしながらボリュームを利用すれば理解も深まりますので、本手順が参考になれば幸いです。


他の記事を読む