Kubernetes で 永続データ を取り扱う方法

0 件のコメント

今回は「永続データの取り扱い」として「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 を配置します。

  1. index.htmlを準備

    NFSサーバーには nginx で配信したい index.html を配置しておきます。 配置するファイルは以下のようなものを用意します。

    /var/share/pv0001/index.html

    Hello World !
    
  2. NFSフォルダ共有設定

    /var/share を共有するように設定します。

    /etc/exports

    /share/data1    10.51.0.0/24   (rw,async,no_root_squash)
    
  3. NFSサーバー再起動

    systemctl enable nfs
    systemctl restart nfs
    

PersistentVolume

PersistentVolume は 永続データ保存先 の実態です。 データ保存先の実態(HDD、USB、NFS…など)に対するアクセス方法を定義します。 今回は NFSサーバー 向けの設定を行います。

  1. 永続データの実態となるマニュフェストを作成

    今回は NFS サーバー へ接続する場合を例としたマニュフェストを記載します。

    pv0001.yml

    apiVersion: 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 (非推奨) : ファイル削除して再利用できるようにする。
  2. 作成したマニュフェストを適用、反映

    kubectl apply -f pv0001.yml
    
  • 以下のコマンドで作成できたことの確認ができます。

    kubectl get pv
    

PersistentVolumeClaim

PersistentVolumeClaim では必要な PersistentVolume がどんなものであるかを定義します。 データ保存先の実態は PersistentVolume で隠蔽しておき、PersistntVolumeClaim では 1段抽象化されたデータ保存先条件にマッチする PersistentVolume を探す仕組みになります。

  1. 永続データの実態への接続マニュフェストを作成

    nfs-pvc1.yml

    apiVersion: 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 とマッチします。

  2. 作成したマニュフェストを適用、反映

    kubectl apply -f nfs-pvc1.yml
    
  • 以下のコマンドで作成できたことの確認ができます。

    kubectl get pvc
    

Pod

ここまでに作成した PersistentVolume および PersistentVolumeClaim を実際に Pod へ接続していきます。

  1. PVCを接続する nginx コンテナ Pod の マニュフェスト を作成

    nginx-with-pvc.yml

    apiVersion: 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
    
  2. 作成したマニュフェストを適用、反映

    kubectl apply -f nginx-with-pvc.yml
    
  • 以下のコマンドで作成できたことの確認ができます。

    kubectl get po
    

動作確認

Podは意図的な配置をしない限り基本的にはPodネットワーク内で通信することになります。 そのため、デバッグ用にPodを作成し、デバッグ用Podから作成したPodにアクセスすることで動作確認します。

  1. 作成したPodのIPアドレス(Podネットワーク上のIPアドレス)を確認

    kubectl get po -o wide
    
  2. 動作確認用のCentOSコンテナ作成

    kubectl run debug --image=centos:7 -it --rm --restart=Never -- sh
    
  3. 動作確認用のCentOSコンテナにcurlインストール

    yum install -y curl
    
  4. 動作確認用のCentOSコンテナから作成したPodにアクセス

    yum install -y curl
    

今回は「Pod に 永続データボリューム を接続、利用する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!