設定ファイルを使用してkubeletのパラメーターを設定する

設定ファイルを使用してkubeletのパラメーターを設定する

始める前に

このページの一部の手順では、jqツールを使用します。 jqがインストールされていない場合は、お使いのオペレーティングシステムのソフトウェア配布元からインストールするか、https://jqlang.github.io/jq/から入手してください。

一部の手順ではcurlのインストールも必要です。 curlは、お使いのオペレーティングシステムのソフトウェア配布元からインストールできます。

kubeletの設定パラメーターの一部は、コマンドラインフラグの代わりに、ディスク上の設定ファイルで指定できます。 設定ファイルでパラメーターを指定する方法は、ノードのデプロイと設定管理を簡素化できるため、推奨されます。

設定ファイルを作成する

ファイルで設定できるkubelet設定の範囲は、KubeletConfiguration構造体で定義されています。

設定ファイルは、この構造体のパラメーターをJSONまたはYAML形式で表したものでなければなりません。 kubeletにファイルの読み取り権限があることを確認してください。

このファイルの例を次に示します。

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: "192.168.0.8"
port: 20250
serializeImagePulls: false
evictionHard:
    memory.available:  "100Mi"
    nodefs.available:  "10%"
    nodefs.inodesFree: "5%"
    imagefs.available: "15%"
    imagefs.inodesFree: "5%"

この例では、kubeletに次の設定を行っています。

  1. address: kubeletはIPアドレス192.168.0.8でサービスを提供します。
  2. port: kubeletはポート20250でサービスを提供します。
  3. serializeImagePulls: イメージのプルを並列に実行します。
  4. evictionHard: 次のいずれかの条件に該当すると、kubeletはPodを退避させます。
    • ノードで利用可能なメモリーが100MiBを下回ったとき。
    • ノードのメインファイルシステムで利用可能な領域が10%未満になったとき。
    • イメージファイルシステムで利用可能な領域が15%未満になったとき。
    • ノードのメインファイルシステムで、inodeの95%を超えて使用しているとき。

備考:

この例のように、evictionHardのパラメーターのうち1つだけデフォルト値を変更すると、ほかのパラメーターのデフォルト値は引き継がれず、0に設定されます。 カスタム値を指定する場合は、それぞれのしきい値をすべて指定してください。 または、kubeletの設定ファイルでMergeDefaultEvictionSettingsをtrueに設定できます。 そうすると、いずれかのパラメーターを変更した場合に、ほかのパラメーターは0ではなくデフォルト値を引き継ぎます。

imagefsは省略可能なファイルシステムです。 コンテナランタイムは、コンテナイメージとコンテナの書き込み可能レイヤーを保存するために、これを使用します。

設定ファイルを使ってkubeletプロセスを起動する

備考:

kubeadmでクラスターを初期化する場合は、クラスターの作成時にkubeadm initでkubeletの設定を使用してください。 詳細はkubeadmを使用したkubeletの設定を参照してください。

kubeletの設定ファイルへのパスを--configフラグに指定して、kubeletを起動します。 kubeletはこのファイルから設定を読み込みます。 設定ファイルと同じ値を指定するコマンドラインフラグがある場合、その値はコマンドラインフラグで上書きされます。 これは、コマンドラインAPIとの後方互換性を確保するためです。

kubelet設定ファイル内の相対パスは、設定ファイルの場所を基準に解決されます。 一方、コマンドラインフラグ内の相対パスは、kubeletの現在の作業ディレクトリを基準に解決されます。

コマンドラインフラグとkubelet設定ファイルでは、一部のデフォルト値が異なります。 --configを指定し、その値をコマンドラインで指定しない場合は、KubeletConfigurationのバージョンに対応するデフォルト値が適用されます。 上の例では、バージョンはkubelet.config.k8s.io/v1beta1です。

kubelet設定ファイルのドロップインディレクトリ

kubeletのドロップイン設定ディレクトリを指定できます。 デフォルトでは、kubeletはドロップイン設定ファイルをどの場所からも読み込みません。 読み込み先のパスを指定する必要があります。 たとえば、--config-dir=/etc/kubernetes/kubelet.conf.dのように指定します。

Kubernetes v1.28からv1.29では、kubeletプロセスの環境変数KUBELET_CONFIG_DROPIN_DIR_ALPHAも設定しないと、--config-dirを指定できません。 この環境変数の値は問いません。

備考:

有効なkubeletドロップイン設定ファイルの拡張子は、.confでなければなりません。 たとえば、99-kubelet-address.confのようにします。

kubeletは、設定ドロップインディレクトリ内のファイルを、ファイル名全体の英数字順で処理します。 たとえば、00-kubelet.confを最初に処理し、その後に01-kubelet.confで上書きします。

これらのファイルには部分的な設定を記述できますが、設定として無効であってはならず、apiVersionとkindを含む型メタデータを指定する必要があります。 検証は、kubelet内部に保存される最終的な設定構造に対してのみ行われます。 これにより、望ましくない設定を防ぎながら、さまざまなソースからkubelet設定を管理してマージできます。

ただし、設定フィールドのデータ型によって動作が異なる点に注意してください。 kubeletの設定構造では、データ型によってマージ方法が異なります。 詳細はリファレンスを参照してください。

kubelet設定のマージ順序

起動時に、kubeletは次の設定をマージします。

  • コマンドラインで指定されたフィーチャーゲート(優先順位が最も低い)。
  • kubelet設定。
  • ソート順に並べたドロップイン設定ファイル。
  • フィーチャーゲートを除くコマンドライン引数(優先順位が最も高い)。

備考:

