Azure Arc で有効になっている AKS 内のアプリケーションのストレージ オプション

適用対象: AKS on Azure Stack HCI 22H2、AKS on Windows Server

Azure Arc デプロイ オプション (AKS Arc) で有効になっているAzure Kubernetes Serviceを使用して AKS デプロイで実行されるアプリケーションでは、データの格納と取得が必要になる場合があります。 一部のアプリケーション ワークロードでは、ポッドが削除されると、不要なノード上のローカルの高速ストレージをデータで使用できます (Kubernetes は "ポッド" を使用してアプリケーションのインスタンスを実行します)。

他のワークロードでは、通常のデータ ボリューム上に永続的なストレージが必要になることがあります。 複数のポッドが同じデータ ボリュームを共有するか、またはポッドが別のノード上に再スケジュールされると、データ ボリュームに再接続する必要があります。 また、ポッドに機密データまたはアプリケーション構成情報が含まれる場合、ストレージ オプションが必要になる場合があります。

クラスター マスターとノードを示す、アーキテクチャ ストレージの図

この記事では、AKS Arc のアプリケーションにストレージを提供する主要な概念について説明します。次に示します。

  • ボリューム
  • 永続ボリューム
  • ストレージ クラス
  • 永続ボリューム要求 (PVC)

ボリューム

多くの場合、アプリケーションではデータの格納と取得を行う必要があります。 通常、Kubernetes では、破棄できる一時的なリソースとして個々のポッドが扱われるため、アプリケーションでデータを使用したり保存したりするためのさまざまなアプローチが提供されています。 ボリュームとは、複数のポッドにまたがり、アプリケーション ライフサイクルを通じて、データを格納、取得、および保存する手段です。

Kubernetes におけるボリュームは、情報を格納して取得するだけの従来のディスクとは異なります。 Kubernetes のボリュームは、コンテナーで使用するために、ポッドにデータを挿入する手段としても使用できます。 Kubernetes の一般的なボリュームの種類は次のとおりです。

  • emptyDir - 通常、このボリュームはポッド用の一時的な領域として使用されます。 ポッド内のすべてのコンテナーが、このボリューム上のデータにアクセスできます。 この種類のボリュームに書き込まれたデータはポッドの有効期間しか保持されません。ポッドが削除されると、ボリュームは削除されます。 一般的にこのボリュームは基礎となるローカル ノードのディスク ストレージを使用しますが、ノードのメモリ内のみに存在することもできます。

  • secret - このボリュームは、パスワードなどの機密データをポッドに含めるために使用されます。 まず Kubernetes API を使用してシークレットを作成します。 ポッドまたはデプロイを定義するとき、特定のシークレットを要求できます。 シークレットは、シークレットを必要とするポッドがスケジュールされているノードのみに提供されます。シークレットは tmpfs に格納され、ディスクには書き込まれません。 シークレットを必要とする最後のポッドがノードから削除されると、シークレットはノードの tmpfs から削除されます。 シークレットは、指定した名前空間内に格納され、同じ名前空間内のポッドによってのみアクセスできます。

  • configMap - この種類のボリュームは、アプリケーション構成情報など、キーと値のペアのプロパティをポッドに挿入するために使用されます。 コンテナー イメージ内にアプリケーション構成情報を定義する代わりに、Kubernetes リソースとして定義すると、簡単に更新でき、デプロイ時にポッドの新しいインスタンスに適用できます。 シークレットの使用と同じく、最初に Kubernetes API を使用して ConfigMap を作成します。 その後、ポッドまたはデプロイを定義するときに、この ConfigMap を要求できます。 ConfigMap は、指定した名前空間内に格納され、同じ名前空間内のポッドによってのみアクセスできます。

永続ボリューム

ポッド ライフサイクルの一部として定義および作成されるボリュームは、そのポッドが削除されるまでしか存在しません。 メンテナンス イベントでポッドが別のホストに再スケジュールされた場合でも、多くの場合、ポッドはストレージがそのまま存在することを予期しています (特に StatefulSets)。 永続ボリュームは、Kubernetes API によって作成および管理されるストレージ リソースであり、個々のポッドの有効期間が終了しても存在できます。

