Azure Kubernetes Service (AKS) を使用した Linux NFS (Network File System) サーバーを手動で作成して使用する

コンテナー間のデータ共有はしばしば、コンテナーを基盤とするサービスやアプリケーションで必要となります。 一般的に、外部の永続ボリューム上の同じ情報にさまざまなポットでアクセスする必要があります。 Azure Files という選択肢がありますが、永続的共有ストレージのもう 1 つの形態が Azure VM 上で NFS サーバーを作成することです。

この記事では、Azure Ubuntu 仮想マシン上に NFS サーバーを作成し、この共有ファイル システムにアクセスできる AKS クラスターを永続ボリュームとして設定する方法について説明します。

開始する前に

この記事では、この構成をサポートする次の要素があることを前提としています。

最初に AKS クラスターをデプロイすると、Azure Ubuntu VM をデプロイするときに Azure によって仮想ネットワーク設定が自動的に設定され、Ubuntu VM が同じ VNet に関連付けられます。 代わりにピアリングされたネットワークを使いたい場合は、上記のドキュメントを参照してください。

仮想マシンへの NFS サーバーのデプロイ

  1. NFS サーバーを Azure Ubuntu 仮想マシンにデプロイするには、次の Bash スクリプトをコピーしてローカル コンピューターに保存します。 変数 AKS_SUBNET の値を AKS クラスターの正しい値に置き換えます。そうでない場合は、指定された既定値により、すべてのポートと接続に対して NFS サーバーが開きます。 この記事では、ファイルの名前を nfs-server-setup.sh と指定します。

    #!/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
    

    スクリプトによって NFS サーバーの再起動が開始され、その後、AKS クラスターから NFS サーバーへの接続を続行できます。

  2. Linux VM を作成した後、次のコマンドを使用して、前の手順で作成したファイルをローカル コンピューターから VM にコピーします。

    scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
    
  3. ファイルがコピーされたら、VM への Secure Shell (SSH) 接続を開き、次のコマンドを実行します。

    sudo ./nfs-server-setup.sh
    

    アクセス却下エラーで実行できなかった場合、次のコマンドを実行して、すべての実行アクセス許可を設定します。

    chmod +x ~/nfs-server-setup.sh
    

AKS クラスターを NFS サーバーに接続する

AKS クラスターから NFS サーバーに接続するには、永続ボリュームと、ボリュームへのアクセス方法を指定する永続ボリューム要求をプロビジョニングします。 同じ仮想ネットワークまたはピアリングされた仮想ネットワーク内の 2 つのリソースを接続する必要があります。 同じ VNet にクラスターを設定する方法については、「既存の VNet での AKS クラスターの作成」を参照してください。

同じ仮想 VNet またはピアリングされた VNet 上に両方のリソースを配置したら、AKS クラスターで永続ボリュームと永続ボリューム要求をプロビジョニングします。 その後、コンテナーでは、NFS ドライブをそのローカル ディレクトリにマウントできます。

  1. pv-azurefilesnfs.yaml という名前の YAML マニフェストを作成して PersistentVolume を指定します。 次に例を示します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: NFS_NAME
      labels:
        type: nfs
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      nfs:
        server: NFS_INTERNAL_IP
        path: NFS_EXPORT_FILE_PATH
    

    NFS_INTERNAL_IPNFS_NAMENFS_EXPORT_FILE_PATHの値を、NFS サーバーの実際の設定に置き換えます。

  2. pvc-azurefilesnfs.yaml という名前の YAML マニフェストを作成して、PersistentVolume を使用する PersistentVolumeClaim を指定します。 次に例を示します。

    重要

    storageClassName 値は空の文字列にする必要があります。空ではないと、要求は機能しません。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: NFS_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 1Gi
      selector: 
        matchLabels:
          type: nfs
    

    NFS_NAMEの値を NFS サーバーの実際の設定に置き換えます。

トラブルシューティング

AKS クラスターからサーバーに接続できない場合は、エクスポートされたディレクトリまたはその親に NFS サーバー VM にアクセスするための十分なアクセス許可がないことが問題である可能性があります。

エクスポート ディレクトリとその親ディレクトリの両方にアクセス許可 777 が付与されていることを確認してください。

次のコマンドを実行することでアクセス許可を確認できます。ディレクトリに 'drwxrwxrwx' というアクセス許可が与えられている必要があります。

ls -l

次のステップ