次の方法で共有


Azure ファイル共有をマウントするときのエラー

この記事では、Azure ファイル共有のマウントが失敗する原因となるエラーの考えられる原因と解決策について説明します。

現象

デプロイや StatefulSet などの Kubernetes リソースは、Azure Kubernetes Service (AKS) 環境にデプロイします。 デプロイでは、Azure ファイル共有を参照する PersistentVolumeClaim (PVC) をマウントするポッドが作成されます。

ただし、ポッドは ContainerCreating 状態のままです。 kubectl describe pods コマンドを実行すると、コマンド出力に次のいずれかのエラーが表示され、マウント操作が失敗することがあります。

例として、次の出力を参照してください。

MountVolume.MountDevice failed for volume "\<pv-fileshare-name>"
rpc error: code = Internal desc =
volume(\<storage-account's-resource-group>#\<storage-account-name>#\<pv/fileshare-name>#) > mount "//\<storage-account-name>.file.core.windows.net/\<pv-fileshare-name>" on "/var/lib/kubelet/plugins/kubernetes.io/csi/pv/\<pv-fileshare-name>/globalmount" failed with
mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t cifs -o dir_mode=0777,file_mode=0777,uid=0,gid=0,mfsymlinks,cache=strict,actimeo=30,\<masked> //\<storage-account-name>.file.core.windows.net/\<pv-name> /var/lib/kubelet/plugins/kubernetes.io/csi/pv/\<pv-name>/globalmount
Output: mount error(\<error-id>): \<error-description>
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)

Note

  • ストレージ アカウントにパブリックにアクセスできる場合、出力に表示されるホスト名は <storage-account-name>.file.core.windows.net になります。
  • ストレージ アカウントがプライベート リンク、エンドポイント、または DNS ゾーンを使用してプライベートに構成されている場合、ホスト名は <storage-account-name>.privatelink.file.core.windows.net になります。

トラブルシューティングの前に

次の例に示すように、出力のメッセージに従って、ストレージ アカウントとファイル共有を特定します。これらの値は後のトラブルシューティング手順で使われます。

mount "//<storage-account-name>.file.core.windows.net/<pv-fileshare-name>"

考えられる原因と解決方法については、以下のセクションを参照してください。

マウント エラー (2):を開けませんでした 原因: ファイルまたはディレクトリが存在しません

このエラーは、AKS クラスターとストレージ アカウント間に接続がないことを示します。

初期のトラブルシューティング

Azure File は SMB プロトコル (ポート 445) に依存しています。 ポート 445 とストレージ アカウントの IP アドレスがブロックされていないことを確認します。

ストレージ アカウントの IP アドレスを確認するには、nslookupdighost などのドメイン ネーム システム (DNS) コマンドを実行します。 例えば次が挙げられます。

nslookup <storage-account-name>.file.core.windows.net

AKS クラスターとストレージ アカウント間に接続があるかどうかを確認するには、ノードまたはポッド内に移動し、次の nc または telnet コマンドを実行します。

nc -v -w 2 <storage-account-name>.file.core.windows.net 445
telnet <storage-account-name>.file.core.windows.net 445

マウント エラー (2) の考えられる原因

Note

  • 原因 1、2、4 は、パブリックおよびプライベート ストレージ アカウントのシナリオに適用されます。
  • 原因 3 は、パブリック シナリオにのみ適用されます。

原因 1: ファイル共有が存在しない

ファイル共有が存在するかどうかを確認するには、以下の手順を実行します。

  1. Azure portal で Storage アカウント を検索し、ストレージ アカウントにアクセスします。

    Azure portal のストレージ アカウントの一覧のスクリーンショット。

  2. ストレージ アカウントの Data storage File 共有を選択し、ポッド、デプロイ、またはステートフルセットの yaml ファイルに関連付けられている PersistentVolumeClaim が File 共有に存在するかどうかを確認

    ストレージ アカウントでファイル共有を選択するスクリーンショット。

解決策: ファイル共有が存在することを確認する

この問題を解決するには、PV/PVC に関連付けられたファイル共有が存在することを確認します。

原因 2: ネットワーク セキュリティ グループが AKS とストレージ アカウント間のトラフィックをブロックしている

Initial troubleshooting」セクションで説明されているncまたはtelnet コマンドの出力を確認します。 タイムアウトが表示された場合は、ネットワーク セキュリティ グループ (NSG) を確認し、ストレージ アカウントの IP アドレスがブロックされていないことを確認します。

