はじめに
コンテナは基本的にステートレスで削除してしまえば再度作成しても中で作成したファイルは消えています。
が、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で確認すると追記部分が確認できます。
終わりに
実際に手を動かしながらボリュームを利用すれば理解も深まりますので、本手順が参考になれば幸いです。