Azure Kubernetes Service (AKS) を使用した Linux NFS (Network File System) サーバーを手動で作成して使用する
コンテナー間のデータ共有はしばしば、コンテナーを基盤とするサービスやアプリケーションで必要となります。 一般的に、外部の永続ボリューム上の同じ情報にさまざまなポットでアクセスする必要があります。 Azure Files という選択肢がありますが、永続的共有ストレージのもう 1 つの形態が Azure VM 上で NFS Server を作成することです。
この記事では、Azure Ubuntu 仮想マシン上に NFS サーバーを作成し、この共有ファイル システムにアクセスできる AKS クラスターを永続ボリュームとして設定する方法について説明します。
開始する前に
この記事では、この構成をサポートする次のコンポーネントと構成があることを前提としています。
- 既存の AKS クラスター。 AKS クラスターが必要であれば、Azure CLI を使用した場合、Azure PowerShell を使用した場合、または Azure portal を使用した場合の AKS クイックスタートを参照してください。
- AKS クラスターは、NFS サーバーと同じまたはピアリングされた Azure 仮想ネットワーク (VNet) 上にある必要があります。 クラスターは、NFS サーバー VM と同じ VNet にできる既存の VNet 上に作成する必要があります。 既存の VNet を使用して構成する手順については、既存の VNET での AKS クラスターの作成および VNET ピアリングを使用した仮想ネットワークの接続で説明されています。
- バージョン 18.04 以降を実行している Azure Ubuntu Linux 仮想マシン。 Azure に Linux VM をデプロイするには、「Linux VM の作成と管理」を参照してください。
最初に AKS クラスターをデプロイすると、Azure Ubuntu VM をデプロイするときに Azure によって仮想ネットワーク設定が自動的に設定され、Ubuntu VM が同じ VNet に関連付けられます。 ただし、代わりに対等なネットワークを使用する場合、上記のドキュメントを参照してください。
仮想マシンへの NFS サーバーのデプロイ
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 サーバーへの接続を続行できます。
Linux VM を作成した後、次のコマンドを使用して、前の手順で作成したファイルをローカル コンピューターから VM にコピーします。
scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
ファイルがコピーされたら、VM への Secure Shell (SSH) 接続を開き、次のコマンドを実行します。
sudo ./nfs-server-setup.sh
アクセス却下エラーで実行できなかった場合、次のコマンドを実行して、すべての実行アクセス許可を設定します。
chmod +x ~/nfs-server-setup.sh
AKS クラスターを NFS サーバーに接続する
永続ボリュームとボリュームへのアクセス方法を指定する永続ボリューム要求をプロビジョニングすることで、NFS Server を AKS クラスターに接続できます。 同じ仮想ネットワークまたはピアリングされた仮想ネットワーク内の 2 つのリソースを接続する必要があります。 同じ VNet にクラスターを設定する方法については、「既存の VNet での AKS クラスターの作成」を参照してください。
両方のリソースが同じ仮想 VNet またはピアリングされた VNet 上にある場合は、次に AKS クラスターで永続ボリュームと永続ボリューム要求をプロビジョニングします。 その後、コンテナーでは、NFS ドライブをそのローカル ディレクトリにマウントできます。
PersistentVolume を使用して pv-azurefilesnfs.yaml ファイルを作成します。 次に例を示します。
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_IP、NFS_NAME、NFS_EXPORT_FILE_PATHの値を、NFS サーバーの実際の設定に置き換えます。
PersistentVolume を使用する PersistentVolumeClaim を使って pvc-azurefilesnfs.yaml ファイルを作成します。 次に例を示します。
重要
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
次のステップ
- 関連するベスト プラクティスについては、AKS のストレージとバックアップに関するベスト プラクティスに関する記事を参照してください。
- NFS サーバーのセットアップの詳細、または問題のデバッグについては、Ubuntu コミュニティのチュートリアルから次の NFS チュートリアル を参照してください