NFS (Network File System) Linux Server ボリュームを手動で作成し、Azure Kubernetes Service (AKS) と共に使用するManually create and use an NFS (Network File System) Linux Server volume with Azure Kubernetes Service (AKS)

コンテナー間のデータ共有はしばしば、コンテナーを基盤とするサービスやアプリケーションで必要となります。Sharing data between containers is often a necessary component of container-based services and applications. 一般的に、外部の永続ボリューム上の同じ情報にさまざまなポットでアクセスする必要があります。You usually have various pods that need access to the same information on an external persistent volume.
Azure Files という選択肢がありますが、永続的共有ストレージのもう 1 つの形態が Azure VM 上で NFS Server を作成することです。While Azure files are an option, creating an NFS Server on an Azure VM is another form of persistent shared storage.

この記事では、Ubuntu 仮想マシンで NFS Server を作成する方法について説明します。This article will show you how to create an NFS Server on an Ubuntu virtual machine. この共有ファイル システムへの AKS コンテナー アクセスを与える方法についても説明します。And also give your AKS containers access to this shared file system.

開始する前にBefore you begin

この記事は、AKS クラスターがすでに存在していることを前提としています。This article assumes that you have an existing AKS Cluster. AKS クラスターが必要な場合は、Azure CLI を使用してまたはAzure portal を使用して AKS のクイック スタートを参照してください。If you need an AKS Cluster, see the AKS quickstart using the Azure CLI or using the Azure portal.

AKS クラスターは、NFS Server と同じか、対等の仮想ネットワークに置く必要があります。Your AKS Cluster will need to live in the same or peered virtual networks as the NFS Server. クラスターは既存の VNET に作成する必要があります。この VNET は、VM と同じ VNET でもかまいません。The cluster must be created in an existing VNET, which can be the same VNET as your VM.

既存の VNET で構成する手順については、「creating AKS Cluster in existing VNET」 (既存の VNET で AKS クラスターを作成する) と「connecting virtual networks with VNET peering」 (VNET ピアリングで仮想ネットワークを接続する) というドキュメントで説明していますThe steps for configuring with an existing VNET are described in the documentation: creating AKS Cluster in existing VNET and connecting virtual networks with VNET peering

また、Ubuntu Linux 仮想マシン (18.04 LTS など) を作成しているものとします。It also assumes you've created an Ubuntu Linux Virtual Machine (for example, 18.04 LTS). 設定とサイズは自分の好みに合わせることができます。また、Azure 経由でデプロイできます。Settings and size can be to your liking and can be deployed through Azure. Linux のクイック スタートについては、「Linux VM 管理」を参照してください。For Linux quickstart, see linux VM management.

AKS クラスターを最初にデプロイする場合、Azure によって、Ubuntu マシンのデプロイ時、仮想ネットワーク フィールドが自動的に入力され、同じ VNET 内で稼働します。If you deploy your AKS Cluster first, Azure will automatically populate the virtual network field when deploying your Ubuntu machine, making them live within the same VNET. ただし、代わりに対等なネットワークを使用する場合、上記のドキュメントを参照してください。But if you want to work with peered networks instead, consult the documentation above.

仮想マシンに NFS Server をデプロイするDeploying the NFS Server onto a Virtual Machine

次は、Ubuntu 仮想マシン内で NFS Server を設定するためのスクリプトです。Here is the script to set up an NFS Server within your Ubuntu virtual machine:

#!/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 Server を AKS にマウントできます。The server will restart (because of the script) and you can mount the NFS Server to AKS

重要

AKS_SUBNET を自分のクラスターからの情報に変更します。"*" を指定した場合、NFS Server がすべてのポートと接続に対してオープンになります。Make sure to replace the AKS_SUBNET with the correct one from your cluster or else "*" will open your NFS Server to all ports and connections.

