今回は「永続データの取り扱い」として「Pod に 永続データボリューム を接続、利用する方法」についてまとめます。 Kubernetes 上 の永続データとして切り離せない「PersistentVolumes および PersistentVolumeClaims」についても見ていきます。
概要
PersistentVolume (PV) と PersistentVolumeClaim (PVC) について学習するため、nginx の Pod に PersistentVolumeClaim を接続し、 nfs に保存されたファイルを開く方法を見ていきます。
NFSサーバーを Kubernetes クラスター とは別に用意し、Kubernetes クラスター から参照するようなサンプルを実装してみます。
前提
今回は ベアメタル Kubernetes 環境で動作確認をしています。 AWS や GCP の話はやや事情が異なるのでご注意ください。
関係しそうなモジュールバージョンは以下の通りです。
- Kubernetes 1.14.0
NFSサーバー
NFSサーバーには nginx へアクセスした際に返却する index.html を配置します。
-
index.htmlを準備
NFSサーバーには nginx で配信したい index.html を配置しておきます。 配置するファイルは以下のようなものを用意します。
/var/share/pv0001/index.html
1Hello World !
-
NFSフォルダ共有設定
/var/share
を共有するように設定します。/etc/exports
1/share/data1 10.51.0.0/24 (rw,async,no_root_squash)
-
NFSサーバー再起動
12systemctl enable nfs
systemctl restart nfs
PersistentVolume
PersistentVolume は 永続データ保存先 の実態です。 データ保存先の実態(HDD、USB、NFS…など)に対するアクセス方法を定義します。 今回は NFSサーバー 向けの設定を行います。
-
永続データの実態となるマニュフェストを作成
今回は NFS サーバー へ接続する場合を例としたマニュフェストを記載します。
pv0001.yml
12345678910111213141516apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
labels:
type: hdd
spec:
capacity:
storage: 3Gi
storageClassName: slow
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 10.51.1.103
path: /var/share/pv0001
storageClassName
ストレージクラス名 を指定します。 あらかじめ定義した
StorageClass
の名前でもいいですし、いきなり任意の文字列を指定してもOKです。 上記サンプルでは「slow
」という任意文字列をいきなり指定しています。accessMode
以下のいずれかを指定します。 「どのNodeから」と「読み書き」を定義します。
ReadWriteOnce
:単一Nodeからの読み書きアクセスReadOnlyMany
:複数Nodeからの読み取り専用アクセスReadWriteMany
:複数Nodeからの読み書きアクセス
persistentVolumeReclaimPolicy
PersistentVolumeClaim からの接続が解除された時の動作を定義します。 選択肢は以下のどれかになります。
Retain
: ファイル削除せずVolumeを残す。再利用は不可。Delete
(デフォルト) : Volumeをまるごと削除。再利用は不可。Recycle
(非推奨) : ファイル削除して再利用できるようにする。
-
作成したマニュフェストを適用、反映
1kubectl apply -f pv0001.yml
-
以下のコマンドで作成できたことの確認ができます。
1kubectl get pv
PersistentVolumeClaim
PersistentVolumeClaim では必要な PersistentVolume がどんなものであるかを定義します。 データ保存先の実態は PersistentVolume で隠蔽しておき、PersistntVolumeClaim では 1段抽象化されたデータ保存先条件にマッチする PersistentVolume を探す仕組みになります。
-
永続データの実態への接続マニュフェストを作成
nfs-pvc1.yml
1234567891011121314apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc1
spec:
selector:
matchLabels:
type: hdd
storageClassName: slow
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
PersistentVolumeClaim から PersistentVolume を検索する際に利用できる検索条件は以下のようなものになります。
- ラベル (metadata.labels)
- 容量 (spec.capacity.storage)
- アクセスモード (spec.accessModes)
- ストレージクラス名 (spec.storageClassName)
spec.selector.matchLabels
「PersistentVolumeClaim の
spec.selector.matchLabels
に指定された条件」と 「PersistentVolume のmetadata.labels
の値」が一致する PersistentVolume を探します。 指定がなければ任意のPersistentVolumeにマッチします。spec.accessModes
accessMode が完全一致する PersistentVolume を探します。
spec.resources.requests.storage
指定された容量より大きなPersistentVolumeとマッチします。
spec.storageClassName
完全一致するPersistentVolumeとマッチします。 指定がなければ storageClassName がない PersistentVolume とマッチします。
-
作成したマニュフェストを適用、反映
1kubectl apply -f nfs-pvc1.yml
-
以下のコマンドで作成できたことの確認ができます。
1kubectl get pvc
Pod
ここまでに作成した PersistentVolume および PersistentVolumeClaim を実際に Pod へ接続していきます。
-
PVCを接続する nginx コンテナ Pod の マニュフェスト を作成
nginx-with-pvc.yml
123456789101112131415161718apiVersion: v1
kind: Pod
metadata:
name: nginx-with-pvc
spec:
containers:
- name: nginx-with-pvc
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-pvc
volumes:
- name: nginx-pvc
persistentVolumeClaim:
claimName: nfs-pvc1
-
作成したマニュフェストを適用、反映
1kubectl apply -f nginx-with-pvc.yml
-
以下のコマンドで作成できたことの確認ができます。
1kubectl get po
動作確認
Podは意図的な配置をしない限り基本的にはPodネットワーク内で通信することになります。 そのため、デバッグ用にPodを作成し、デバッグ用Podから作成したPodにアクセスすることで動作確認します。
-
作成したPodのIPアドレス(Podネットワーク上のIPアドレス)を確認
1kubectl get po -o wide
-
動作確認用のCentOSコンテナ作成
1kubectl run debug --image=centos:7 -it --rm --restart=Never -- sh
-
動作確認用のCentOSコンテナにcurlインストール
1yum install -y curl
-
動作確認用のCentOSコンテナから作成したPodにアクセス
1yum install -y curl
今回は「Pod に 永続データボリューム を接続、利用する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!