website/content/ja/docs/concepts/architecture/nodes.md

23 KiB
Raw Blame History

title content_type weight
ノード concept 10

Kubernetesはコンテナを Node 上で実行されるPodに配置することで、ワークロードを実行します。 ードはクラスターによりますが、1つのVMまたは物理的なマシンです。 各ノードは{{< glossary_tooltip text="Pod" term_id="pod" >}}やそれを制御する{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}}を実行するのに必要なサービスを含んでいます。

通常、1つのクラスターで複数のードを持ちます。学習用途やリソースの制限がある環境では、1ードかもしれません。

1つのード上のコンポーネントには、{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}、{{< glossary_tooltip text="コンテナランタイム" term_id="container-runtime" >}}、{{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}}が含まれます。

管理

ノードを{{< glossary_tooltip text="APIサーバー" term_id="kube-apiserver" >}}に加えるには2つの方法があります:

  1. ード上のkubeletが、コントロールプレーンに自己登録する。
  2. あなた、もしくは他のユーザーが手動でNodeオブジェクトを追加する。

Nodeオブジェクトの作成、もしくはード上のkubeketによる自己登録の後、コントロールプレーンはNodeオブジェクトが有効かチェックします。例えば、下記のjsonマニフェストでードを作成してみましょう:

{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

Kubernetesは内部的にNodeオブジェクトを作成します。 APIサーバーに登録したkubeletがードのmetadata.nameフィールドが一致しているか検証します。ードが有効な場合、つまり必要なサービスがすべて実行されている場合は、Podを実行する資格があります。それ以外の場合、該当ードが有効になるまではいかなるクラスターの活動に対しても無視されます。

{{< note >}} Kubernetesは無効なNodeのオブジェクトを保持し、それが有効になるまで検証を続けます。

ヘルスチェックを止めるためには、あなた、もしくは{{< glossary_tooltip term_id="controller" text="コントローラー">}}が明示的にNodeを削除する必要があります。 {{< /note >}}

Nodeオブジェクトの名前は有効なDNSサブドメイン名である必要があります。

ノードの自己登録

kubeletのフラグ --register-nodeがtrueデフォルトのとき、kubeletは自分自身をAPIサーバーに登録しようとします。これはほとんどのディストリビューションで使用されている推奨パターンです。

自己登録については、kubeletは以下のオプションを伴って起動されます:

  • --kubeconfig - 自分自身をAPIサーバーに対して認証するための資格情報へのパス
  • --cloud-provider - 自身に関するメタデータを読むために{{< glossary_tooltip text="クラウドプロバイダー" term_id="cloud-provider" >}}と会話する方法
  • --register-node - 自身をAPIサーバーに自動的に登録
  • --register-with-taints - 与えられた{{< glossary_tooltip text="taint" term_id="taint" >}}のリストでノードを登録します (カンマ区切りの <key>=<value>:<effect>)。

register-nodeがfalseの場合、このオプションは機能しません

  • --node-ip - ードのIPアドレス
  • --node-labels - ノードをクラスターに登録するときに追加する{{< glossary_tooltip text="Label" term_id="label" >}}NodeRestriction許可プラグインによって適用されるラベルの制限を参照)
  • --node-status-update-frequency - kubeletがードのステータスをマスターにPOSTする頻度の指定

ノード認証モードおよびNodeRestriction許可プラグインが有効になっている場合、kubeletは自分自身のードリソースを作成/変更することのみ許可されています。

手動によるノード管理

クラスター管理者は{{< glossary_tooltip text="kubectl" term_id="kubectl" >}}を使用してNodeオブジェクトを作成および変更できます。

管理者が手動でNodeオブジェクトを作成したい場合は、kubeletフラグ --register-node = falseを設定してください。

管理者は--register-nodeの設定に関係なくNodeオブジェクトを変更することができます。 例えば、ードにラベルを設定し、それをunschedulableとしてマークすることが含まれます。

ード上のラベルは、スケジューリングを制御するためにPod上のードセレクターと組み合わせて使用できます。 例えば、Podをードのサブセットでのみ実行する資格があるように制限します。

ードをunschedulableとしてマークすると、新しいPodがそのードにスケジュールされるのを防ぎますが、ード上の既存のPodには影響しません。 これは、ノードの再起動などの前の準備ステップとして役立ちます。

ノードにスケジュール不可能のマークを付けるには、次のコマンドを実行します:

kubectl cordon $ノード名

{{< note >}} {{< glossary_tooltip term_id="daemonset" >}}によって作成されたPodはード上のunschedulable属性を考慮しません。 これは、再起動の準備中にアプリケーションからアプリケーションが削除されている場合でも、DaemonSetがマシンに属していることを前提としているためです。 {{< /note >}}

ノードのステータス

ノードのステータスは以下の情報を含みます:

kubectlを使用し、ノードのステータスや詳細を確認できます:

kubectl describe node <ノード名をここに挿入>

出力情報の各箇所について、以下で説明します。

Addresses

これらのフィールドの使い方は、お使いのクラウドプロバイダーやベアメタルの設定内容によって異なります。

  • HostName: ードのカーネルによって伝えられたホスト名です。kubeletの--hostname-overrideパラメーターによって上書きすることができます。
  • ExternalIP: 通常は、外部にルーティング可能(クラスターの外からアクセス可能)なードのIPアドレスです。
  • InternalIP: 通常は、クラスター内でのみルーティング可能なードのIPアドレスです。

Conditions

conditionsフィールドは全てのRunningなノードのステータスを表します。例として、以下のような状態を含みます:

{{< table caption = "ードのConditionと、各condition適用時の概要" >}}

ードのCondition 概要
Ready ードの状態が有効でPodを配置可能な場合にTrueになります。ードの状態に問題があり、Podが配置できない場合にFalseになります。ノードコントローラーが、node-monitor-grace-periodで設定された時間内(デフォルトでは40秒)に該当ノードと疎通できない場合、Unknownになります。
DiskPressure ノードのディスク容量が圧迫されているときにTrueになります。圧迫とは、ディスクの空き容量が少ないことを指します。それ以外のときはFalseです。
MemoryPressure ノードのメモリが圧迫されているときにTrueになります。圧迫とは、メモリの空き容量が少ないことを指します。それ以外のときはFalseです。
PIDPressure プロセスが圧迫されているときにTrueになります。圧迫とは、プロセス数が多すぎることを指します。それ以外のときはFalseです。
NetworkUnavailable ノードのネットワークが適切に設定されていない場合にTrueになります。それ以外のときはFalseです。
{{< /table >}}

{{< note >}} コマンドラインを使用してcordonされたNodeを表示する場合、ConditionはSchedulingDisabledを含みます。 SchedulingDisabledはKubernetesのAPIにおけるConditionではありません;その代わり、cordonされたードはUnschedulableとしてマークされます。 {{< /note >}}

ードのConditionはJSONオブジェクトで表現されます。例えば、正常なードの場合は以下のような構造体が表示されます。

"conditions": [
  {
    "type": "Ready",
    "status": "True",
    "reason": "KubeletReady",
    "message": "kubelet is posting ready status",
    "lastHeartbeatTime": "2019-06-05T18:38:35Z",
    "lastTransitionTime": "2019-06-05T11:41:27Z"
  }
]

Ready conditionがpod-eviction-timeout({{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}}に渡された引数)に設定された時間を超えてもUnknownFalseのままになっている場合、該当ード上にあるPodはードコントローラーによって削除がスケジュールされます。デフォルトの退役のタイムアウトの時間は5分です。ードが到達不能ないくつかの場合においては、APIサーバーが該当ードのkubeletと疎通できない状態になっています。その場合、APIサーバーがkubeletと再び通信を確立するまでの間、Podの削除を行うことはできません。削除がスケジュールされるまでの間、削除対象のPodは切り離されたードの上で稼働を続けることになります。

ードコントローラーはクラスター内でPodが停止するのを確認するまでは強制的に削除しないようになりました。到達不能なード上で動いているPodはTerminatingまたはUnknownのステータスになります。Kubernetesが基盤となるインフラストラクチャーを推定できない場合、クラスター管理者は手動でNodeオブジェクトを削除する必要があります。KubernetesからNodeオブジェクトを削除すると、そのードで実行されているすべてのPodオブジェクトがAPIサーバーから削除され、それらの名前が解放されます。

ードのライフサイクルコントローラーがconditionを表したtaintを自動的に生成します。 スケジューラーがPodをードに割り当てる際、ードのtaintを考慮します。Podが許容するtaintは例外です。