kubeletの設定ドロップインディレクトリの仕組みは、kubeadmツールの設定パッチ機能と似ていますが、異なります。 kubeadmツールは設定に対して特定のパッチ適用方法を使用します。 一方、kubeletの設定ドロップインファイルで使用できるパッチ適用方法はreplaceのみです。

kubeletは、サフィックスを英数字順に並べてマージ順序を決定し、優先順位の高いファイルに存在するフィールドをすべて置き換えます。

kubeletの設定を表示する

この機能を使うと設定が複数のファイルに分散する場合があります。 最終的に有効になっている設定を確認するには、次の手順に従います。

  1. ターミナルでkubectl proxyを使ってプロキシサーバーを起動します。

    kubectl proxy
    

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

    Starting to serve on 127.0.0.1:8001
    
  2. 別のターミナルウィンドウを開き、curlを使ってkubeletの設定を取得します。 <node-name>を実際のノード名に置き換えてください。

    curl -X GET http://127.0.0.1:8001/api/v1/nodes/<node-name>/proxy/configz | jq .
    
    {
      "kubeletconfig": {
        "enableServer": true,
        "staticPodPath": "/var/run/kubernetes/static-pods",
        "syncFrequency": "1m0s",
        "fileCheckFrequency": "20s",
        "httpCheckFrequency": "20s",
        "address": "192.168.1.16",
        "port": 10250,
        "readOnlyPort": 10255,
        "tlsCertFile": "/var/lib/kubelet/pki/kubelet.crt",
        "tlsPrivateKeyFile": "/var/lib/kubelet/pki/kubelet.key",
        "rotateCertificates": true,
        "authentication": {
          "x509": {
            "clientCAFile": "/var/run/kubernetes/client-ca.crt"
          },
          "webhook": {
            "enabled": true,
            "cacheTTL": "2m0s"
          },
          "anonymous": {
            "enabled": true
          }
        },
        "authorization": {
          "mode": "AlwaysAllow",
          "webhook": {
            "cacheAuthorizedTTL": "5m0s",
            "cacheUnauthorizedTTL": "30s"
          }
        },
        "registryPullQPS": 5,
        "registryBurst": 10,
        "eventRecordQPS": 50,
        "eventBurst": 100,
        "enableDebuggingHandlers": true,
        "healthzPort": 10248,
        "healthzBindAddress": "127.0.0.1",
        "oomScoreAdj": -999,
        "clusterDomain": "cluster.local",
        "clusterDNS": [
          "10.0.0.10"
        ],
        "streamingConnectionIdleTimeout": "4h0m0s",
        "nodeStatusUpdateFrequency": "10s",
        "nodeStatusReportFrequency": "5m0s",
        "nodeLeaseDurationSeconds": 40,
        "imageMinimumGCAge": "2m0s",
        "imageMaximumGCAge": "0s",
        "imageGCHighThresholdPercent": 85,
        "imageGCLowThresholdPercent": 80,
        "volumeStatsAggPeriod": "1m0s",
        "cgroupsPerQOS": true,
        "cgroupDriver": "systemd",
        "cpuManagerPolicy": "none",
        "cpuManagerReconcilePeriod": "10s",
        "memoryManagerPolicy": "None",
        "topologyManagerPolicy": "none",
        "topologyManagerScope": "container",
        "runtimeRequestTimeout": "2m0s",
        "hairpinMode": "promiscuous-bridge",
        "maxPods": 110,
        "podPidsLimit": -1,
        "resolvConf": "/run/systemd/resolve/resolv.conf",
        "cpuCFSQuota": true,
        "cpuCFSQuotaPeriod": "100ms",
        "nodeStatusMaxImages": 50,
        "maxOpenFiles": 1000000,
        "contentType": "application/vnd.kubernetes.protobuf",
        "kubeAPIQPS": 50,
        "kubeAPIBurst": 100,
        "serializeImagePulls": true,
        "evictionHard": {
          "imagefs.available": "15%",
          "memory.available": "100Mi",
          "nodefs.available": "10%",
          "nodefs.inodesFree": "5%",
          "imagefs.inodesFree": "5%"
        },
        "evictionPressureTransitionPeriod": "1m0s",
        "mergeDefaultEvictionSettings": false,
        "enableControllerAttachDetach": true,
        "makeIPTablesUtilChains": true,
        "iptablesMasqueradeBit": 14,
        "iptablesDropBit": 15,
        "featureGates": {
          "AllAlpha": false
        },
        "failSwapOn": false,
        "memorySwap": {},
        "containerLogMaxSize": "10Mi",
        "containerLogMaxFiles": 5,
        "configMapAndSecretChangeDetectionStrategy": "Watch",
        "enforceNodeAllocatable": [
          "pods"
        ],
        "volumePluginDir": "/usr/libexec/kubernetes/kubelet-plugins/volume/exec/",
        "logging": {
          "format": "text",
          "flushFrequency": "5s",
          "verbosity": 3,
          "options": {
            "json": {
              "infoBufferSize": "0"
            }
          }
        },
        "enableSystemLogHandler": true,
        "enableSystemLogQuery": false,
        "shutdownGracePeriod": "0s",
        "shutdownGracePeriodCriticalPods": "0s",
        "enableProfilingHandler": true,
        "enableDebugFlagsHandler": true,
        "seccompDefault": false,
        "registerNode": true,
        "localStorageCapacityIsolation": true,
        "containerRuntimeEndpoint": "unix:///var/run/crio/crio.sock"
      }
    }
    

次の項目

  • KubeletConfigurationリファレンスを確認して、kubelet設定についてさらに学びましょう。
  • リファレンスを確認して、kubelet設定のマージについてさらに学びましょう。
最終更新 October 25, 2026 at 5:01 PM PST: Translate kubelet config file docs to Japanese (fd581d76d6)