NSG がストレージ アカウントの IP アドレスをブロックしているかどうかを確認するには、以下の手順を実行します。

  1. Azure portal で、 Network Watcher に移動し NSG 診断 選択

  2. フィールドに次の値を入力します。

    • プロトコル:任意
    • 方向: 送信
    • ソースの種類: IPv4 アドレス/CIDR
    • IPv4 アドレス/CIDR: AKS ノードに関連付けられているインスタンスの IP アドレス
    • 宛先 IP アドレス: ストレージ アカウントの IP アドレス
    • 宛先ポート: 445
  3. Check ボタンを選択し、Traffic 状態を確認します。

Trafficの状態は、AllowedまたはDeniedできます。 Denied状態は、NSG が AKS クラスターとストレージ アカウント間のトラフィックをブロックしていることを意味します。 状態が Denied の場合、NSG 名が表示されます。

解決策: AKS とストレージ アカウント間の接続を許可する

この問題を解決するには、NSG レベルで適宜変更を加えて、ポート 445 での AKS クラスターとストレージ アカウント間の接続を許可します。

原因 3: 仮想アプライアンスが AKS とストレージ アカウント間のトラフィックをブロックしている

仮想アプライアンス (通常はファイアウォール) を使って AKS クラスターの送信トラフィックを制御している場合 (たとえば、仮想アプライアンスには AKS クラスターのサブネットで適用されるルート テーブルがあり、ルート テーブルには仮想アプライアンスに向けてトラフィックを送信するルートがある)、仮想アプライアンスは AKS クラスターとストレージ アカウント間のトラフィックをブロックする可能性があります。

問題を切り分けるために、ストレージ アカウントの IP アドレスのルート テーブルに、トラフィックをインターネットに送信するルートを追加します。

どのルート テーブルが AKS クラスターのトラフィックを制御しているかを確認するために、以下の手順を実行します。

  1. Azure portal で AKS クラスターに移動し、 Properties>Infrastructure リソース グループを選択します。
  2. 仮想マシン スケール セット (VMSS) または可用性セット内の VM (そのような VM セットの種類を使っている場合) にアクセスします。
  3. 仮想ネットワーク/サブネット>Subnets を選択し、AKS クラスターのサブネットを識別します。 右側にルート テーブルが表示されます。

ルート テーブルにルートを追加するには、「ルートの作成」の手順に従って次のフィールドに入力します。

  • アドレス プレフィックス: <storage-account's-public-IP>/32
  • 次ホップの種類:インターネット

このルートからは、AKS クラスターとストレージ アカウント間のすべてのトラフィックがパブリック インターネットを介して送信されます。

このルートを追加したら、nc または telnet コマンドを使って接続をテストし、マウント操作をもう一度実行します。

解決策: 仮想アプライアンスが AKS とストレージ アカウント間のトラフィックを許可していることを確認する

マウント操作に成功した場合は、ネットワーク チームに相談して、仮想アプライアンスがポート 445 で AKS クラスターとストレージ アカウント間のトラフィックを許可できることを確認することをお勧めします。

原因 4: FIPS 対応ノード プールが使われている

Federal Information Processing Standards (FIPS) 対応ノード プールを使っている場合、マウント操作は失敗します。これは、FIPS によ一部の認証モジュールが無効になり、その結果、CIFS 共有をマウントできなくなるためです。 これは想定された動作であり、AKS に固有のものではありません。

この問題を解決するには、次の解決策のいずれかを採用してください。

解決策 1: 非 FIPS ノード プール内のノードでポッドをスケジュールする

AKS ノード プールの既定で FIPS は無効であり、--enable-fips-image パラメーターを使ってノード プールの作成時にのみ有効にすることができます。

このエラーを解決するには、非 FIPS ノード プール内のノードでポッドをスケジュールします。

解決策 2: FIPS 対応ノードでスケジュールできるポッドを作成する

