ローカル SSD

このページでは、Kubernetes でのローカル SSD サポートの概要と、Google Kubernetes Engine でローカル SSD を使用する方法について説明します。

概要

ローカル SSD は、クラスタ内のすべてのノードに高性能な一時ストレージを提供します。ローカル SSD は、標準的なディスクより高いスループットと低いレイテンシを実現します。ローカル キャッシングとローカル処理がローカル SSD に適切なワークロードです。

クラスタのマシンタイプ制限とプロジェクトの割り当ての枠内で、ローカル SSD を使用したノードプールを作成できます。

制限事項

ローカル SSD を使用する場合は、次の制限事項に注意してください。

  • ローカル SSD はノードのホスト仮想マシン インスタンスに物理的に接続されるため、それらに保存されているデータはそのノード上にのみ存在します。ディスクに保存されたデータはローカルであるため、このデータを使用できない場合でも、アプリケーションを復元できるようにする必要があります。
  • ローカル SSD に保存されるデータは一時的なものです。ローカル SSD に書き込みを行うポッドは、そのノードから別のノードにスケジュールし直された場合、ディスク上に保存されたデータにアクセスできなくなる可能性があります。さらに、ノードが終了、アップグレード、修復された場合、データは消去されます。
  • 既存のノードプールにローカル SSD を追加することはできません。

ローカル SSD を使用するクラスタの作成

ローカル SSD を使用するクラスタは、Google Cloud Platform Console または gcloud コマンドライン ツールを使用して作成できます。

gcloud

gcloud を使用してローカル SSD を使用したクラスタまたはノードプールを作成するには、--local-ssd count フラグを指定します。

デフォルト プールがローカル SSD ディスクを使用するクラスタを作成するコマンドは次のとおりです。

gcloud container clusters create [CLUSTER_NAME] \
    --num-nodes 2 --local-ssd-count [NUMBER_OF_DISKS]

ここで、[NUMBER_OF_DISKS] は必要なディスクの数(絶対数)です。

既存のクラスタでローカル SSD ディスクを使用したノードプールを作成する手順は次のとおりです。

gcloud beta container node-pools create [POOL_NAME] --cluster [CLUSTER_NAME] \
    --num-nodes 1 --local-ssd-count [NUMBER_OF_DISKS]