VM を作成したら、上記のスクリプトをファイルにコピーします。After you've created your VM, copy the script above into a file. その後、次を使用し、ファイルをローカル コンピューターから (あるいはスクリプトが置かれている他の場所から) VM に次の方法で移動できます。Then, you can move it from your local machine, or wherever the script is, into the VM using:

scp /path/to/script_file username@vm-ip-address:/home/{username}

自分の VM にスクリプトが置かれたら、VM に ssh で通信し、コマンドからスクリプトを実行できます。Once your script is in your VM, you can ssh into the VM and execute it via the command:

sudo ./nfs-server-setup.sh

アクセス却下エラーで実行できなかった場合、コマンドから実行権限を設定できます。If its execution fails because of a permission denied error, set execution permission via the command:

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

AKS クラスターを NFS サーバーに接続するConnecting AKS Cluster to NFS Server

永続ボリュームとボリュームへのアクセス方法を指定する永続ボリューム要求をプロビジョニングすることで、NFS Server をクラスターに接続できます。We can connect the NFS Server to our cluster by provisioning a persistent volume and persistent volume claim that specifies how to access the volume.
同じまたは対等の仮想ネットワークにある 2 つのサービスを接続する必要があります。Connecting the two services in the same or peered virtual networks is necessary. 同じ VNET でクラスターを設定する方法は、「creating AKS Cluster in existing VNET」 (既存の VNET で AKS クラスターを作成する) にあります。Instructions for setting up the cluster in the same VNET are here: creating AKS Cluster in existing VNET

同じ仮想ネットワーク (または、対等な仮想ネットワーク) に置かれている場合、AKS クラスターで永続ボリュームと永続ボリューム要求をプロジェクトする必要があります。Once they are in the same virtual network (or peered), you need to provision a persistent volume and a persistent volume claim in your AKS Cluster. その後、コンテナーでは、NFS ドライブをそのローカル ディレクトリにマウントできます。The containers can then mount the NFS drive to their local directory.

次は、永続ボリュームの kubernetes 定義の例です (この定義では、クラスターと VM が同じ VNET にあるものとしています)。Here is an example kubernetes definition for the persistent volume (This definition assumes your cluster and VM are in the same VNET):

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_NAMENFS_EXPORT_FILE_PATH を NFS Server の情報に変更します。Replace NFS_INTERNAL_IP, NFS_NAME and NFS_EXPORT_FILE_PATH with NFS Server information.

永続ボリューム要求のファイルも必要になります。You'll also need a persistent volume claim file. たとえば、次のものを含めます。Here is an example of what to include:

重要

"storageClassName" は空の文字列にする必要があります。空ではないと、要求は機能しません。"storageClassName" needs to remain an empty string or the claim won't work.

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

トラブルシューティングTroubleshooting

クラスターからサーバーに接続できない場合、エクスポート ディレクトリかその親にサーバーにアクセスするための権限が与えられていない可能性があります。If you can't connect to the server from a cluster, an issue might be the exported directory, or its parent, doesn't have sufficient permissions to access the server.

エクスポート ディレクトリとその親ディレクトリの両方にアクセス許可 777 が与えられていることを確認してください。Check that both your export directory and its parent directory have 777 permissions.

下のコマンドを実行することでアクセス許可を確認できます。ディレクトリに 'drwxrwxrwx' というアクセス許可が与えられている必要があります。You can check permissions by running the command below and the directories should have 'drwxrwxrwx' permissions:

ls -l

詳細情報More information

完全なチュートリアルが必要であれば、あるいは NFS Server セットアップのデバッグでサポートが必要な場合、次の詳しいチュートリアルをご覧ください。To get a full walkthrough or to help you debug your NFS Server setup, here is an in-depth tutorial:

次の手順Next steps

関連するベスト プラクティスについては、AKS のストレージとバックアップに関するベスト プラクティスに関する記事を参照してください。For associated best practices, see Best practices for storage and backups in AKS.