はじめに
Statefulsetの勉強のために試してみる。
あとはkubectlコマンドを覚えるため。
PVの作成
yamlファイルの作成
apiVersion: v1
kind: PersistentVolume
metadata:
name: storage
spec:
# ストレージを抽象化定義するプロパティ。
storageClassName: host # ストレージの種類を定義
accessModes: # 読み書きの定義(単一ノードからなのか、複数ノードからなのか)
- ReadWriteMany # ここでは複数ノードからの読み書きを定義
capacity: # ストレージ容量の定義
storage: 30Gi #
# PVC削除時の動作を定義するプロパティ
persistentVolumeReclaimPolicy: Retain # Retain(残す) / Delete (消す)
# 保存先を定義
hostPath: # hostPathはホスト上に残す。nfsとかもある。
path: /mnt/stateful_partition/test #
type: Directory # ここまで
apply
$ kubectl apply -f pv.yaml
persistentvolume/storage created
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
storage 30Gi RWX Retain Available host 8s
ここではテストのため、ついでに10Giの永続ボリュームも作成しておく
最終的にはこんな感じ

PVCの作成
PVCはこんな感じのストレージが欲しいよ~という定義。
KubernetesがPVといい感じに紐づけてくれる。
とりあず、7Giのストレージを要求する
pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: volume-claim
spec:
storageClassName: standard
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 7Gi
apply
$ kubectl apply -f pvc.yml
persistentvolumeclaim/volume-claim created

Podの作成
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumeMounts:
- name: testvolume
mountPath: /var/hoge
volumes:
- name: testvolume
persistentVolumeClaim:
claimName: volume-claim
deploymentに失敗した。
詳細を確認してみたらディレクトリが無いみたいなイベントが出ていた。

あまり賢いやり方ではないけど各ノードにディレクトリを777で作ることにする。
その後、再実行して成功

実データの確認
各Podにアクセスして、適当にデータを作成する。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6667496f7-8ncbr 1/1 Running 0 113s
nginx-6667496f7-kgjhc 1/1 Running 0 113s
nginx-6667496f7-z56b2 1/1 Running 0 113s
$ kubectl exec --stdin --tty nginx-6667496f7-8ncbr -- /bin/bash
root@nginx-6667496f7-8ncbr:/# cd /var/
backups/ cache/ hoge/ lib/ local/ lock/ log/ mail/ opt/ run/ spool/ tmp/
root@nginx-6667496f7-8ncbr:/# cd /var/hoge/
root@nginx-6667496f7-8ncbr:/var/hoge# touch 1.txt
root@nginx-6667496f7-8ncbr:/var/hoge# exit
$ kubectl exec --stdin --tty nginx-6667496f7-kgjhc -- /bin/bash
root@nginx-6667496f7-kgjhc:/# cd /var/hoge/
root@nginx-6667496f7-kgjhc:/var/hoge# ls
(何もファイルが存在しないことを確認)
root@nginx-6667496f7-kgjhc:/var/hoge# touch 2.txt
$ kubectl exec --stdin --tty nginx-6667496f7-z56b2 -- /bin/bash
root@nginx-6667496f7-z56b2:/# cd /var/hoge/
root@nginx-6667496f7-z56b2:/var/hoge# ls
1.txt
(1だけファイルが存在)
root@nginx-6667496f7-z56b2:/var/hoge# touch 3.txt
ノード側から直接確認する。ノードに直接ファイルが存在することを確認。
ノード毎に直接置いている様子
$ cd /mnt/stateful_partition/test/
$ ls
2.txt
結論
同じPVCを使っても、同一のノード、PVにアクセスできるわけではない。
もし、ポッドを再構成した際に同一ファイルにアクセスしたいときはステートフルセットを使おう
コメント