ノードプールの作成と管理

ユーザー クラスタを作成する場合は、少なくとも 1 つのノードプールを構成する必要があります。ノードプールとはすべて同じ構成を持つノードのグループです。クラスタを作成した後は、新しいノードプールの追加、ノードプールの設定の更新、ノードプールの削除を行うことができます。

ノードプールの管理ツールを選択する

ノードプールを作成、更新、削除する方法は、クラスタが GKE On-Prem API によって管理されているかどうかによります。次のいずれかに該当する場合は、ユーザー クラスタが GKE On-Prem API によって管理されています。

  • クラスタが Google Cloud コンソールで、または Google Cloud CLI(gcloud CLI)を使用して作成されている。クラスタを管理する GKE On-Prem API が自動的に構成されます。

  • クラスタは gkectl を使用して作成されているものの、GKE On-Prem API で管理されるように構成されている。

GKE On-Prem API がユーザー クラスタを管理している場合は、コンソールまたは gcloud CLI を使用してノードプールを管理できます。ユーザー クラスタが GKE On-Prem API で管理されていない場合は、管理ワークステーションの gkectl を使用してノードプールを管理します。

gcloud CLI を使用する予定がある場合は、gcloud CLI がインストールされているパソコンで次の操作を行います。

  1. 自分の Google アカウントでログインします。

    gcloud auth login
    
  2. コンポーネントを更新します。

    gcloud components update
    

ノードプールを追加する

クラスタが GKE On-Prem API によって管理されている場合は、コンソールと gcloud CLI のいずれかを使用してノードプールを追加できます。ただし、次のノードプール設定を構成するには、管理ワークステーションで gkectl を使用する必要があります。

別のノードプールを追加する前に、クラスタで十分な IP アドレスが使用可能であることを確認してください。

gkectl

管理ワークステーションで次の操作を行います。

  1. ユーザー クラスタの構成ファイルで、nodePools セクションを設定します。

    次のフィールドを指定する必要があります。

    • nodePools.[i].name
    • nodePools[i].cpus
    • nodePools.[i].memoryMB
    • nodePools.[i].replicas

    次のフィールドは省略可能です。nodePools[i].bootDiskSizeGB または nodePools[i].osImageType が含まれない場合は、デフォルト値が使用されます。

    • nodePools[i].labels
    • nodePools[i].taints
    • nodePools[i].bootDiskSizeGB
    • nodePools[i].osImageType
    • nodePools[i].vsphere.datastore
    • nodePools[i].vsphere.tags
  2. 次のコマンドを実行します。

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    次のように置き換えます。

    • ADMIN_CLUSTER_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。

    • USER_CLUSTER_CONFIG: ユーザー クラスタの構成ファイルのパス。

構成の例

次の構成の例では、属性が異なるノードプールが 4 つあります。

  • pool-1: 必要最小限の属性のみが指定されています
  • pool-2: vsphere.datastorevsphere.tags を含みます
  • pool-3: taintslabels を含みます
  • pool-4: osImageTypebootDiskSizeGB を含みます
nodePools:
- name: pool-1
  cpus: 4
  memoryMB: 8192
  replicas: 5
- name: pool-2
  cpus: 8
  memoryMB: 16384
  replicas: 3
  vsphere:
    datastore: my_datastore
    tags:
    - category: "purpose"
      name: "testing"
- name: pool-3
  cpus: 4
  memoryMB: 8192
  replicas: 5
  taints:
    - key: "example-key"
      effect: NoSchedule
  labels:
    environment: production
    app: nginx
- name: pool-4
  cpus: 4
  memoryMB: 8192
  replicas: 5
  osImageType: cos
  bootDiskSizeGB: 40

