(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【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でPodの詳細を見れば以下のメッセージが原因で起動失敗していることが確認できました。

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

永続化ボリュームを立ち上げるべく、以下コマンドでtest-nginx-diskを用意します。

> 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

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を立ち上げると

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

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

Normal  Started    12s   kubelet, docker-desktop  Started container nginx</b></span>

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

localhsot

最後に、永続化されていることを確認すべく以下のようにPodに接続し

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

index.htmlに追記を行った上でPodを落とし上げします。

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

Podを落とし上げします。

永続化ボリュームに保持ができているため、ブラウザやcurlで確認すると追記部分が確認できます。

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

終わりに

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