詳細は条件によるtaintの付与を参照してください。

CapacityとAllocatable

ードで利用可能なリソースCPU、メモリ、およびードでスケジュールできる最大Pod数について説明します。

capacityブロック内のフィールドは、ードが持っているリソースの合計量を示します。 allocatableブロックは、通常のPodによって消費されるード上のリソースの量を示します。

CapacityとAllocatableについて深く知りたい場合は、ード上でどのようにコンピュートリソースが予約されるかを読みながら学ぶことができます。

Info

カーネルのバージョン、Kubernetesのバージョンkubeletおよびkube-proxyのバージョン使用されている場合Dockerのバージョン、OS名など、ードに関する一般的な情報です。 この情報はードからkubeletを通じて取得されます。

管理

PodServiceと違い、ードは本質的にはKubernetesによって作成されません。GCPのようなクラウドプロバイダーによって外的に作成されるか、VMや物理マシンのプールに存在するものです。そのため、Kubernetesがードを作成すると、そのードを表すオブジェクトが作成されます。作成後、Kubernetesはそのードが有効かどうかを確認します。 たとえば、次の内容からノードを作成しようとしたとします:

{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

Kubernetesは内部的にNodeオブジェクトを作成し、 metadata.nameフィールドに基づくヘルスチェックによってードを検証します。ードが有効な場合、つまり必要なサービスがすべて実行されている場合は、Podを実行する資格があります。それ以外の場合、該当ードが有効になるまではいかなるクラスターの活動に対しても無視されます。 Nodeオブジェクトの名前は有効なDNSサブドメイン名である必要があります。

{{< note >}} Kubernetesは無効なードのためにオブジェクトを保存し、それをチェックし続けます。 このプロセスを停止するには、Nodeオブジェクトを明示的に削除する必要があります。 {{< /note >}}

現在、Kubernetesのードインターフェースと相互作用する3つのコンポーネントがあります。ードコントローラー、kubelet、およびkubectlです。

ノードコントローラー

ノード{{< glossary_tooltip text="コントローラー" term_id="controller" >}}は、ードのさまざまな側面を管理するKubernetesのコントロールプレーンコンポーネントです。

ードコントローラーは、ードの存続期間中に複数の役割を果たします。1つ目は、ードが登録されたときにCIDRブロックをードに割り当てることですCIDR割り当てがオンになっている場合

2つ目は、ードコントローラーの内部ードリストをクラウドの利用可能なマシンのリストと一致させることです。 クラウド環境で実行している場合、ードに異常があると、ードコントローラーはクラウドプロバイダーにそのNodeのVMがまだ使用可能かどうかを問い合わせます。 使用可能でない場合、ノードコントローラーはノードのリストから該当ノードを削除します。

3つ目は、ードの状態を監視することです。 ノードが到達不能(例えば、ノードがダウンしているなどので理由で、ノードコントローラーがハートビートの受信を停止した場合)になると、ードコントローラーは、NodeStatusのNodeReady conditionをConditionUnknownに変更する役割があります。その後も該当ードが到達不能のままであった場合、Graceful Terminationを使って全てのPodを退役させます。デフォルトのタイムアウトは、ConditionUnknownの報告を開始するまで40秒、その後Podの追い出しを開始するまで5分に設定されています。 ノードコントローラーは、--node-monitor-periodに設定された秒数ごとに各ノードの状態をチェックします。

ハートビート

ハートビートは、Kubernetesードから送信され、ードが利用可能か判断するのに役立ちます。 2つのハートビートがあります:NodeStatusの更新と[Lease object](/docs/reference/generated/kubernetes-api/{{< latest-version >}}#lease-v1-coordination-k8s-io)です。 各ノードはkube-node-leaseという{{< glossary_tooltip term_id="namespace" text="namespace">}}に関連したLeaseオブジェクトを持ちます。 Leaseは軽量なリソースで、クラスターのスケールに応じてードのハートビートにおけるパフォーマンスを改善します。

kubeletがNodeStatusとLeaseオブジェクトの作成および更新を担当します。

  • kubeletは、ステータスに変化があったり、設定した間隔の間に更新がない時にNodeStatusを更新します。NodeStatus更新のデフォルト間隔は分です。到達不能の場合のデフォルトタイムアウトである40秒よりもはるかに長いです
  • kubeletは10秒間隔(デフォルトの更新間隔)でLeaseオブジェクトの生成と更新を実施します。Leaseの更新はNodeStatusの更新とは独立されて行われます。Leaseの更新が失敗した場合、kubeletは200ミリ秒から始まり7秒を上限とした指数バックオフでリトライします。

信頼性

ほとんどの場合、排除の速度は1秒あたり--node-eviction-rateに設定された数値デフォルトは秒間0.1です。つまり、10秒間に1つ以上のPodをードから追い出すことはありません。

特定のアベイラビリティーゾーン内のノードのステータスが異常になると、ノード排除の挙動が変わります。ノードコントローラーは、ゾーン内のノードの何%が異常NodeReady条件がConditionUnknownまたはConditionFalseであるであるかを同時に確認します。 異常なノードの割合が少なくとも --healthy-zone-thresholdに設定した値を下回る場合デフォルトは0.55)であれば、退役率は低下します。クラスターが小さい場合(すなわち、 --large-cluster-size-thresholdの設定値よりもード数が少ない場合。デフォルトは50、退役は停止し、そうでない場合、退役率は秒間で--secondary-node-eviction-rateの設定値デフォルトは0.01)に減少します。 これらのポリシーがアベイラビリティーゾーンごとに実装されているのは、1つのアベイラビリティーゾーンがマスターから分割される一方、他のアベイラビリティーゾーンは接続されたままになる可能性があるためです。 クラスターが複数のクラウドプロバイダーのアベイラビリティーゾーンにまたがっていない場合、アベイラビリティーゾーンは1つだけですクラスター全体

ードを複数のアベイラビリティゾーンに分散させる主な理由は、1つのゾーン全体が停止したときにワークロードを正常なゾーンに移動できることです。 したがって、ゾーン内のすべてのノードが異常である場合、ノードコントローラーは通常のレート --node-eviction-rateで退役します。 コーナーケースは、すべてのゾーンが完全にUnhealthyであるすなわち、クラスタ内にHealthyなードがない場合です。 このような場合、ノードコントローラーはマスター接続に問題があると見なし、接続が回復するまですべての退役を停止します。

ードコントローラーは、Podがtaintを許容しない場合、 NoExecuteのtaintを持つード上で実行されているPodを排除する責務もあります。 さらに、ノードコントローラーはノードに到達できない、または準備ができていないなどのノードの問題に対応する{{< glossary_tooltip text="taint" term_id="taint" >}}を追加する責務があります。これはスケジューラーが、問題のあるードにPodを配置しない事を意味しています。

{{< caution >}} kubectl cordonはノードに'unschedulable'としてマークします。それはロードバランサーのターゲットリストからノードを削除するという サービスコントローラーの副次的な効果をもたらします。これにより、ロードバランサトラフィックの流入をcordonされたードから効率的に除去する事ができます。 {{< /caution >}}

ノードのキャパシティ

NodeオブジェクトはードのリソースキャパシティCPUの数とメモリの量を監視します。 自己登録したードは、Nodeオブジェクトを作成するときにキャパシティを報告します。 手動によるノード管理を実行している場合は、ノードを追加するときにキャパシティを設定する必要があります。

Kubernetes{{< glossary_tooltip text="スケジューラー" term_id="kube-scheduler" >}}は、ード上のすべてのPodに十分なリソースがあることを確認します。スケジューラーは、ード上のコンテナが要求するリソースの合計がードキャパシティ以下であることを確認します。 これは、kubeletによって管理されたすべてのコンテナを含みますが、コンテナランタイムによって直接開始されたコンテナやkubeletの制御外で実行されているプロセスは含みません。

{{< note >}} Pod以外のプロセス用にリソースを明示的に予約したい場合は、Systemデーモン用にリソースを予約を参照してください。 {{< /note >}}

ノードのトポロジー

{{< feature-state state="alpha" for_k8s_version="v1.16" >}} TopologyManagerフィーチャーゲートを有効にすると、 kubeletはリソースの割当を決定する際にトポロジーのヒントを利用できます。 詳細は、ノードのトポロジー管理ポリシーを制御するを参照してください。

{{% heading "whatsnext" %}}

  • ノードコンポーネントについて学習する。
  • [Node APIオブジェクト](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core)について読む。
  • アーキテクチャ設計文書のNodeという章を読む。
  • TaintとTolerationについて読む。