コンソール

  1. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。

  3. クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。

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

  5. ノードプールを構成します。

    1. ノードプール名を入力します。
    2. プール内の各ノードの vCPU の数を入力します(ユーザー クラスタ ワーカーあたりの最小値は 4)。
    3. プール内の各ノードのメモリサイズを MiB 単位で入力します(ユーザー クラスタのワーカーノードあたり最小 8192 MiB、4 の倍数でなければなりません)。
    4. [ノード] フィールドにプール内のノードの数(3 以上)を入力します。
    5. [OS イメージタイプ] で、[Ubuntu Containerd] または、[COS] を選択します。

    6. [ブートディスク サイズ] を GiB 単位で入力します(デフォルトは 40 GiB)。

  6. [ノードプールのメタデータ(省略可)] セクションで、Kubernetes ラベルおよび taint を追加する場合、次の操作を行います。

    1. [+ Add Kubernetes Labels] をクリックします。ラベルのキーを入力します。以上の手順を必要なだけ繰り返してください。
    2. [+ taint を追加] をクリックします。taint のキー効果を入力します。以上の手順を必要なだけ繰り返してください。
  7. [作成] をクリックします。

  8. Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。

gcloud CLI

次のコマンドを実行してノードプールを作成します。

gcloud container vmware node-pools create NODE_POOL_NAME \
  --cluster=USER_CLUSTER_NAME  \
  --project=FLEET_HOST_PROJECT_ID \
  --location=LOCATION \
  --image-type=IMAGE_TYPE  \
  --boot-disk-size=BOOT_DISK_SIZE \
  --cpus=vCPUS \
  --memory=MEMORY \
  --replicas=NODES

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールに付ける名前。名前は次の条件を満たしている必要があります。

    • 40 文字以下
    • 小文字の英数字またはハイフン(-)のみを使用している
    • 先頭が英字である
    • 末尾が英数字
  • USER_CLUSTER_NAME: ノードプールが作成されるユーザー クラスタの名前。

  • FLEET_HOST_PROJECT_ID: クラスタが登録されているプロジェクトの ID。

    • LOCATION: ユーザー クラスタに関連付けられた Google Cloud のロケーション。

    • IMAGE_TYPE: ノードプール内の VM で実行する OS イメージのタイプubuntu_containerd または cos のいずれかに設定します。

    • BOOT_DISK_SIZE: プール内の各ノードのブートディスクのサイズ(GiB 単位)。最小値は 40 GiB です。

    • vCPUs: ノードプール内の各ノードの vCPU 数。最小値は 4 です。

    • MEMORY: プール内の各ノードのメモリサイズ(MiB 単位)。最小値は、ユーザー クラスタ ワーカーノードあたり 8,192 MiB で、値は 4 の倍数にする必要があります。

    • NODES: ノードプール内のノード数。最小値は 3 です。

    例:

    gcloud container vmware node-pools create default-pool \
      --cluster=user-cluster-1  \
      --location=us-west1 \
      --image-type=ubuntu_containerd  \
      --boot-disk-size=40 \
      --cpus=8 \
      --memory=8192 \
      --replicas=5
    

    必要に応じて、次を指定できます。

    • --enable-load-balancer: MetalLB ロードバランサにのみ関連。指定すると、プール内のノードで MetalLB スピーカーを実行できるようになります。MetalLB ロードバランサで少なくとも 1 つのノードプールを有効にする必要があります。

    • --image=IMAGE: vCenter の OS イメージ名。

    • --node-labels=KEY=VALUE,...: プール内の各ノードに適用される Kubernetes ラベル(Key-Value ペア)のカンマ区切りのリスト。

    • --node-taints=KEY=VALUE:EFFECT,... プール内の各ノードに適用される Kubernetes taint のカンマ区切りのリスト。taint は、1 つの効果に関連付けられた Key-Value ペアです。taint は、Pod のスケジューリングの toleration で使用されます。EFFECT には、次の NoSchedulePreferNoScheduleNoExecute のいずれかを指定します。

    例:

    gcloud container vmware node-pools create default-pool \
        --cluster=user-cluster-1  \
        --location=us-west1 \
        --image-type=ubuntu_containerd  \
        --boot-disk-size=40 \
        --cpus=8 \
        --memory=8192 \
        --replicas=5 \
        --node-taints=key1=val1:NoSchedule,key2=val2:NoExecute
    

    他の任意のフラグについては、gcloud リファレンスをご覧ください。