FIPS 対応ノードでスケジュールできるポッドを作成するには、以下の手順を実行します。

  1. Azure File CSI ドライバーを使って、NFS プロトコルを使うカスタムの StorageClass を作成します。

    次の YAML ファイルを例として参考にしてください。

    kind: StorageClass 
    apiVersion: storage.k8s.io/v1 
    metadata: 
      name: azurefile-sc-fips 
    provisioner: file.csi.azure.com 
    reclaimPolicy: Delete 
    volumeBindingMode: Immediate 
    allowVolumeExpansion: true 
    parameters: 
      skuName: Premium_LRS 
      protocol: nfs 
    

    NFS には Premium SKU が必要なので、YAML ファイルでは SKU が Premium_LRS に設定されています。 詳細については、「動的プロビジョニング」を参照してください。

    Premium SKU なので、ファイル共有の最小サイズは 100 GB です。 詳細については、「ストレージ クラスの作成」を参照してください。

  2. カスタム StorageClass azurefile-sc-fips を参照する PVC を作成します。

    次の YAML ファイルを例として参考にしてください。

    apiVersion: v1 
    kind: PersistentVolumeClaim 
    metadata: 
      name: azurefile-pvc-fips 
    spec: 
      accessModes: 
        - ReadWriteMany 
      storageClassName: azurefile-sc-fips 
      resources: 
        requests: 
          storage: 100Gi 
    
  3. PVC azurefile-pvc-fips をマウントするポッドを作成します。

    次の YAML ファイルを例として参考にしてください。

    kind: Pod 
    apiVersion: v1 
    metadata: 
      name: azurefile-pod-fips 
    spec: 
      containers: 
      - name: azurefile-pod-fips 
        image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine 
        resources: 
          requests: 
            cpu: 100m 
            memory: 128Mi 
          limits: 
            cpu: 250m 
            memory: 256Mi 
        volumeMounts: 
        - mountPath: "/mnt/azure" 
          name: volume 
      volumes: 
        - name: volume 
          persistentVolumeClaim: 
            claimName: azurefile-pvc-fips 
    

マウントマウント エラー (13): アクセス許可は拒否されました

このエラーの原因として、次のことが考えられます。

Note

  • 原因 1 は、パブリックとプライベートのシナリオに適用されます。
  • 原因 2 は、パブリック シナリオにのみ適用されます。
  • 原因 3 は、プライベート シナリオにのみ適用されます。
  • 原因 4 は、パブリックとプライベートのシナリオに適用されます。
  • 原因 5 は、パブリックシナリオとプライベート シナリオに適用されます。
  • 原因 6 は、パブリックとプライベートのシナリオに適用されます。

原因 1: Kubernetes のシークレットが正しいストレージ アカウント名またはキーを参照していない

ファイル共有が動的に作成場合、"azure-storage-account-<storage-account-name>-secret" という名前のKubernetes シークレット リソースが自動的に作成されます。

ファイル共有を手動で作成した場合は、Kubernetes シークレット リソースを手動で作成する必要があります。

作成方法に関係なく、Kubernetes シークレットで参照されるストレージ アカウント名やキーが実際の値と異なる場合、マウント操作は "アクセス許可が拒否されました" エラーで失敗します。

不一致の考えられる原因

  • Kubernetes シークレットを手動で作成した場合、作成時に入力ミスが発生する可能性があります。

  • ストレージ アカウント レベルで "キーのローテーション" 操作を実行した場合、その変更は Kubernetes のシークレット レベルには反映されません。 その結果、ストレージ アカウント レベルのキー値と Kubernetes シークレット レベルの値は一致しなくなります。

    "キーのローテーション" 操作が発生した場合、ストレージ アカウントの [アクティビティ ログ] に "ストレージ アカウント キーの再生成" という操作が表示されます。 90 日という [アクティビティ ログ] の保持期間に注意してください。

不一致を確認する

不一致を確認するには、以下の手順を実行します。

  1. Azure portal でストレージ アカウントを検索してアクセスします。 ストレージ アカウントで Access キー>Show キー を選択します。 ストレージ アカウント名とそれに関連付けられたキーが表示されます。

    ストレージ アカウント名とキーのスクリーンショット。

  2. AKS クラスターに移動し、 Configuration>Secrets を選択し、関連付けられているシークレットを検索してアクセスします。

    ストレージ アカウントの検索と選択のスクリーンショット。

  3. Show (目のアイコン) を選択し、ストレージ アカウント名と関連付けられているキーの値を手順 1 の値と比較します。

    シークレットのストレージ アカウント名とキーを示すスクリーンショット。

    Show を選択する前に、ストレージ アカウント名と関連付けられているキーの値が base64 文字列にエンコードされます。 Showを選択すると、値がデコードされます。

Azure portal で AKS クラスターにアクセスできない場合は、kubectl レベルで手順 2 を実行します。

  1. Kubernetes シークレットの YAML ファイルを取得し、次のコマンドを実行して、ストレージ アカウント名とキーの値を出力から取得します。

    kubectl get secret <secret-name> -n <secret-namespace> -o <yaml-file-name>
    
  2. echo コマンドを使って、ストレージ アカウント名とキーの値をデコードし、ストレージ アカウント レベルの値と比較します。

    ストレージ アカウント名をデコードする例を次に示します。

    echo -n '<storage account name>' | base64 --decode ;echo
    

    ストレージ アカウント名をデコードするコマンドのスクリーンショット。

