Azure Kubernetes Serviceでの共有ストレージ(NFS Server on VM編)

こんにちは、サイオステクノロジー技術部 武井です。今回は、Azure Kubernetes Serviceで利用できる共有ストレージの中で、Virtual Machine上にNFS Serverを立ててみるのを試してみました。

Azure Kubernetes Serviceで利用できる共有ストレージ

公式マニュアルでは、Azure Kubernetes Serviceで利用できる共有ストレージは以下の3つがあります。

  • Azure Files
  • Virtual Machine上に立てたNFSサーバー
  • Azure Netapp Files

今回はVirtual Machine上に立てたNFSサーバーを試してみることにします。

早速実践!!

以下のマイクロソフトのサイトに記載の手順に従っています。

https://docs.microsoft.com/ja-jp/azure/aks/azure-nfs-volume

まずUbuntu Serverの仮想マシンを構築して以下のスクリプトを実行して、NFS Serverをインストールします。基本的に以下のコマンドを実行すると、NFS Serverが一発でインストール出来ます。引数を3つ取りますが、3つ目の引数はNFSサーバーを公開するサブネットを指定します。特に指定しなければ、全てのサブネットに対して公開されますが、絞りたい場合は、AKSのノードが配置されているサブネットを指定して下さい。
#!/bin/bash

# This script should be executed on Linux Ubuntu Virtual Machine

EXPORT_DIRECTORY=${1:-/export/data}
DATA_DIRECTORY=${2:-/data}
AKS_SUBNET=${3:-*}

echo "Updating packages"
apt-get -y update

echo "Installing NFS kernel server"

apt-get -y install nfs-kernel-server

echo "Making data directory ${DATA_DIRECTORY}"
mkdir -p ${DATA_DIRECTORY}

echo "Making new directory to be exported and linked to data directory: ${EXPORT_DIRECTORY}"
mkdir -p ${EXPORT_DIRECTORY}

echo "Mount binding ${DATA_DIRECTORY} to ${EXPORT_DIRECTORY}"
mount --bind ${DATA_DIRECTORY} ${EXPORT_DIRECTORY}

echo "Giving 777 permissions to ${EXPORT_DIRECTORY} directory"
chmod 777 ${EXPORT_DIRECTORY}

parentdir="$(dirname "$EXPORT_DIRECTORY")"
echo "Giving 777 permissions to parent: ${parentdir} directory"
chmod 777 $parentdir

echo "Appending bound directories into fstab"
echo "${DATA_DIRECTORY}    ${EXPORT_DIRECTORY}   none    bind  0  0" >> /etc/fstab

echo "Appending localhost and Kubernetes subnet address ${AKS_SUBNET} to exports configuration file"
echo "/export        ${AKS_SUBNET}(rw,async,insecure,fsid=0,crossmnt,no_subtree_check)" >> /etc/exports
echo "/export        localhost(rw,async,insecure,fsid=0,crossmnt,no_subtree_check)" >> /etc/exports

nohup service nfs-kernel-server restart

 

次にPersistentVolumeを作成します。

apiVersion: v1
kind: PersistentVolumemetadata:
  name: nfs-pv
  labels:
    type: nfs
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  nfs:
    # 先程構築したNFSサーバーのIPアドレスを指定します。
    server: 10.240.0.7
    # 先のスクリプトで指定した3つ目の引数のDATA_DIRECTORYを指定します。
    path: /data

 

次にPersistentVolumeClaimを指定します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  # storageClassNameは必ず空にします。
  storageClassName: ""
  resources:
    requests:
      storage: 10Gi
  selector: 
    matchLabels:
      type: nfs

 

最後にボリュームをマウントするためのDeploymentリソースを定義するマニフェストを書きます。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: hoge
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: httpsd:2.4.41
        ports:
        - containerPort: 80
        # マウントするための設定です。
        volumeMounts:
          # spec.template.sec.volumes.nameで定義した値を指定します。
          - name: nfs-vlm
            # マウントしたいパスを指定します。
            mountPath: /var/www/html
      volumes:
      - name: nfs-vlm
        persistentVolumeClaim:
          # 先ほど作成したpersistentVolumeClaimのmetadata.nameを指定します。
          claimName: nfs-pvc

 

これで完了です。簡単ですね。

まとめ

Kuberbetesでデータを永続化したい場合は必ず何らかの共有ストレージは必須になります。今回ご紹介した方法は仮想マシン上にNFSサーバーを立てるというレガシーな方法です。実はNFSのマネージドサービスのAzure Netapp Filesというのがあるので、次はそれをご紹介します。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です