0Pricing
DevOps Bootcamp · レッスン

ノードセレクターとアフィニティ

ノードセレクターと、より柔軟なノードおよびPodのアフィニティルールを使って、Podのスケジューリング先を制御します。

「ノードセレクターとアフィニティ」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。

Podの配置先を制御する

デフォルトでは、Kubernetesは利用可能な任意のノードにPodをスケジュールします。しかし、配置先をより細かく制御したい場合はどうすればよいでしょうか。

Podを特定のノードで実行する必要がある場合があります。たとえば、そのノードに特殊なハードウェアやライセンスがある場合、または特定のアベイラビリティゾーンにある場合です。

このレッスンでは、Node SelectorとNode Affinityを使ってKubernetesのスケジューラーを誘導する方法を説明します。

スケジューラーを誘導する理由

高性能SSDを搭載したノードで実行する必要があるデータベースPodや、特定のハードウェアを必要とするGPU負荷の高いアプリケーションを考えてみてください。

また、障害耐性を高めるために特定のPod同士を離して配置したり、特定のオペレーティングシステムを搭載したノードで実行したりしたい場合もあります。

Kubernetesには、このようなスケジューリングの優先事項を表現するためのツールが用意されています。

ノードにはラベルがある

Podの配置先を指定するには、まずノードに識別情報が必要です。Kubernetesでは、ノードの特性を識別するためにラベルを使用します。

  • ラベルは、disk=ssdやgpu=trueのようなキーと値のペアです。
  • kubectl label nodes <node-name> <key>=<value>を使って、ノードにカスタムラベルを追加できます。
  • これらのラベルを使って、Podの配置対象となる特定のノードを指定します。

Node Selector:単純な一致

Podを特定のノード群に制約する最も簡単な方法は、nodeSelectorを使用することです。

これはPodの仕様内に記述するフィールドで、キーと値のペアのマップを指定します。Podは、指定されたラベルをすべて持つノードにのみスケジュールされます。

これは、「この条件に完全に一致するノードが必要です」と指定するようなものです。

Node Selectorの動作

disk=ssdというラベルが付いたノードがあるとします。これらのノードでのみPodを実行する方法は次のとおりです。

apiVersion: v1
kind: Pod
metadata:
  name: ssd-app
spec:
  containers:
  - name: my-container
    image: nginx
  nodeSelector:
    disk: ssd

Node Affinity:高度な一致

nodeSelectorは分かりやすい一方で、非常に厳密です。「優先する」ノードや、より複雑な一致条件を指定したい場合はどうすればよいでしょうか。

Node Affinityを使うと、より柔軟に指定できます。特定のラベルを持つノードへのPodの配置について、「ソフト」な要件または「ハード」な要件を表現できます。

In、NotIn、Exists、DoesNotExist、Gt、Ltなどの演算子を使う、より強力な構文を使用します。

必須と優先のアフィニティ

Node Affinityには主に2つのタイプがあります。

  • requiredDuringSchedulingIgnoredDuringExecution:Podはルールに一致するノードに必ずスケジュールされます。そのようなノードが存在しない場合、Podはスケジュールされません。
  • preferredDuringSchedulingIgnoredDuringExecution:スケジューラーはルールに一致するノードを探しますが、利用可能なノードがなければ、別のノードにPodをスケジュールします。「ベストエフォート」の方式です。

必須のNode Affinity

これは、env=productionというラベルを持つノードを必要とするPodの例です。そのようなノードが存在しない場合、PodはPending状態のままになります。

apiVersion: v1
kind: Pod
metadata:
  name: prod-app
spec:
  containers:
  - name: my-container
    image: httpd
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: env
            operator: In
            values:
            - production

Pod Affinity:他のPodも考慮する

他のPodが実行されている場所に基づいてPodをスケジュールしたい場合はどうすればよいでしょうか。

  • Pod Affinity:特定のラベルを持つ他のPodがすでに実行されているノードに、Podを引き寄せます。頻繁に通信するサービスを同じ場所に配置する場合に便利です。
  • Pod Anti-affinity:特定のラベルを持つ他のPodが実行されているノードから、Podを遠ざけます。高可用性のためにレプリカを複数のノードに分散する場合に適しています。

Pod Anti-affinityの実践

このマニフェストにより、app=my-webというラベルを持つ2つのPodが同じノードにスケジュールされないことが保証されます。これにより、障害耐性が向上します。

topologyKeyは、Anti-affinityを適用する範囲(例:ノード、ゾーン)を指定します。

apiVersion: v1
kind: Pod
metadata:
  name: web-app-pod
  labels:
    app: my-web
spec:
  containers:
  - name: web-container
    image: busybox
    command: ["sh", "-c", "echo 'Hello from web-app'; sleep 3600"]
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app: my-web
          topologyKey: "kubernetes.io/hostname"

理解度を確認する

重要なデータベースPodが、zone=devというラベルを持つノードに決してスケジュールされないようにしたいとします。ノードラベルに基づくこの厳密な除外には、どのタイプのスケジューリングルールを使用しますか。

まとめ:スケジューリングの制御

よくできました。Podの実行場所を制御する強力な方法を学びました。

  • Node Labels:ノードの特性を識別するキーと値のペアです。
  • Node Selectors:特定のラベルを持つノードにPodをスケジュールする、単純で厳密な一致条件です。
  • Node Affinity:演算子を使ってノードを選択する、より柔軟なルール(必須または優先)です。
  • Pod Affinity/Anti-affinity:他のPodの配置場所に基づいて、Podを同じ場所に配置したり分離したりします。

これらのツールは、リソース使用率の最適化、障害耐性の確保、特定のアプリケーション要件への対応に不可欠です。

よくある質問

「ノードセレクターとアフィニティ」レッスンは無料ですか?

はい。「ノードセレクターとアフィニティ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。

「ノードセレクターとアフィニティ」で何を学びますか?

ノードセレクターと、より柔軟なノードおよびPodのアフィニティルールを使って、Podのスケジューリング先を制御します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

DevOps Bootcampを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ノードセレクターとアフィニティ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDevOps Bootcampレッスンでコードを書いて実行できますか?

はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. リソースのRequestsとLimits
  2. ノードセレクターとアフィニティ
  3. TaintsとTolerations
  4. Podの優先度とプリエンプション
← DevOps Bootcampに戻る