--local-ssd-count には、ノードごとに作成するローカル SSD の数を指定します。最大数は、マシンタイプとリージョンによって異なります(ローカル SSD をご覧ください)。ノードが作成されると、ローカル SSD が自動的にフォーマットされ、ホスト OS のサブディレクトリ /mnt/disks/ にマウントされます(各ローカル SSD は「ssd#」ディレクトリにマウントされます)。

Console

GCP Console の GKE メニューから、ローカル SSD を使用するクラスタまたはノードプールを作成できます。

デフォルト プールがローカル SSD ディスクを使用するクラスタを作成する手順は次のとおりです。

  1. GCP Console で Google Kubernetes Engine のメニューにアクセスします。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. [ノードプール] で、[高度な編集] をクリックします。

  4. [ノード数] に 2 を入力します。

  5. [ローカル SSD ディスク] に、必要な SSD の数を絶対数で入力します。

  6. [保存] をクリックして、[作成] をクリックします。

既存のクラスタでローカル SSD ディスクを使用したノードプールを作成する手順は次のとおりです。

  1. GCP Console で Google Kubernetes Engine のメニューにアクセスします。

    Google Kubernetes Engine のメニューに移動

  2. 目的のクラスタを選択します。

  3. [編集] をクリックします。

  4. [ノードプール] で、[ノードプールを追加] をクリックします。

  5. [サイズ] に 1 を入力します。

  6. [ローカル SSD ディスク(ノード単位)] に、必要な SSD の数を絶対数で入力します。

  7. [保存] をクリックします。

ローカル SSD を使用する

次のセクションでは、GKE でローカル SSD を使用する方法について説明します。

ローカル SSD には、次の 2 つの方法のいずれかを使用してアクセスできます。

  • hostpath ボリュームは、次の場合に推奨されます。

    • ワークロードで DaemonSet が使用される場合。
    • ワークロードで専用ノードプールが使用される場合。すべてのローカル SSD には、DaemonSet のすべてのインスタンスで同じパスを使用してアクセスする必要があります。
  • ローカルの PersistentVolume のベータ版は Kubernetes 1.10 以降で提供されます。次の場合におすすめします。

    • StatefulSet と volumeClaimTemplates を使用するワークロードの場合。
    • ノードプールを共有するワークロードの場合。各ローカル SSD は PersistentVolumeClaim(PVC)を通じて予約でき、個別のホストパスは Pod 仕様では直接エンコードされません。
    • ポッドで同じローカル SSD に対するデータ グラビティが必要とされる場合。ポッドは常にローカルの PersistentVolume と同じノードにスケジュールされます。

hostPath ボリュームの使用例

3 つのローカル SSD を使用するノードプールを作成する場合、ホスト OS では /mnt/disks/ssd0/mnt/disks/ssd1/mnt/disks/ssd2 にディスクがマウントされます。Kubernetes コンテナは、オブジェクトの構成ファイルで定義されている hostPath パラメータに従ってディスクにアクセスします。

このポッド構成ファイルの例では、ローカル SSD /mnt/disks/ssd0 を参照します。

apiVersion: v1
kind: Pod
metadata:
  name: "test-ssd"
spec:
  containers:
  - name: "shell"
    image: "ubuntu:14.04"
    command: ["/bin/sh", "-c"]
    args: ["echo 'hello world' > /test-ssd/test.txt && sleep 1 && cat /test-ssd/test.txt"]
    volumeMounts:
    - mountPath: "/test-ssd/"
      name: "test-ssd"
  volumes:
  - name: "test-ssd"
    hostPath:
      path: "/mnt/disks/ssd0"
  nodeSelector:
    cloud.google.com/gke-local-ssd: "true"

ローカル PersistentVolume の使用例

Kubernetes バージョン 1.10 以降は、ローカル SSD を PersistentVolume として指定できます。

ローカル SSD から PersistentVolume を作成するには、PersistentVolume を手動で作成するか、ローカル ボリュームの静的プロビジョナーを実行します。

注意点

この機能では現在、クラスタの自動スケーリング動的プロビジョニングはサポートされていません。

GKE クラスタのアップグレードやノードの修復を行うと Compute Engine インスタンスが削除され、これによってローカル SSD のデータもすべて削除されます。

ローカル SSD を永続データに使用するクラスタやノードプールでは、ノードの自動アップグレードノードの自動修復を有効にしないでください。まずアプリケーション データをバックアップしてから、データを新しいクラスタやノードプールに復元する必要があります。

PersistentVolume を手動で作成する

クラスタ内の各ノードで、ローカル SSD ごとに PersistentVolume を手動で作成できます。

特定ノードのローカル SSD を参照するには、PersistentVolume オブジェクトの nodeAffinity フィールドを使用します。たとえば、ノード gke-test-cluster-default-pool-926ddf80-f166/mnt/disks/ssd0 にマウントされたローカル SSD の PersistentVolume 仕様は次のようになります。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "example-local-pv"
spec:
  capacity:
    storage: 375Gi
  accessModes:
  - "ReadWriteOnce"
  persistentVolumeReclaimPolicy: "Retain"
  storageClassName: "local-storage"
  local:
    path: "/mnt/disks/ssd0"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "kubernetes.io/hostname"
          operator: "In"
          values: "gke-test-cluster-default-pool-926ddf80-f166"

PersistentVolume を削除する場合は、手動でディスクからデータを消去する必要があります。

ローカル ボリュームの静的プロビジョナーを実行する

ローカル ボリュームの静的プロビジョナーを使用して、ローカル SSD の PersistentVolume を自動的に作成できます。プロビジョナーは、各ノードのローカル SSD の管理、それらの PersistentVolume の作成と削除、PersistentVolume の消去時のローカル SSD 上のデータのクリーンアップを行う DaemonSet です。

ローカル ボリュームの静的プロビジョナーを実行する手順は次のとおりです。

  1. provisioner_generated_gce_ssd_count.yaml 仕様を外部ストレージ リポジトリからダウンロードして、必要に応じて仕様の namespace フィールドを変更します。

    仕様には次の情報が含まれます。

    • プロビジョナーの ServiceAccount
    • 次を行う権限の ClusterRole と ClusterRoleBindings
      • PersistentVolume オブジェクトの作成と削除
      • Node オブジェクトの取得
    • GKE のプロビジョナー設定の ConfigMap
    • プロビジョナーを実行するための DaemonSet
  2. IAM アカウントを Kubernetes のクラスタ管理者の役割にリンクします。これは、ClusterRole 作成権限の取得に必要です。

  3. プロビジョナーをデプロイします。

    kubectl apply -f provisioner_generated_gce_ssd_count.yaml

プロビジョナーが正常に実行されると、クラスタ内の各ローカル SSD に PersistentVolume オブジェクトが作成されます。

遅延ボリューム バインディングを有効にする

スケジューリングを改善するには、volumeBindingMode: WaitForFirstConsumer を使用した StorageClass も作成することをおすすめします。これにより、ポッドのスケジューリングまで PersistentVolumeClaim(PVC)バインディングが遅延され、ポッドを実行できる適切なノードからローカル SSD を選択できるようになります。この強化されたスケジューリング動作により、どのノードに使用可能なローカル SSD があるかを踏まえて、ポッドの CPU とメモリのリクエスト、ノード アフィニティ、ポッド アフィニティと反アフィニティ、複数の PVC リクエストが考慮されます。

local_class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: "local-scsi"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"

遅延バインディングを使用した StorageClass を作成するには、次のコマンドを実行します。

kubectl apply -f local_class.yaml

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント