Kubernetes PV,PVCテスト

docker

はじめに

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にアクセスできるわけではない。

もし、ポッドを再構成した際に同一ファイルにアクセスしたいときはステートフルセットを使おう

コメント

タイトルとURLをコピーしました