このドキュメントでは、「ノードシステム構成」という構成ファイルを使用して、Google Kubernetes Engine(GKE)ノード構成をカスタマイズする方法について説明します。
ノードシステム構成は、限定された一連のシステム設定を調整するための構成ファイルです。ノードプールでは、ノードシステム構成を使用して、kubelet Kubernetes ノード エージェントと sysctl 低レベル Linux カーネル構成のカスタム設定を指定できます。
このドキュメントでは、ノードシステム構成で使用可能な構成と、その構成を GKE Standard ノードプールに適用する方法について詳しく説明します。GKE Autopilot クラスタはノード環境の管理が強化されているため、GKE Standard ノードプールと比較して、直接的なノードシステム構成のオプションが制限されている点に注意してください。
ノードシステム構成を使用する理由
ノードシステム構成には次の利点があります。
- パフォーマンス チューニング: 要求の厳しいアプリケーション(AI トレーニングやサービング、データベース、高トラフィックのウェブサーバー、レイテンシの影響を受けやすいサービスなど)向けに、ネットワーク スタックのパフォーマンス、メモリ管理、CPU スケジューリング、I/O 動作を最適化します。
- セキュリティ強化: 特定のカーネルレベルのセキュリティ設定を適用するか、特定のシステム動作を制限して攻撃対象領域を減らします。
- リソース管理:
kubeletによる PID、ディスク容量、イメージのガベージ コレクション、CPU とメモリリソースの管理方法を微調整します。 - ワークロードの互換性: 特定のカーネル設定を必要とする特殊なソフトウェアや古いアプリケーションの特定の前提条件をノード環境が満たせるようにします。
ノード構成をカスタマイズするためのその他のオプション
以下の方法でノード構成をカスタマイズすることもできます。
- ランタイム構成ファイル: GKE ノードで containerd コンテナ ランタイムをカスタマイズするには、「ランタイム構成ファイル」という別のファイルを使用します。詳細については、GKE ノードで containerd 構成をカスタマイズするをご覧ください。
- ComputeClass: GKE ComputeClass 仕様でノード属性を指定できます。GKE バージョン 1.32.1-gke.1729000 以降では、GKE Autopilot モードと Standard モードの両方で ComputeClass を使用できます。詳細については、ノードシステム構成のカスタマイズをご覧ください。
- DaemonSet: DaemonSet を使用してノードをカスタマイズすることもできます。詳細については、DaemonSet を使用して GKE ノードを自動的にブートストラップするをご覧ください。
ノードシステム構成は、Windows Server ノードではサポートされていません。
始める前に
始める前に、次のことを確認してください。
- コマンドライン ツールをインストールする:
- このドキュメントの gcloud CLI の例を使用する場合は、Google Cloud CLI のインストールと構成が行われていることを確認してください。
- Terraform の例を使用する場合は、Terraform のインストールと構成が行われていることを確認してください。
- 権限を付与する: GKE クラスタとノードプールを作成して更新するには、
container.clusterAdminなどの適切な IAM 権限、または同等の権限を持つ別のロールが必要です。 - ワークロードの停止の可能性を考慮して計画する: カスタムノード構成はノードプール レベルで適用されます。変更が発生すると、通常、プール内のノードのローリング アップデートがトリガーされます。これには、ノードの再作成が伴います。ワークロードの中断の可能性を考慮した計画を立て、必要に応じて Pod Disruption Budget(PDB)を使用します。
- すべての変更をバックアップしてテストする: 構成変更は、本番環境に適用する前に、必ずステージング環境または開発環境でテストしてください。誤った設定は、ノードの不安定化やワークロードの障害につながる可能性があります。
- GKE のデフォルト設定を確認する: GKE ノードイメージには、最適化されたデフォルト構成が付属しています。パラメータのカスタマイズは、具体的なニーズがあり、変更の影響を理解している場合にのみ行ってください。
GKE Standard モードでノードシステム構成を使用する
ノードシステム構成を使用する場合は、kubelet と Linux カーネルの構成パラメータを含む YAML ファイルを使用します。ノードシステム構成は GKE Autopilot モードでも使用できますが、このドキュメントの手順では、GKE Standard モードでの構成ファイルの作成方法と使用方法について説明します。
GKE Standard モードでノードシステム構成を使用するには、次の操作を行います。
- 構成ファイルを作成します。このファイルには、
kubelet構成とsysctl構成が含まれています。 - クラスタの作成時またはノードプールの作成 / 更新時に構成を追加します。
構成ファイルを作成する
ノードシステム構成ファイルを YAML で記述します。次の例では、kubelet オプションと sysctl オプションの構成を追加しています。
kubeletConfig:
cpuManagerPolicy: static
allowedUnsafeSysctls:
- 'kernel.shm*'
- 'kernel.msg*'
- 'kernel.sem'
- 'fs.mqueue*'
- 'net.*'
linuxConfig:
sysctl:
net.core.somaxconn: '2048'
net.ipv4.tcp_rmem: '4096 87380 6291456'
この例では、次のようになります。
cpuManagerPolicy: staticフィールドは、静的 CPU 管理ポリシーを使用するようにkubeletを構成します。+net.core.somaxconn: '2048'フィールドは、socket listen()バックログを 2,048 バイトに制限します。net.ipv4.tcp_rmem: '4096 87380 6291456'フィールドは、TCP ソケットの受信バッファの最小値、デフォルト値、最大値をそれぞれ 4,096 バイト、87,380 バイト、6,291,456 バイトに設定します。
kubelet または sysctl の構成のみを追加する場合は、ノードシステム構成に該当セクションのみを追加します。たとえば、kubelet 構成を追加するには、次のファイルを作成します。
kubeletConfig:
cpuManagerPolicy: static
ノードシステム構成に追加できるフィールドの完全なリストについては、Kubelet 構成オプションと Sysctl 構成オプションの各セクションをご覧ください。
Standard ノードプールに構成を追加する
ノードシステム構成を作成したら、Google Cloud CLI を使用して --system-config-from-file フラグを追加します。このフラグは、クラスタの作成時か、ノードプールの作成または更新時に追加できます。 Google Cloud コンソールを使用してノードシステム構成を追加することはできません。
ノードシステム構成を使用してクラスタを作成する
ノードシステム構成は、gcloud CLI または Terraform を使用してクラスタの作成時に追加できます。次の手順では、ノードシステム構成をデフォルトのノードプールに適用します。
gcloud CLI
gcloud container clusters create CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
次のように置き換えます。
CLUSTER_NAME: クラスタの名前LOCATION: クラスタのコンピューティング ゾーンまたはリージョンSYSTEM_CONFIG_PATH:kubelet構成とsysctl構成を含むファイルのパス
ノードシステム構成を適用すると、定義した設定がクラスタのデフォルトのノードプールで使用されます。
Terraform
カスタマイズされたノードシステム構成を持つリージョン クラスタを Terraform を使用して作成するには、次の例をご覧ください。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
ノードシステム構成を使用して新しいノードプールを作成する
ノードシステム構成は、gcloud CLI または Terraform を使用して新しいノードプールを作成するときに追加できます。
次の手順では、ノードシステム構成を新しいノードプールに適用します。
gcloud CLI
gcloud container node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
次のように置き換えます。
POOL_NAME: ノードプールの名前CLUSTER_NAME: ノードプールを追加するクラスタの名前LOCATION: クラスタのコンピューティング ゾーンまたはリージョンSYSTEM_CONFIG_PATH:kubelet構成とsysctl構成を含むファイルのパス
Terraform
カスタマイズされたノードシステム構成を持つノードプールを Terraform を使用して作成するには、次の例をご覧ください。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
既存のノードプールのノードシステム構成を更新する
次のコマンドを実行すると、既存のノードプールのノードシステム構成を更新できます。
gcloud container node-pools update POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
次のように置き換えます。
POOL_NAME: 更新するノードプールの名前CLUSTER_NAME: 更新するクラスタの名前LOCATION: クラスタのコンピューティング ゾーンまたはリージョンSYSTEM_CONFIG_PATH:kubelet構成とsysctl構成を含むファイルのパス
この変更を行うにはノードの再作成が必要になり、実行中のワークロードが中断する可能性があります。この変更について詳しくは、メンテナンス ポリシーを遵守せずにノード アップグレード戦略を使用してノードを再作成する手動変更の表で対応する行をご覧ください。
ノードの更新の詳細については、ノードの更新による中断に備えた計画をご覧ください。
ノードシステム構成を編集する
ノードシステム構成を編集するには、必要な構成で新しいノードプールを作成するか、既存のノードプールのノードシステム構成を更新します。
ノードプールを作成して編集する
ノードプールを作成してノードシステム構成を編集するには、次の操作を行います。
- 必要な構成で構成ファイルを作成します。
- 新しいノードプールに構成を追加します。
- ワークロードを新しいノードプールに移行します。
- 古いノードプールを削除します。
既存のノードプールを更新して編集する
既存のノードプールのノードシステム構成を編集するには、[ノードプールの更新] タブでノードプールへの構成の追加の手順に沿って操作します。ノードシステム構成を更新し、ノードプールの既存のシステム構成が新しい構成でオーバーライドされる場合は、ノードを再作成する必要があります。更新中にパラメータを省略すると、パラメータはそれぞれがデフォルトに設定されます。
ノードシステム構成をデフォルトに戻す場合は、kubelet フィールドと sysctl フィールドの空の値で構成ファイルを更新します。次に例を示します。
kubeletConfig: {}
linuxConfig:
sysctl: {}
ノードシステム構成を削除する
ノードシステム構成を削除するには、次の操作を行います。
- ノードプールを作成します。
- ワークロードを新しいノードプールに移行します。
- 古いノードシステム構成を持つノードプールを削除します。
kubelet の構成オプション
このセクションの表は、変更可能な kubelet オプションを示しています。
CPU 管理
次の表に、kubelet の CPU 管理オプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
cpuCFSQuota |
true または false にする必要があります。 |
true |
この設定では、Pod の CPU 上限が適用されます。この値を false に設定すると、Pod の CPU 制限は無視されます。Pod が CPU の制限の影響を受けるシナリオの中には、CPU 制限を無視することが望ましい場合もあります。 cpuCFSQuota を無効にすると、誤った Pod が想定よりも多くの CPU リソースを消費するリスクがあります。 |
cpuCFSQuotaPeriod |
期間を指定する必要があります。 | "100ms" |
この設定では、CPU の CFS 割り当て期間値 cpu.cfs_period_us を設定します。この値は、cgroup による CPU リソースへのアクセス権を再割り当てする頻度を指定します。このオプションを使用すると、CPU スロットルの動作を調整できます。 |
メモリ管理と強制排除
次の表に、メモリ管理と強制排除の変更可能なオプションを示します。このセクションには、evictionSoft フラグの変更可能なオプションを示す別の表も含まれています。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
evictionSoft |
シグナル名のマップ。値の制限については、次の表をご覧ください。 | none |
この設定では、シグナル名を強制排除(復元可能)のしきい値を定義する数量または割合にマッピングします。強制排除(復元可能)のしきい値には猶予期間が必要です。kubelet は、猶予期間が経過するまで Pod を強制排除しません。 |
evictionSoftGracePeriod |
シグナル名のマップ。各シグナル名について、値は 5m 未満の正の期間である必要があります。有効な時間単位は、ns、us(または µs)、ms、s、m のいずれかです。 |
none |
この設定は、シグナル名を、強制排除(復元可能)のしきい値の猶予期間を定義する期間にマッピングします。強制排除(復元可能)のしきい値には、対応する猶予期間が必要です。 |
evictionMinimumReclaim |
シグナル名のマップ。各シグナル名について、値は 10% 未満の正の割合にする必要があります。 |
none |
この設定は、シグナル名を、kubelet が Pod の強制排除を実行するときに再利用する特定のリソースの最小量を定義する割合にマッピングします。 |
evictionMaxPodGracePeriodSeconds |
値には 0~300 の整数を指定してください。 |
0 |
この設定は、削除時の Pod 終了の最大猶予期間を秒単位で定義します。 |
次の表に、evictionSoft フラグの変更可能なオプションを示します。同じオプションが evictionSoftGracePeriod フラグと evictionMinimumReclaim フラグにも適用されますが、制限は異なります。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
memoryAvailable |
値は、ノードのメモリの 100Mi より大きく 50% より小さい量にする必要があります。 |
none |
この設定は、強制排除(復元可能)前に使用可能なメモリ量を表します。kubelet の memory.available シグナルの量を定義します。 |
nodefsAvailable |
値は 10%~50% の範囲で指定してください |
none |
この設定は、強制排除(復元可能)前に使用可能な nodefs を表します。kubelet の nodefs.available シグナルの量を定義します。 |
nodefsInodesFree |
値は 5%~50% の範囲で指定してください |
none |
この設定は、強制排除(復元可能)前に空いている nodefs inode を表します。kubelet の nodefs.inodesFree シグナルの量を定義します。 |
imagefsAvailable |
値は 15%~50% の範囲で指定してください |
none |
この設定は、強制排除(復元可能)前に使用可能な imagefs を表します。kubelet の imagefs.available シグナルの量を定義します。 |
imagefsInodesFree |
値は 5%~50% の範囲で指定してください |
none |
この設定は、強制排除(復元可能)前に空いている imagefs inode を表します。kubelet の imagefs.inodesFree シグナルの量を定義します。 |
pidAvailable |
値は 10%~50% の範囲で指定してください |
none |
この設定は、強制排除(復元可能)前に使用可能な PID を表します。kubelet の pid.available シグナルの量を定義します。 |
singleProcessOOMKill
|
値は true または false にする必要があります。 |
cgroupv1 ノードの場合は true、cgroupv2 ノードの場合は false。 |
この設定では、コンテナ内のプロセスが個別に OOMkill されるか、グループとして OOMkill されるかを設定します。 GKE バージョン 1.32.4-gke.1132000、1.33.0-gke.1748000 以降で使用できます。 |
PID の管理
次の表に、PID 管理の変更可能なオプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
podPidsLimit |
値は 1024~4194304 の範囲で指定してください |
none |
この設定は、各 Pod が使用できるプロセス ID(PID)の最大数を設定します。 |
ロギング
次の表に、ロギングの変更可能なオプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
containerLogMaxSize |
値は 10Mi~500Mi の正の数と単位の接尾辞の組み合わせにする必要があります。 |
10Mi |
この設定で、コンテナログ ローテーション ポリシーの containerLogMaxSize 設定が制御されます。これにより、各ログファイルの最大サイズを構成できます。デフォルト値は 10Mi です。有効な単位は Ki、Mi、Gi です。 |
containerLogMaxFiles |
値は 2~10 の整数(両端の値を含む)にする必要があります。 |
5 |
この設定で、コンテナ ログファイル ローテーション ポリシーの containerLogMaxFiles 設定が制御されます。これにより、各コンテナで許可されるファイルの最大数をそれぞれ構成できます。デフォルト値は 5 です。コンテナあたりのログの合計サイズ (container_log_max_size*container_log_max_files) がノードの合計ストレージの 1% を超えてはいけません。 |
イメージのガベージ コレクション
次の表に、イメージのガベージ コレクションの変更可能なオプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
imageGCHighThresholdPercent |
値は 10~85 の整数で、imageGcLowThresholdPercent より大きくする必要があります。 |
85 |
この設定では、この値を超えるまでイメージ ガベージ コレクションが実行されるディスク使用量の割合を定義します。ガベージ コレクションの対象となるディスク使用量の上限を表します。このフィールドの値を 100 で割って割合が計算されます。 |
imageGCLowThresholdPercent |
値は 10~85 の整数で、imageGcHighThresholdPercent より小さくする必要があります。 |
80 |
この設定では、この値を超えるまではイメージ ガベージ コレクションが実行されないディスク使用量の割合を定義します。ガベージ コレクションの対象となるディスク使用量の下限を表します。このフィールドの値を 100 で割って割合が計算されます。 |
imageMinimumGcAge |
値は 2m 以下の期間である必要があります。有効な時間単位は、ns、us(または µs)、ms、s、m、h のいずれかです。 |
2m |
この設定では、使用されていないイメージがガベージ コレクションの対象になるまでの最短時間が定義されます。 |
imageMaximumGcAge |
値は期間とする必要があります。 | 0s |
この設定では、使用されていないイメージがガベージ コレクションの対象になるまでの最長期間が定義されます。このフィールドのデフォルト値は GKE バージョン 1.30.7-gke.1076000、1.31.3-gke.1023000 以降で使用できます。 |
イメージの pull
次の表に、イメージの pull の変更可能なオプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
maxParallelImagePulls |
値は 2~5 の整数(両端の値を含む)にする必要があります。 | ディスクタイプに応じて 2 または 3。 |
この設定は、並列で実行できるイメージプルの最大数を定義します。デフォルト値は、ブートディスクのタイプによって決まります。 |
セキュリティと安全でないオペレーション
次の表に、セキュリティを構成し、安全でないオペレーションを処理するための変更可能なオプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
allowedUnsafeSysctls |
|
none |
この設定では、Pod に設定できる安全でない sysctl 名または sysctl グループのカンマ区切りの許可リストを定義します。 |
insecureKubeletReadonlyPortEnabled |
値はブール値(true または false)にする必要があります。 |
true |
この設定により、クラスタ内の新しいノードプールごとに、安全でない kubelet 読み取り専用ポート 10255 が無効になります。このファイルでこの設定を構成すると、GKE API クライアントを使用してクラスタレベルで設定を変更できなくなります。 |
リソース マネージャー
Kubernetes には、一連のリソース マネージャーが用意されています。これらのリソース マネージャーを構成して、CPU、デバイス、メモリ(hugepage)リソースの特定の要件が構成された Pod のためにノードリソースの調整と最適化を行うことができます。
次の表に、Resource Manager の変更可能なオプションを示します。
kubelet 構成設定 |
制限事項 | デフォルト設定 | 説明 |
|---|---|---|---|
cpuManagerPolicy |
値は none または static にする必要があります。 |
none |
この設定で、kubelet CPU マネージャー ポリシーが制御されます。デフォルト値は none で、デフォルトの CPU アフィニティ スキームになります。OS スケジューラによって自動的に実行される範囲を超えるアフィニティはありません。この値を static に設定すると、Guaranteed QoS クラスに属し、かつ整数の CPU リクエストを持つ Pod に排他的な CPU を割り当てることができます。 |
memoryManager.policy |
値は None または Static にする必要があります。 |
None |
この設定で、 この値を この設定は、コントロール プレーンで GKE バージョン 1.32.3-gke.1785000 以降が実行されているクラスタでサポートされています。 |
topologyManager |
値は、それぞれのフィールドでサポートされている設定のいずれかにする必要があります。 Terraform の手順を使用して構成を Standard ノードプールに追加する場合、 |
|
これらの設定で、 ポリシーとスコープの設定は、互いに独立して設定できます。これらの設定の詳細については、トポロジ マネージャーのスコープとポリシーをご覧ください。 次の GKE リソースがこの設定をサポートしています。
|
Sysctl 構成オプション
システムのパフォーマンスをチューニングするには、Linux カーネル パラメータを変更します。このセクションの表は、構成可能なさまざまなカーネル パラメータを示しています。
ファイルシステム パラメータ(fs.*)
次の表に、Linux ファイルシステムの変更可能なパラメータを示します。これらの設定で、ファイル ハンドルの上限やイベント モニタリングなど、Linux ファイルシステムの動作が制御されます。
Sysctl パラメータ |
制限事項 | 説明 |
|---|---|---|
fs.aio-max-nr |
65,536~4,194,304 で指定してください。 | この設定は、システム全体の非同期 I/O リクエストの最大数を定義します。 |
fs.file-max |
104,857~67,108,864 で指定してください。 | この設定は、Linux カーネルが割り当てることができるファイルハンドルの最大数を定義します。 |
fs.inotify.max_user_instances |
8,192~1,048,576 で指定してください。 | この設定は、ユーザーが作成できる inotify インスタンスの最大数を定義します。 |
fs.inotify.max_user_watches |
8,192~1,048,576 で指定してください。 | この設定は、ユーザーが作成できる inotify ウォッチの最大数を定義します。 |
fs.nr_open |
1,048,576~2,147,483,584 で指定してください。 | この設定は、プロセスで開くことができるファイル記述子の最大数を定義します。 |
カーネル パラメータ(kernel.*)
次の表に、Linux カーネルの変更可能なパラメータを示します。これらの設定で、共有メモリ割り当てなどのコアカーネル機能が構成されます。
| Sysctl パラメータ | 制限事項 | 説明 |
|---|---|---|
kernel.shmmni |
4,096~32,768 で指定してください。 | この設定は、システム全体の共有メモリ セグメントの最大数を定義します。この値が設定されていない場合、デフォルトは 4096 です。 |
kernel.shmmax |
0~18,446,744,073,692,774,399 で指定してください。 | この設定は、カーネルで許可される単一の共有メモリ セグメントの最大サイズ(バイト単位)を定義します。この値が実際の RAM 容量より大きい場合は無視されます。つまり、使用可能なすべての RAM を共有できます。 |
kernel.shmall |
0~18,446,744,073,692,774,399 で指定してください。 | この設定は、システムで一度に使用できる共有メモリページの合計量を定義します。AMD64 アーキテクチャおよび Intel 64 アーキテクチャでは、ページは 4,096 バイトです。 |
kernel.perf_event_paranoid |
-1~3 で指定してください。 | この設定で、CAP_PERFMON を持たない非特権ユーザーによるパフォーマンス イベント システムの使用が制御されます。デフォルト値はカーネルの 2 です。 |
kernel.sched_rt_runtime_us |
-1~1,000,000 で指定してください。 | この設定は、リアルタイム スケジューリングで使用できる時間のグローバル上限を定義します。 |
kernel.softlockup_panic |
省略可(ブール値) | この設定で、ソフト ロックアップが検出されたときにカーネル パニックが発生するかどうかが制御されます。 |
kernel.yama.ptrace_scope |
0~3 で指定してください。 |
この設定は、
|
kernel.kptr_restrict |
0~2 で指定してください。 | この設定は、/proc などのインターフェースを介してカーネル アドレスを公開する際に制限が適用されるかどうかを示します。 |
kernel.dmesg_restrict |
省略可(ブール値) | この設定は、権限のないユーザーがカーネルのログバッファのメッセージを表示するために dmesg(8) を使用させないようにするかどうかを示します。 |
kernel.sysrq |
0~511 で指定してください。 |
この設定で、SysRq キーで呼び出すことができる機能が制御されます。有効な値は次のとおりです。
|
ネットワーク パラメータ(net.*)
次の表に、ネットワーキングの変更可能なパラメータを示します。これらの設定で、ソケット バッファから接続トラッキングまで、ネットワーキング スタックのパフォーマンスと動作がチューニングされます。
| Sysctl パラメータ | 制限事項 | 説明 |
|---|---|---|
net.core.busy_poll |
2,147,483,647 より小さい任意の正の整数。 | この設定は、ポーリングと選択の低レイテンシのビジー ポーリング タイムアウトを定義します。イベントを待機するビジーループの概算時間(マイクロ秒単位)を表します。 |
net.core.busy_read |
2,147,483,647 より小さい任意の正の整数。 | この設定は、ソケット読み取りの低レイテンシのビジー ポーリング タイムアウトを定義します。デバイスキューでパケットを待機するビジーループの概算時間(マイクロ秒単位)を表します。 |
net.core.netdev_max_backlog |
2,147,483,647 より小さい任意の正の整数。 | この設定は、インターフェースがカーネルで処理できるよりも速い速度でパケットを受信した場合に、INPUT 側でキューに登録されるパケットの最大数を定義します。 |
net.core.rmem_default |
2,147,483,647 より小さい任意の正の整数。 | この設定は、デフォルトの受信ソケット バッファサイズ(バイト単位)を定義します。 |
net.core.rmem_max |
2,147,483,647 より小さい任意の正の整数。 | この設定は、受信ソケット バッファの最大サイズ(バイト単位)を定義します。 |
net.core.wmem_default |
2,147,483,647 より小さい任意の正の整数。 | この設定は、ソケット送信バッファのデフォルト設定(バイト単位)を定義します。 |
net.core.wmem_max |
2,147,483,647 より小さい任意の正の整数。 | この設定は、送信ソケット バッファの最大サイズ(バイト単位)を定義します。 |
net.core.optmem_max |
2,147,483,647 より小さい任意の正の整数。 | この設定は、ソケットごとに許可される補助バッファの最大サイズを定義します。 |
net.core.somaxconn |
128~2,147,483,647 で指定してください。 | この設定は、socket listen() バックログの上限を定義します。これは、ユーザー空間では SOMAXCONN として知られています。この設定のデフォルトは 128 です。 |
net.ipv4.tcp_rmem |
{min, default, max}(それぞれ 0 より大きい、メモリはバイト単位)。 | この設定は、モデレーションで UDP ソケットが使用する受信バッファの最小サイズ(バイト単位)を定義します。デフォルトの設定は 1 ページです。 |
net.ipv4.tcp_wmem |
{min, default, max}(それぞれ 0 より大きい、メモリはバイト単位)。 | この設定は、モデレーションで UDP ソケットが使用する送信バッファの最小サイズ(バイト単位)を定義します。デフォルトの設定は 1 ページです。 |
net.ipv4.tcp_tw_reuse |
0~1 で指定してください。 | この設定は、プロトコル上安全であると判断された場合に、新しい接続で TIME_WAIT 状態のソケットの再利用を許可するかどうかを定義します。デフォルト値は 0 です。 |
net.ipv4.tcp_max_orphans |
16,384~262,144 で指定してください。 | この設定は、ユーザー ファイル ハンドルに関連付けられていない TCP ソケットの最大数を定義します。 |
net.ipv4.tcp_max_tw_buckets |
4,096~2,147,483,647 で指定してください。 | この設定は、システムが同時に保持する timewait ソケットの最大数を定義します。この数を超えると、time-wait ソケットはすぐに破棄され、警告が出力されます。 |
net.ipv4.tcp_syn_retries |
1~127 で指定してください。 | この設定は、アクティブな TCP 接続の試行で初期 SYN が再送信される回数を定義します。 |
net.ipv4.tcp_ecn |
0~2 で指定してください。 | この設定で、TCP による明示的輻輳通知(ECN)の使用が制御されます。ECN は、TCP 接続の両端で ECN のサポートが指定されている場合にのみ使用されます。 |
net.ipv4.tcp_mtu_probing |
0~2 で指定してください。 |
この設定で、TCP パケット化レイヤパス MTU 探索が制御されます。サポートされている値は次のとおりです。
|
net.ipv4.tcp_congestion_control |
この設定は、クラスタで Dataplane V2 が有効になっている場合はサポートされていません。 | |
net.ipv6.conf.all.disable_ipv6 |
ブール値 | この値を変更することは、conf/default/disable_ipv6 設定と、インターフェースごとのすべての disable_ipv6 設定を同じ値に変更することと同じです。 |
net.ipv6.conf.default.disable_ipv6 |
ブール値 | この設定により IPv6 の動作は無効になります。 |
net.netfilter.nf_conntrack_acct |
0~1 で指定してください。 | この設定により、接続トラッキング フローのアカウンティングが有効になります。デフォルト値は 0 で、設定が無効になっていることを意味します。GKE バージョン 1.32.0-gke.1448000 以降で使用できます。 |
net.netfilter.nf_conntrack_max |
65,536~4,194,304 で指定してください。 | この設定は、接続トラッキング テーブルのサイズを定義します。最大値に達すると、新しい接続は失敗します。GKE バージョン 1.32.0-gke.1448000 以降で使用できます。 |
net.netfilter.nf_conntrack_buckets |
65,536~524,288 で指定してください。 |
この設定は、ハッシュ テーブルのサイズを定義します。 GKE バージョン 1.32.0-gke.1448000 以降で使用できます。 |
net.netfilter.nf_conntrack_tcp_timeout_close_wait |
60~3,600 で指定してください。 |
この設定は、TCP 接続が GKE バージョン 1.32.0-gke.1448000 以降で使用できます。 |
net.netfilter.nf_conntrack_tcp_timeout_established |
600~86,400 で指定してください。 |
この設定は、無効な接続が接続トラッキング テーブルから自動的に削除されるまでの期間(秒単位)を定義します。 GKE バージョン 1.32.0-gke.1448000 以降で使用できます。 |
net.netfilter.nf_conntrack_tcp_timeout_time_wait |
1~600 で指定してください。 |
この設定は、TCP 接続が GKE バージョン 1.32.0-gke.1448000 以降で使用できます。 |
仮想メモリ パラメータ(vm.*)
次の表に、仮想メモリ サブシステムの変更可能なパラメータを示します。これらの設定で、カーネルによるメモリ、スワッピング、ディスク キャッシュの処理方法を制御する仮想メモリ サブシステムが管理されます。
sysctl パラメータ |
制限事項 | 説明 |
|---|---|---|
vm.max_map_count |
65,536~2,147,483,647 で指定してください。 | このファイルは、プロセスが保持できるメモリマップ領域の最大数を定義します。 |
vm.dirty_background_ratio |
1~100 で指定してください。 | この設定は、バックグラウンド カーネル フラッシャーのスレッドがライトバックを開始する前にダーティページで埋めることができるシステムメモリの割合を定義します。値は vm.dirty_ratio フィールドの値より小さくする必要があります。 |
vm.dirty_background_bytes |
0~68,719,476,736 で指定してください。 |
この設定は、バックグラウンド カーネル フラッシャーのスレッドがライトバックを開始するダーティメモリの量を定義します。
|
vm.dirty_expire_centisecs |
0~6,000 で指定してください。 | この設定は、ダーティデータがカーネル フラッシャー スレッドによってディスクに書き込まれるまでメモリに残すことができる最大期間(100 分の 1 秒単位)を定義します。 |
vm.dirty_ratio |
1~100 で指定してください。 | この設定は、書き込みを実行するプロセスが強制的にブロックされ、ダーティデータがそれに同期して書き出される前に、ダーティページで埋めることができるシステムメモリの割合を定義します。 |
vm.dirty_bytes |
0~68,719,476,736 で指定してください。 |
この設定は、ディスク書き込みを生成するプロセスがライトバックを自動的に開始するダーティメモリの量を定義します。
|
vm.dirty_writeback_centisecs |
0~1,000 で指定してください。 | この設定は、カーネル フラッシャー スレッドが古いダーティデータをディスクに書き込むために起動する間隔(100 分の 1 秒単位)を定義します。 |
vm.overcommit_memory |
0、1、2 のいずれかを指定してください。 |
この設定により、メモリ オーバーコミットを処理するためのカーネルの戦略が決定されます。値は次のとおりです。
|
vm.overcommit_ratio |
0~100 で指定してください。 | この設定は、vm.overcommit_memory フィールドの値が 2 に設定されている場合に、オーバーコミットが許可される物理 RAM の割合を定義します。 |
vm.vfs_cache_pressure |
0~100 で指定してください。 | この設定により、dentry(ディレクトリ)と inode キャッシュに使用されるメモリを再利用するためのカーネルの優先度が調整されます。 |
vm.swappiness |
0~200 で指定してください。 | この設定により、カーネルがプロセスを物理メモリからスワップ ディスクに移動する流れが制御されます。デフォルト値は 60 です。 |
vm.watermark_scale_factor |
10~3,000 で指定してください。 | この設定で kswapd の aggressiveness が制御されます。これは、kswapd が復帰する前に残っているメモリと、スリープする前に解放するメモリを定義します。デフォルト値は 10 です。 |
vm.min_free_kbytes |
67,584~1,048,576 で指定してください。 | この設定は、OOM が発生する前の最小空きメモリ量を定義します。デフォルト値は 67584 です。 |
各 sysctl フラグでサポートされている値の詳細については、--system-config-from-file gcloud CLI ドキュメントをご覧ください。
複数の Linux の名前空間が特定の sysctl フラグに対して一意の値を持つ場合がありますが、その他はノード全体でグローバルな値を持つ可能性があります。ノードシステム構成を使用して sysctl オプションを更新すると、sysctl がノードと各 Namespace にグローバルに適用されるため、各 Pod の Linux Namespace での sysctl の値が同じになります。
Linux cgroup モード構成オプション
コンテナ ランタイムと kubelet は、Pod 内の各コンテナがアクセスできる CPU やメモリの量の制限といったリソース管理に Linux カーネルの cgroups を使用します。カーネルの cgroup サブシステムには、cgroupv1 と cgroupv2 の 2 つのバージョンがあります。cgroupv2 の Kubernetes サポートは、Kubernetes v1.18 でアルファ版、v1.22 でベータ版が発表され、v1.25 で一般提供されました。詳細については、Kubernetes cgroups v2 のドキュメントをご覧ください。
ノードのシステム構成を使用すると、ノードプールの cgroup 構成をカスタマイズできます。cgroupv1 または cgroupv2 を使用できます。GKE は、バージョン 1.26 以降を実行する新しい Standard ノードプールには cgroupv2 を使用し、1.26 より前のバージョンを実行するノードプールには cgroupv1 を使用します。ノードの自動プロビジョニングで作成されたノードプールの場合、cgroup 構成はノードプールのバージョンではなく、初期クラスタ バージョンによって異なります。cgroupv1 は Arm マシンではサポートされていません。
ノードのシステム構成を使用して、cgroupv1 または cgroupv2 を明示的に使用するようにノードプールを変更できます。cgroupv1 を使用する既存のノードプールをバージョン 1.26 にアップグレードしても、設定は cgroupv2 に変更されません。1.26 より前のバージョンを実行し、カスタマイズされた cgroup 構成を含まない既存のノードプールは、引き続き cgroupv1 を使用します。設定を変更するには、既存のノードプールに cgroupv2 を明示的に指定する必要があります。
たとえば、cgroupv2 を使用するようにノードプールを構成するには、次のようなノードシステム構成ファイルを使用します。
linuxConfig:
cgroupMode: 'CGROUP_MODE_V2'
サポートされている cgroupMode オプションは次のとおりです。
CGROUP_MODE_V1: ノードプールでcgroupv1を使用します。CGROUP_MODE_V2: ノードプールでcgroupv2を使用します。CGROUP_MODE_UNSPECIFIED: デフォルトの GKE cgroup 構成を使用します。
cgroupv2 を使用するには、次の要件と制限が適用されます。
- 1.26 より前のバージョンを実行しているノードプールの場合は、gcloud CLI バージョン 408.0.0 以降を使用する必要があります。また、バージョン 395.0.0 以降では gcloud beta を使用します。
- クラスタとノードプールで GKE バージョン 1.24.2-gke.300 以降を実行する必要があります。
- containerd を含む Container-Optimized OS または containerd を含む Ubuntu のノードイメージを使用する必要があります。
- いずれかのワークロードが cgroup ファイルシステム(
/sys/fs/cgroup/...)の読み取りに依存している場合は、cgroupv2API と互換性があることを確認してください。 - モニタリング ツールまたはサードパーティ製ツールを使用する場合は、それらが
cgroupv2と互換性があることを確認してください。 - Java ワークロード(JDK)を使用している場合は、cgroupv2 を完全にサポートしているバージョン(JDK
8u372、JDK 11.0.16 以降、JDK 15 以降など)を使用することをおすすめします。
cgroup の構成を確認する
ノードシステム構成を追加する場合、GKE は変更を実装するためにノードを再作成する必要があります。ノードプールに構成を追加してノードが再作成されたら、新しい構成を確認できます。
ノードプール内のノードの cgroup 構成を確認するには、gcloud CLI または kubectl コマンドライン ツールを使用します。
gcloud CLI
ノードプールの cgroup 構成を確認します。
gcloud container node-pools describe POOL_NAME \
--format='value(Config.effectiveCgroupMode)'
POOL_NAME は、ノードプールの名前に置き換えます。
出力は次のいずれかになります。
EFFECTIVE_CGROUP_MODE_V1: ノードはcgroupv1を使用します。EFFECTIVE_CGROUP_MODE_V2: ノードはcgroupv2を使用します。
出力には、ノードプールのノードが再作成された後の新しい cgroup 構成のみが表示されます。Windows Server ノードプールの場合、出力は空になります。これは、cgroup をサポートしていないためです。
kubectl
kubectl を使用して、このノードプール内のノードの cgroup 構成を確認するには、ノードを選択し、次の手順でそのノードに接続します。
- ノードプール内の任意のノードでインタラクティブ シェルを作成します。コマンドで、
mynodeをノードプール内の任意のノードの名前に置き換えます。 - Linux ノードの cgroup のバージョンを確認します。
Linux hugepages の構成オプション
ノードシステム構成ファイルを使用して、hugepages を事前割り当てできます。Kubernetes は、CPU やメモリと同様に、リソースタイプとして事前に割り当てられた hugepages をサポートしています。
hugepages を使用するには、次の制限と要件が適用されます。
- ノードが hugepages によって完全に占有されないようにするには、割り当てられた hugepages の全体サイズが次のいずれかを超えないようにします。
- メモリが 30 GB 未満のマシン: 合計メモリの 60%。たとえば、8 GB のメモリを搭載した e2-standard-2 マシンでは、hugepages に 4.8 GB を超えるメモリを割り当てることはできません。
- メモリが 30 GB を超えるマシン: 合計メモリの 80%。たとえば、32 GB のメモリを搭載した c4a-standard-8 マシンでは、hugepages が 25.6 GB を超えてはいけません。
- 1 GB の hugepages は、A3、C2D、C3、C3D、C4、C4A、C4D、CT5E、CT5LP、CT6E、H3、M2、M3、M4、または Z3 のマシンタイプでのみ使用できます。
次の表に、Linux hugepages の変更可能な設定を示します。
| Config パラメータ | 制限事項 | デフォルト値 | 説明 |
|---|---|---|---|
hugepage_size2m |
整数の数。前述のメモリ割り当て上限が適用されます。 | 0 |
この設定では、特定の数の 2 MB の hugepages が事前割り当てされます。 |
hugepage_size1g |
整数の数。前述のメモリとマシンタイプの両方の制限が適用されます。 | 0 |
この設定では、特定の数の 1 GB の hugepages が事前割り当てされます。 |
Transparent hugepages(THP)
ノードシステム構成ファイルを使用して、Linux カーネルの Transparent HugePage Support を有効にできます。THP を使用すると、カーネルがプロセスに hugepages を自動的に割り当てるため、手動で事前割り当てを行う必要はありません。
次の表に、THP の変更可能なパラメータを示します。
| Config パラメータ | サポートされる値 | デフォルト値 | 説明 |
|---|---|---|---|
transparentHugepageEnabled |
|
UNSPECIFIED |
この設定で、anonymous メモリに対して THP を有効にするかどうかが制御されます。 |
transparentHugepageDefrag |
|
UNSPECIFIED |
この設定は、THP のデフラグ構成を定義します。 |
THP は、GKE バージョン 1.33.2-gke.4655000 以降で使用できます。また、GKE バージョン 1.33.2-gke.4655000 以降では、新しい TPU ノードプールでデフォルトで有効になっています。既存のノードプールをサポートされているバージョン以降にアップグレードしても、THP は有効になりません。