次の方法で共有


Azure Container Storage のトラブルシューティング

Azure Container Storage は、コンテナー用にネイティブに構築されたクラウドベースのボリューム管理、デプロイ、オーケストレーション サービスです。 この記事を使用して、Azure Container Storage の一般的な問題をトラブルシューティングし、問題の解決策を見つけます。

インストールの問題をトラブルシューティングする

構成の欠落により Azure Container Storage のインストールに失敗する

az aks create を実行した後、Azure Container Storage のインストールに失敗しました。AKS クラスターが作成されます。az aks update--enable-azure-container-storage を実行して、Azure Container Storage を有効にしてください。

このメッセージは、Azure Container Storage がインストールされなかったことを意味しますが、AKS クラスターは正しく作成されています。

Azure Container Storage をクラスターにインストールしてストレージ プールを作成するには、次のコマンドを実行します。 <cluster-name><resource-group> を独自の値に置き換えます。 <storage-pool-type> を、azureDiskephemeraldisk、または elasticSan に置き換えます。

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type>

Azure Policy の制限により Azure Container Storage のインストールに失敗する

Azure Policy の制限があると、Azure Container Storage のインストールに失敗する場合があります。 具体的には、Azure Container Storage は特権コンテナーに依存するため、Azure Policy によってブロックされることがあります。 これが発生すると、Azure Container Storage のインストールがタイムアウトまたは失敗する可能性があり、gatekeeper-controller のログに次のようなエラーが表示されることがあります。

{"level":"info","ts":1722622443.9484184,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: prereq, securityContext: {\"privileged\": true, \"runAsUser\": 0}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-prereq-gt58x","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622443.9839077,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: metrics-exporter, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-metrics-exporter-286np","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622444.0515249,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: csi-node, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-csi-node-7hcd7","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622444.0729053,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: io-engine, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-io-engine-84hwx","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622444.0742755,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: ndm, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-ndm-x6q5n","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}
{"level":"info","ts":1722622449.2412128,"logger":"webhook","msg":"denied admission: Privileged container is not allowed: ndm, securityContext: {\"privileged\": true}","hookType":"validation","process":"admission","details":{},"event_type":"violation","constraint_name":"azurepolicy-k8sazurev2noprivilege-686dd8b209a774ba977c","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"K8sAzureV2NoPrivilege","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"acstor","resource_name":"azurecontainerstorage-ndm-b5nfg","request_username":"system:serviceaccount:kube-system:daemon-set-controller"}

これを解決するには、Azure Policy の除外リストに acstor 名前空間を追加する必要があります。 Azure Policy は、AKS クラスターなど、Azure 内のリソースを管理するためのルールの作成と適用に使用されます。 ポリシーによって Azure Container Storage のポッドやコンポーネントの作成がブロックされる場合があります。 Kubernetes 用の Azure Policy の操作の詳細については、Kubernetes 用の Azure Policy に関する記事を参照してください。

除外リストに acstor 名前空間を追加するには、次の手順に従います。

  1. Azure Kubernetes クラスターを作成します
  2. AKS 用 Azure Policy を有効にします。
  3. Azure Container Storage のインストールをブロックしている疑いのあるポリシーを作成します。
  4. AKS クラスターに Azure Container Storage のインストールを試行します。
  5. gatekeeper-controller ポッドのログをチェックし、ポリシー違反がないか確認します。
  6. ポリシーの除外リストに acstor 名前空間を追加します。
  7. もう一度 AKS クラスターに Azure Container Storage のインストールを試行します。

ストレージ プールの種類を NVMe に設定できない

仮想マシン (VM) SKU に NVMe ドライブがないクラスターに、Azure Container Storage をエフェメラル ディスク、特にローカル NVMe でインストールしようとすると、次のようなエラー メッセージが表示されます: どのノードプールもエフェメラル NVMe ディスクをサポートできないため、--storage-pool-option を NVMe として設定できません

修復するには、NVMe ドライブを持つ VM SKU でノード プールを作成し、再試行してください。 ストレージ最適化 VM を参照してください。

ストレージ プールに関する問題のトラブルシューティング

ストレージ プールの状態を確認するには、kubectl describe sp <storage-pool-name> -n acstor を実行します。 発生する可能性のあるいくつかの問題を次に示します。

Azure Disks ストレージ プールを拡張しようとする際のエラー

既存のストレージ プールが 4 TiB (4,096 GiB) 未満の場合は、最大 4,095 GiB までしか拡張できません。 それを超えて拡張しようとすると、内部 PVC には次のようなエラー メッセージが表示されます: "4095 GB より大きいサイズのディスクでサポートされている Disk CachingType は 'None' だけです" または "サイズが 4096 GB (<=4096 GB) であるディスク 'xxx' は、実行中の VM にアタッチされた状態では 16384 GB (>4096 GB) にサイズ変更できません。 VM を停止するか、ディスクをデタッチして操作を再試行してください。"

エラーを回避するために、現在のストレージ プールが最初に 4 TiB (4,096 GiB) より小さい場合は、4,095 GiB を超えて拡張しようとすることは控えてください。 4 TiB より大きいストレージ プールは、利用可能な最大ストレージ容量まで拡張できます。

この制限が適用されるのは Premium_LRSStandard_LRSStandardSSD_LRSPremium_ZRSStandardSSD_ZRS のディスク SKU を使用する場合だけです。

Elastic SAN の作成に失敗する

Elastic SAN ストレージ プールを作成しようとしている場合、Azure Elastic SAN の作成に失敗する: サブスクリプションの Elastic SAN の最大可能数は既に作成されています。 これは、サブスクリプションごとにリージョンにデプロイできる Elastic SAN リソースの数が上限に達したことを意味します。 以下で制限を確認できます: Elastic SAN のスケーラビリティとパフォーマンスのターゲット。 サブスクリプションの既存の Elastic SAN リソースのうち、使用されていないものを削除するか、別のリージョンにストレージ プールを作成することを検討してください。

ブロック デバイスが見つかりません

このメッセージが表示された場合は、VM SKU に NVMe ドライブがないクラスター上でエフェメラル ディスク ストレージ プールを作成しようとしている可能性があります。

修復するには、NVMe ドライブを持つ VM SKU でノード プールを作成し、再試行してください。 「ストレージ最適化 VM」を参照してください。

ストレージ プールの種類は既に有効です

既に有効になっているストレージ プールの種類を有効にしようとすると、次のメッセージが表示されます: --enable-azure-container-storage 値が無効です。Azure Container Storage は、クラスター内のストレージ プールの種類 <storage-pool-type> で既に有効になっていますkubectl get sp -n acstor を実行することで、既存のストレージ プールが作成されているかどうかを確認できます。

ストレージ プールの種類の無効化

az aks update --disable-azure-container-storage <storage-pool-type> を介してストレージ プールの種類を無効にする場合、または az aks update --disable-azure-container-storage all を介して Azure Container Storage をアンインストールする場合、その種類の既存のストレージ プールがあると、次のメッセージが表示されます。

ストレージ プールの種類 <storage-pool-type> の Azure Container Storage を無効にすると、同種のすべてのストレージ プールが強制的に削除され、これらのストレージ プールを使用しているアプリケーションに影響があります。 ストレージ プールを強制的に削除すると、消費されているストレージ リソースが流出する可能性もあります。 Azure Container Storage を無効にする前に、種類 <storage-pool-type> のストレージ プールが使用されているかどうかを検証する必要がありますか? (Y/n)

Y を選択すると、自動検証が実行され、ストレージ プールから作成された永続ボリュームがないことが確認されます。 n を選択すると、この検証がバイパスされ、ストレージ プールの種類が無効になり、既存のストレージ プールが削除され、アプリケーションに影響を与える可能性があります。

AKS クラスターを含むリソース グループを削除できない

Elastic SAN ストレージ プールを作成した場合、AKS クラスターが配置されているリソース グループを削除できない場合があります。

これを解決するには、Azure portal にサインインし、[リソース グループ] を選択します。 AKS によって作成されたリソース グループを探します (リソース グループ名が MC_ で始まります)。 そのリソース グループ内の SAN リソース オブジェクトを選択します。 すべてのボリュームとボリューム グループを手動で削除します。 次に、AKS クラスターを含むリソース グループの削除を再試行します。

ボリュームの問題のトラブルシューティング

エフェメラル ボリュームのサイズが空き容量を超えているため、ポッドの作成は保留されています

エフェメラル ボリュームは単一ノードに割り当てられます。 ポッドのエフェメラル ボリュームのサイズを構成する場合、そのサイズを単一ノードのエフェメラル ディスクの空き容量より小さくする必要があります。 それ以外の場合、ポッドの作成は保留状態になります。

次のコマンドを使用して、ポッドの作成が保留中の状態かどうかを確認します。

$ kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
fiopod   0/1     Pending   0          17s

この例で、ポッド fiopodPending 状態です。

次のコマンドを使用して、ポッドに persistentvolumeclaim 作成の警告イベントがあるかどうかを確認します。

$ kubectl describe pod fiopod
...
Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  40s   default-scheduler  0/3 nodes are available: waiting for ephemeral volume controller to create the persistentvolumeclaim "fiopod-ephemeralvolume". preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling..

この例では、ポッドには永続ボリューム要求 fiopod-ephemeralvolume の作成に関する警告イベントが表示されます。

次のコマンドを使用して、容量不足が原因で永続ボリューム要求のプロビジョニングに失敗するかどうかを確認します。

$ kubectl describe pvc fiopod-ephemeralvolume
...
  Warning  ProvisioningFailed    107s (x13 over 20m)  containerstorage.csi.azure.com_aks-nodepool1-29463073-vmss000000_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  failed to provision volume with StorageClass "acstor-ephemeraldisk-temp": rpc error: code = Internal desc = Operation failed: GenericOperation("error in response: status code '507 Insufficient Storage', content: 'RestJsonError { details: \"Operation failed due to insufficient resources: Not enough suitable pools available, 0/1\", message: \"SvcError :: NotEnoughResources\", kind: ResourceExhausted }'")

この例では、ボリューム プロビジョニングの失敗の理由として Insufficient Storage が示されています。

次のコマンドを実行して、単一ノードのエフェメラル ディスクの空き容量を確認します。

$ kubectl get diskpool -n acstor
NAME                                CAPACITY      AVAILABLE     USED        RESERVED    READY   AGE
ephemeraldisk-temp-diskpool-jaxwb   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-temp-diskpool-wzixx   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-temp-diskpool-xbtlj   75660001280   75031990272   628011008   560902144   True    21h

この例では、単一ノードの一時ディスクの空き容量は、75031990272 バイト (つまり 69 GiB) です。

ボリューム ストレージ サイズを空き容量未満に調整し、ポッドを再デプロイします。 「汎用エフェメラル ボリュームを使用してポッドをデプロイする」を参照してください。

メタデータ ストアがオフラインであるため、ボリュームがアタッチに失敗する

Azure コンテナー ストレージは、分散された信頼性の高いキーと値のストアである etcd を使用して、ボリュームのメタデータを保存して管理し、ボリューム オーケストレーション操作をサポートします。 高可用性と回復性のために、etcd は 3 つのポッド内で実行されます。 実行中の etcd インスタンスが 2 つ未満の場合、Azure コンテナー ストレージはボリューム オーケストレーション操作を停止しますが、ボリュームへのデータ アクセスは引き続き許可します。 Azure コンテナー ストレージは、etcd インスタンスがオフラインであることを自動的に検出し、それを復元します。 しかし、AKS クラスターの再起動後にボリューム オーケストレーション エラーが発生した場合は、etcd インスタンスが自動回復に失敗した可能性があります。 このセクションの手順に従って、etcd インスタンスの正常性状態を確認してください。

次のコマンドを実行して、ポッドの一覧を取得します。

kubectl get pods

次のような出力が表示されます。

NAME     READY   STATUS              RESTARTS   AGE 
fiopod   0/1     ContainerCreating   0          25m 

次のようにポッドを describe します。

kubectl describe pod fiopod

メタデータ ストアがオフラインの場合は通常、ボリューム エラー メッセージが表示されます。 この例では、fiopodContainerCreating 状態であり、FailedAttachVolume 警告は、ボリューム アタッチ エラーが原因で作成が保留中であることを示します。

Name:             fiopod 

Events: 

Type     Reason              Age                 From                     Message 

----     ------              ----                ----                     ------- 

Normal   Scheduled           25m                 default-scheduler        Successfully assigned default/fiopod to aks-nodepool1-xxxxxxxx-vmss000009

Warning  FailedAttachVolume  3m8s (x6 over 23m)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" : timed out waiting for external-attacher of containerstorage.csi.azure.com CSI driver to attach volume xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

次のコマンドを実行して、etcd インスタンスの状態を確認することもできます。

kubectl get pods -n acstor | grep "^etcd"

すべてのインスタンスが Running 状態となっている次のような出力が表示されるはずです。

etcd-azurecontainerstorage-bn89qvzvzv                            1/1     Running   0               4d19h
etcd-azurecontainerstorage-phf92lmqml                            1/1     Running   0               4d19h
etcd-azurecontainerstorage-xznvwcgq4p                            1/1     Running   0               4d19h

Running 状態として表示されるインスタンスが 2 つ未満である場合は、メタデータ ストアがオフラインであることが原因でボリュームがアタッチに失敗しており、自動回復が成功しなかったと結論付けることができます。 これに該当する場合は、Azure サポートでサポート チケットを提出してください。

関連項目