ノードプールを更新する

レプリカの数を増やすと、Google Distributed Cloud によって必要なノードがユーザー クラスタに追加され、レプリカの数を減らすとノードが削除されます。ノードプールのレプリカ数を変更しても、ワークロードは中断されません。レプリカの数を増やす場合は、使用可能な IP アドレスがあることを確認してください。

他のノードプール フィールドを更新すると、クラスタでローリング アップデートがトリガーされます。ローリング アップデートでは、Google Distributed Cloud によって新しいノードが作成され、古いノードが削除されます。このプロセスは、古いノードがすべて新しいノードに置き換えられるまで繰り返されます。このプロセスではダウンタイムは発生しませんが、クラスタには更新中に使用できる追加の IP アドレスが必要です。

更新の終了時にノードプールに N 個のノードがあるとします。この場合、そのプール内のノードに使用可能な IP アドレスが少なくとも N + 1 個必要です。つまり、1 つ以上のプールにノードを追加してクラスタのサイズを変更する場合は、サイズ変更の最後にクラスタのノードプールに含まれているノードの総数よりも、少なくとも 1 つ多い IP アドレスが必要になります。詳細については、十分な IP アドレスが使用可能であることを確認するをご覧ください。

ユーザー クラスタ上でノードプールを更新するには:

gkectl

  1. ユーザー クラスタ構成ファイルの nodePools セクションで、変更したいフィールドの値を変更します。

  2. クラスタを更新します。

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    次のように置き換えます。

    • ADMIN_CLUSTER_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。

    • USER_CLUSTER_CONFIG: ユーザー クラスタの構成ファイルのパス。

ノードプールで使用される osImageType を更新する

別の osImageType を使用するようにノードプールを更新するには、コマンドラインを使用する必要があります。ノードプールで使用される osImageType を変更するには、次の例のように、ノードプールの構成ファイルを更新して gkectl update cluster を実行します。

nodePools:
- name: np-1
  cpus: 4
  memoryMB: 8192
  replicas: 3
  osImageType: ubuntu_containerd

コンソール

コンソールを使用して更新できるフィールドは次のとおりです。

  • レプリカの数
  • メモリ
  • vCPU 数

他のフィールドを更新するには、gcloud CLI または gkectl を使用します。

  1. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。

  3. クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。

  4. [ノード] タブをクリックします。

  5. 変更するノードプールの名前をクリックします。

  6. 変更するフィールドの横にある [ 編集] をクリックして、[完了] をクリックします。

  7. をクリックして前のページに戻ります。

  8. Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。

gcloud CLI

  1. 必要に応じて、ノードプールを一覧取得して、更新するノードプールの名前を取得します。

    gcloud container vmware node-pools list \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    
  2. 次のコマンドを実行してノードプールを更新します。

    gcloud container vmware node-pools update NODE_POOL_NAME \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION \
      --ATTRIBUTE_TO_UPDATE \
      ...
    

    次のように置き換えます。

    • NODE_POOL_NAME: 更新するノードプールの名前。

    • USER_CLUSTER_NAME: ノードプールを含むユーザー クラスタの名前。

    • LOCATION: ユーザー クラスタに関連付けられた Google Cloud のロケーション。

    • ATTRIBUTE_TO_UPDATE: ノードプールの属性を更新する 1 つ以上のフラグ。たとえば、プール内の vCPU とノードの数を変更するには、次のコマンドを実行します。

    gcloud container vmware node-pools update default-pool \
        --cluster=user-cluster-1  \
        --project=example-project-12345
        --location=us-west1 \
        --cpus=10 \
        --replicas=6
    

    更新可能なノードプール属性については、gcloud リファレンスをご覧ください。

