このブログは、コンテナのオーケストレーターであるkubernetesについて自分の知識をまとめることを目的として記事を書いています。
もともとなが~くvSphereのあれやこれやに携わってきたのでvSphereとの類似点や相違点についてもちょっと混ぜていけたりしたらいいかなぁとかも思っています。
今回は前回からの続きで、Podにストレージを追加するための作業をやっていきたいと思います。
今回はちょっと登場人物が多かったり、作業を行うための準備が必要だったりで少し難しいと思います。
文章だけだと難しいと思いますので、読み飛ばして実際にyamlから物を作成してもらったほうが早いかもしれません。
Podのストレージを永続ストレージと呼び、具体的にKubernetesではそれのことをPersistentVolumeと呼びます。
仮想マシンに置き換えると、仮想ディスクに当たる部分になります。
Pod同様PersistentVolumeもyamlで作るのですが、PersistentVolume(PV)を作っていい領域がどこかそれが定義されていないと作れません。
何のことかちょっとよくわからないかもしれませんが、vSphere的に言うと仮想ディスクを作成するためのデータストアを用意しないといけないという感じです。
では、そのデータストアをどう作るかというと、StorageClass(SC)というリソースを作成してKubernetesに「この領域が使えますよ」と定義するわけです。
これで、SCで定義された領域にPVを作ることができました。
しかし、この状態は、仮想ディスクはできたけど仮想ディスクを使うのは誰かという部分が設定されていません。
その設定を行えるようにするのがPersistentVolumeClaim(PVC)です。
PVCはPVを要求するためのリソースで、どんなサイズのPVが欲しいかという内容が定義されています。
このPVCをPodのyamlに書いてあげると、PVCに要求されたサイズのPVがPodと紐づくことができます。
これは文章で読んでもあんまり理解できないと思いますので、気にせず実際に作ってみましょう。
まずはStorageClassから。
ここでは、NFSやiSCSIなどの外部ストレージ装置ではなく、ローカル領域を指定します。
以下の内容をKubernetesクラスターにvi等で作成してください。
local-sc.yaml
----
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-sc
provisioner: kubernetes.io/no-provisioner
----
続いて、作成したStorageClassであるlocal-scを指定してPersistentVolumeを作成。
以下の内容をKubernetesクラスターにvi等で作成してください。
local-pv.yaml
----
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 3Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-sc
hostPath:
path: /local-pv/
----
さらに、用意したPersistentVolumeを要求するPersistentVolumeClaimを作成します。
以下の内容をKubernetesクラスターにvi等で作成してください。
local-pvc.yaml
----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 3Gi
storageClassName: local-sc
----
それでは順番に、作成を行いましょう
kubectl apply -f local-sc.yaml
kubectl apply -f local-pv.yaml
kubectl apply -f local-pvc.yaml
確認は以下のコマンドで
kubectl get sc,pv,pvc
出力結果はこんな感じ
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
storageclass.storage.k8s.io/local-storage kubernetes.io/no-provisioner Delete Immediate false 82s
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/local-pv 3Gi RWO Delete Bound default/local-pvc local-sc 18s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/local-pvc Bound local-pv 3Gi RWO local-sc 3s
と、ここまでで仮想マシンで言うと仮想ディスクができたわけです。
しかしこのままでは、この仮想ディスクを使う仮想マシンが誰かという設定がされていません。
そこでもう一つyamlが必要となります。
どんなyamlが必要となるかというと、Podのyamlです。
Podのymalにこのpvcを組み込むことで、PodがようやくPVCを使えるようになります。
前回作ったnginxのPodにくっ付けて新しいPodのyamlファイルを作ってみましょう
nginx-pv.yaml
----
kind: Pod
apiVersion: v1
metadata:
name: nginx-pod-2
labels:
app: wcp-demo
spec:
containers:
- image: nginx
name: nginx-container
volumeMounts:
- name: nginx-pv
mountPath: /pv
volumes:
- name: nginx-pv
persistentVolumeClaim:
claimName: local-pvc
----
これを作成するとPodが付いています。
kubectl apply -f nginx-pv.yaml
しかし、実際にPVはどこにできているかというと、Podが動いているnodeの/local-pv/になります。
確認するには"kubectl get pod -o wide"を実行するとわかります。
Podにくっ付けられたPVは本当にくっついているか確認します。
Podの内部に入って/pvディレクトリがあるか確認しましょう。
kubectl exec -i -t pod/nginx-pod-2 /bin/bash
cd /pv
ディレクトリ/pvに移動することができました。
ダミーファイルを作成してみましょう。
dd if=/dev/zero of=2G.dummy bs=1M count=2048
ファイルができたら、exitでPodから抜けます。
Podが動作しているノードへログインして、/local-pv/にファイルがあることを確認してください。
では、以下のコマンドでPodを削除してみましょう。
kubectl delete -f nginx-pv.yaml
PVをくっ付けていないPodの場合、先ほど作成したダミーファイルも一緒に消えます。
もう一度同じyamlでPodを作成しなおしてみましょう。
kubectl apply -f nginx-pv.yaml
Podにログインしてlsで/pvを確認するとダミーファイルが残っていることが確認できるはずです。
今回はここまでとなります。