解決策: Kubernetes シークレットを調整し、ポッドを再作成する

Kubernetes シークレットのストレージ アカウント名またはキーの値がストレージ アカウントの Access キー の値と一致しない場合は、次のコマンドを実行して Kubernetes シークレット レベルで Kubernetes シークレットを調整します。

kubectl edit secret <secret-name> -n <secret-namespace>

Kubernetes シークレット構成で追加したストレージ アカウント名またはキーの値は、base64 でエンコードされた値である必要があります。 エンコードされた値を取得するには、echo コマンドを使います。

ストレージ アカウント名をエンコードする例を次に示します。

echo -n '<storage account name>'| base64 | tr -d '\n' ; echo

詳細については、「Managing Secrets using kubectl」(kubectl を使ったシークレットの管理) を参照してください。

Kubernetes シークレット azure-storage-account-<storage-account-name>-secret に正しい値が設定されたら、ポッドを再作成します。 そうしないと、有効ではない古い値をそれらのポッドが使い続けることになります。

原因 2: このストレージ アカウントに AKS の VNET とサブネットは許可されていない

ストレージ アカウントのネットワークを選んだネットワークに限定している場合、その選んだネットワークに AKS クラスターの VNET とサブネットを追加していないと、マウント操作は "アクセス許可が拒否されました" エラーで失敗します。

解決策: ストレージ アカウントに AKS の VNET とサブネットを許可する

  1. 次のコマンドを実行して、障害のあるポッドをホストするノードを特定します。

    kubectl get pod <pod-name> -n <namespace> -o wide
    

    コマンドの出力でノードを確認します。

    ノードと出力を識別できるコマンドのスクリーンショット。

  2. Azure portal で AKS クラスターに移動し、 Properties>Infrastructure リソース グループを選択しノードに関連付けられている VMSS にアクセスし、 仮想ネットワーク/サブネット を確認して VNET とサブネットを識別します。

    仮想ネットワーク/サブネットの値のスクリーンショット。

  3. Azure portal でストレージ アカウントにアクセスします。 [ネットワーク] を選択します。 AKS クラスターの VNET とサブネット選択されたネットワークに設定されている場合AKS クラスターの VNET とサブネットが追加されているかどうかを確認します。

    空の選択されたネットワークの一覧のスクリーンショット。

    AKS クラスターの VNET とサブネットが追加されていない場合は、 既存の仮想ネットワークの追加を選択します。 ネットワークの追加 ページで、AKS クラスターの VNET とサブネットを入力し、追加>保存を選択します。

    ストレージ アカウントへのネットワークの追加のスクリーンショット。

    変更が有効になるまでに数分かかる場合があります。 VNET とサブネットが追加されたら、ポッドの状態が ContainerCreating から Running に変わるかどうかを確認します。

    現在のポッドの状態を示すコマンド出力のスクリーンショット。

原因 3: 接続はプライベート リンク経由だが、ノードとプライベート エンドポイントが異なる VNET 内にある

AKS クラスターとストレージ アカウントがプライベート リンクを介して接続されている場合、承認済みのプライベート エンドポイント接続が使われます。

プライベート エンドポイント接続のスクリーンショット。

このシナリオでは、プライベート エンドポイントと AKS ノードが同じ VNET にある場合、Azure ファイル共有をマウントできます。

プライベート エンドポイントと AKS クラスターが異なる VNET にある場合、マウント操作は "アクセス許可が拒否されました" エラーで失敗します。

ノード内に移動し、完全修飾ドメイン名 (FQDN) がパブリックまたはプライベートの IP アドレスを介して解決されているかどうかを確認します。 そのためには、次のコマンドを実行します。

nslookup <storage-account-name>.privatelink.file.core.windows.net

FQDN がパブリック IP アドレスを介して解決されている場合 (以下のスクリーンショットを参照してください)、プライベート DNS ゾーン ("privatelink.file.core.windows.net") レベルで AKS クラスターの VNET 用に仮想ネットワーク リンクを作成します。 仮想ネットワーク リンクは、ストレージ アカウントのプライベート エンドポイントの VNET 用に既に自動的に作成されていることに注意してください。

FQDN がパブリック IP アドレスによって解決されることを示すスクリーンショット。

仮想ネットワーク リンクを作成するには、以下の手順を実行します。

  1. プライベート DNS ゾーンにアクセスし、仮想ネットワーク リンク>追加を選択します。

    ストレージ アカウントに追加された仮想ネットワーク リンクを示すスクリーンショット。

  2. フィールドに入力し、 仮想ネットワークの AKS クラスターの VNET を選択。 AKS クラスターの VNET を特定する方法については、「解決策: ストレージ アカウントに AKS の VNET とサブネットを許可する」を参照してください。

    仮想ネットワーク リンクを追加する方法を示すスクリーンショット。

  3. [OK] を選択します。