変更を確認する

ノードプールが想定どおりに作成または更新されたことを確認するには、クラスタノードを調べます。

gkectl

次のコマンドを実行します。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get nodes -o wide

変更を元に戻す必要がある場合は、クラスタ構成ファイルを編集して gkectl update cluster を実行します。

コンソール

  1. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。

  3. クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。

  4. [ノード] タブをクリックします。

  5. 表示するノードプールの名前をクリックします。

gcloud CLI

次のコマンドを実行します。

gcloud container vmware node-pools describe NODE_POOL_NAME \
  --cluster=USER_CLUSTER_NAME \
  --project=FLEET_HOST_PROJECT_ID \
  --location=LOCATION

ノードプールを削除する

ノードプールは削除できますが、ユーザー クラスタには少なくとも 1 つのノードプールが必要です。ノードプールを削除すると、ノードがワークロードを実行しているかどうかにかかわらず、プールのノードが直ちに削除されます。

ユーザー クラスタからノードプールを削除するには:

gkectl

  1. 影響を受けるノードで実行中のワークロードがないことを確認します。

  2. ユーザー クラスタの構成ファイルの nodePools セクションからその定義を削除します。

  3. クラスタを更新します。

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    次のように置き換えます。

    • [ADMIN_CLUSTER_KUBECONFIG]: 管理クラスタの kubeconfig ファイルのパス。

    • [USER_CLUSTER_CONFIG]: ユーザー クラスタの構成ファイルのパス。

コンソール

  1. 影響を受けるノードで実行中のワークロードがないことを確認します。

  2. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  3. ユーザー クラスタが存在する Google Cloud プロジェクトを選択します。

  4. クラスタリストでクラスタの名前をクリックし、[詳細] パネルの [詳細を表示] をクリックします。

  5. [ノード] タブをクリックします。

  6. 削除するノードプールの名前をクリックします。

  7. [削除] をクリックします。

  8. をクリックして前のページに戻ります。

  9. Google Cloud コンソールに「クラスタのステータス: 変更中」と表示されます。[詳細を表示] をクリックすると、[リソース ステータス条件] と [ステータス メッセージ] が表示されます。

gcloud CLI

  1. 必要に応じて、ノードプールを一覧取得して、削除するノードプールの名前を取得します。

    gcloud container vmware node-pools list \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    
  2. 次のコマンドを実行してノードプールを削除します。

    gcloud container vmware node-pools delete NODE_POOL_NAME \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    

    次のように置き換えます。

    • NODE_POOL_NAME: 削除するノードプールの名前。

    • USER_CLUSTER_NAME: ノードプールを含むユーザー クラスタの名前。

    • LOCATION: ユーザー クラスタに関連付けられた Google Cloud のロケーション。

トラブルシューティング

  • 通常、gkectl update cluster コマンドは失敗した場合に詳細を示します。コマンドが完了し、ノードが表示されない場合は、クラスタの問題の診断ガイドを使用してトラブルシューティングできます。

  • ノードプールの作成または更新中に使用可能な IP アドレスが不足しているなど、クラスタのリソースが不足している可能性があります。IP アドレスが使用可能かどうかを確認する方法については、ユーザー クラスタのサイズ変更をご覧ください。

  • Google Distributed Cloud の更新に関する問題のトラブルシューティングもご覧ください。

  • Creating node MachineDeployment(s) in user cluster… から続行されません。

    ユーザー クラスタ内のノードプールの作成または更新には、時間がかかることがあります。ただし、待機時間が著しく長く、なんらかの障害が発生したと思われる場合は、次のコマンドを実行できます。

    1. kubectl get nodes を実行してノードの状態を取得します。
    2. 準備ができていないノードについては、kubectl describe node NODE_NAME を実行して詳細を取得します。