READWriteOnce としてマウントされ、一度に 1 つのノードからアクセスできる VHDX によってサポートされる AKS ディスク ボリュームを使用できます。 または、SMB または NFS ファイル共有によってバックアップされた AKS ファイル ボリュームを使用することもできます。 これらは ReadWriteMany としてマウントされるため、複数のノードで同時に使用できます。

永続ボリュームは、クラスター管理者が静的に作成することも、Kubernetes API サーバーを使用して動的に作成することもできます。 ポッドがスケジュールされ、そのポッドが現在使用可能でないストレージを要求すると、Kubernetes は基礎となる VHDX ファイルを作成して、ポッドに接続することができます。 動的なプロビジョニングでは StorageClass を使用して、どの種類の Azure Storage を作成する必要があるかを特定します。

ストレージ クラス

ストレージのさまざまなレベル (および場所) を定義するには、StorageClass を作成します。 StorageClass によって reclaimPolicy も定義されます。 この reclaimPolicy が、ポッドが削除されて永続ボリュームが不要になる可能性がある場合の、基礎となるストレージ リソースの動作を制御します。 基礎となるストレージ リソースは削除することも、将来のポッドで使用するために保持しておくこともできます。

AKS Arc では、 既定 のストレージ クラスが自動的に作成され、CSV を使用して VHDX ベースのボリュームが作成されます。 解放ポリシーによって、基礎となる VHDX を使用していた永続ボリュームが削除されるときに、VHDX も確実に削除されます。 ストレージ クラスによって永続ボリュームを拡張可能にする構成も行われるため、必要なのは、永続ボリューム要求を新しいサイズを使用して編集することだけです。

永続ボリュームで StorageClass が指定されない場合は、既定の StorageClass が使用されます。 永続ボリュームを要求するときは、必要とする適切なストレージが使用されていることを確認します。 その他のニーズのために StorageClass を作成できます。

永続ボリューム要求

PersistentVolumeClaim は、特定の StorageClass の ReadWriteOnce または ReadWriteMany ストレージとサイズを要求します。 Kubernetes API サーバーは、定義された StorageClass に基づいて要求を満たす既存のリソースがない場合、基になるストレージ リソースを AKS Arc で動的にプロビジョニングできます。 ボリュームがポッドに接続されると、ポッドの定義にボリューム マウントが含まれます。

要求したポッドに、使用可能なストレージ リソースがポッドに割り当てられると、PersistentVolume が PersistentVolumeClaim に "バインド" されます。 永続ボリュームと要求は 1 対 1 のマッピングです。

次の例の YAML マニフェストは、default StorageClass を使用し、サイズが 5Gi のディスクを要求する永続ボリューム要求を示しています。

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
  name: aks-hci-vhdx 
spec: 
  accessModes: 
  - ReadWriteOnce 
  storageClassName: default 
  resources: 
    requests: 
      storage: 5Gi 

ポッド定義を作成するとき、必要なストレージを要求するために永続ボリューム要求が指定されます。 また、アプリケーションがデータを読み書きするための volumeMount も指定します。 次の例の YAML マニフェストは、前の永続ボリューム要求を使用してボリュームを /mnt/aks-hci にマウントする方法を示しています。

kind: Pod 
apiVersion: v1 
metadata: 
  name: nginx 
spec: 
  containers: 
    - name: myfrontend 
      image: k8s.gcr.io/nginx 
      volumeMounts: 
      - mountPath: "/mnt/aks-hci" 
        name: volume
  nodeSelector:
      kubernetes.io/os: linux
  volumes: 
    - name: volume 
      persistentVolumeClaim: 
        claimName: aks-hci-vhdx 

次の例では、Windows コンテナー内のボリュームをマウントして、ドライブ文字とパスを指定する方法を示します。

volumeMounts: 
        - mountPath: "d:" 
          name: volume 
        - mountPath: "c:\k" 
          name: k-dir 

次のステップ