仮想ネットワーク リンクを追加すると、FQDN はプライベート IP アドレスを介して解決され、マウント操作は成功するはずです。 例については、次のスクリーンショットを参照してください。

プライベート IP アドレスが解決されていることを示すスクリーンショット。

原因 4: クライアントがサポートしていない暗号化を要求するようにストレージ アカウントが設定されている

Azure Files の [セキュリティ設定] には、ストレージ アカウントに対するセキュリティと暗号化の設定を制御するオプションが多数あります。 許可する方法とアルゴリズムを制限すると、クライアントが接続できなくなる可能性があります。

1.25 より前の AKS バージョンは Ubuntu 18.04 LTS に基づいています。これは、Linux 5.4 カーネルを使い、AES-128-CCM と AES-128-GCM の暗号化アルゴリズムのみをサポートするものです。 [最大のセキュリティ] プロファイル、または AES-128-GCM を無効にする [カスタム] プロファイルは共有マッピング エラーの原因になります。

AKS バージョン 1.25 以降のバージョンは Ubuntu 22.04 に基づいています。これは、Linux 5.15 カーネルを使い、AES-256-GCM をサポートするものです。

解決策: AES-128-GCM の暗号化アルゴリズムを使用できるようにする

[最大の互換性] プロファイルまたは AES-128-GCM を有効にする [カスタム] プロファイルを使って、AES-128-GCM アルゴリズムを有効にします。 詳細については、Azure Files のセキュリティ設定に関する記事を参照してください。

原因 5: ストレージ アカウントの最小暗号化要件が満たされていない

解決策: すべてのストレージ アカウントに対して AES-128-GCM 暗号化アルゴリズムを有効にする

ファイル共有を正常にマウントまたはアクセスするには、すべてのストレージ アカウントに対して AES-128-GCM 暗号化アルゴリズムを有効にする必要があります。

AES-256-GCM 暗号化のみを使用する場合は、次の操作を行います。

Linux

次のスクリプトを使用して、クライアントが AES-256-GCM をサポートしているかどうかを確認し、サポートされている場合にのみ適用します。

cifsConfPath="/etc/modprobe.d/cifs.conf"
echo "$(date) before change ${cifsConfPath}:"
cat ${cifsConfPath}

# Check if 'require_gcm_256' is already present in the configuration file
if ! grep -q "require_gcm_256" "${cifsConfPath}"; then

    # Load the CIFS module
    modprobe cifs

    # Set the parameter at runtime
    echo 1 > /sys/module/cifs/parameters/require_gcm_256

    # Persist the configuration
    echo "options cifs require_gcm_256=1" >> "${cifsConfPath}"

    echo "$(date) after changing ${cifsConfPath}:"
    cat "${cifsConfPath}"
else
    echo "require_gcm_256 is already set in ${cifsConfPath}"
fi

Kubernetes DaemonSet を使用して、すべてのノードに AES-256 を適用することもできます。 次の例を参照してください。

support-cifs-aes-256-gcm.yaml

Windows

Set-SmbClientConfiguration PowerShell コマンドを使用して、SMB クライアントで使用される暗号化暗号と、ユーザーの確認なしで優先する暗号化の種類を指定します。

Set-SmbClientConfiguration -EncryptionCiphers "AES_256_GCM" -Confirm:$false

Note

EncryptionCiphers パラメーターは、x64 ベース システム (KB5014665) の Windows Server バージョン 21H2 用の 2022-06 累積的な更新プログラムと、Windows 11 バージョン 22H2 の累積的な更新プログラム (KB5014668) 以降で使用できます。

原因 6: NTLM v2 認証が有効になっていない状態でセキュリティ プロファイルが使用される

NTLM v2 認証メカニズムを有効にせずに Maximum セキュリティ プロファイルまたは Custom セキュリティ プロファイルを使用すると、マウント操作は "マウント エラー (13): アクセス許可が拒否されました" エラーで失敗します。

解決策: NTLM v2 認証を有効にするか、"最大互換性" プロファイルを使用する

AKS で適切にマウントするには、 NTLM v2 Custom セキュリティ プロファイルの認証メカニズムを有効にするか、 Maximum 互換性 セキュリティ プロファイルを使用する必要があります。

詳細

その他のマウント エラーが発生する場合は、「 Linux で Azure Files の問題をトラブルシューティングするを参照してください。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。