ノードアフィニティを使ったスケジューリング

KubernetesKubernetesBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Kubernetes では、ノードアフィニティを使用して特定の条件に一致するノード上にポッドをスケジュールします。これを使用すると、特定のタイプのノード上にポッドがスケジュールされるようにするか、ノード間でワークロードをバランスさせることができます。この実験では、特定のノード上にポッドをスケジュールするためにノードアフィニティをどのように使用するかを学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") subgraph Lab Skills kubernetes/initialization -.-> lab-18468{{"ノードアフィニティを使ったスケジューリング"}} kubernetes/get -.-> lab-18468{{"ノードアフィニティを使ったスケジューリング"}} kubernetes/create -.-> lab-18468{{"ノードアフィニティを使ったスケジューリング"}} kubernetes/apply -.-> lab-18468{{"ノードアフィニティを使ったスケジューリング"}} kubernetes/label -.-> lab-18468{{"ノードアフィニティを使ったスケジューリング"}} end

Minikubeクラスタを起動する

リソースを作成する前に、動作中のKubernetesクラスタが必要です。Minikubeは、ローカルマシン上で動作する軽量のKubernetes環境です。

  1. 作業ディレクトリに移動する

    ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。

    cd /home/labex/project
  2. Minikubeを起動する

    Minikubeを起動してKubernetesクラスタを初期化します。

    minikube start
    • このコマンドは、ローカルマシン上に単一ノードのKubernetesクラスタをセットアップします。
    • Minikubeの起動には、システムの性能に応じて数分かかる場合があります。
  3. Minikubeが動作していることを確認する

    Minikubeクラスタの状態を確認します。

    minikube status
    • kubeletapiserverなどのコンポーネントがRunningと表示されていることを確認します。
    • クラスタが起動していない場合は、minikube startを再度実行します。

Minikubeの起動に問題がある場合は、必要に応じてminikube deleteを使用して環境をリセットします。

ラベル付きのノードを作成する

このステップでは、ポッドのスケジュールに使用されるラベル付きのノードを作成します。

  1. /home/labex ディレクトリに、以下の内容を持つ node-with-label.yaml という名前のファイルを作成します。
apiVersion: v1
kind: Node
metadata:
  name: minikube
  labels:
    type: web
  1. 変更を適用します。
kubectl apply -f node-with-label.yaml
  1. ノードが作成され、ラベル付けされていることを確認します。
kubectl get nodes --show-labels

ノードアフィニティを持つポッドを作成する

このステップでは、特定のラベルが付いたノード上にスケジュールされることを保証するノードアフィニティルールを持つポッドを作成します。

  1. /home/labex ディレクトリに、以下の内容を持つ pod-with-node-affinity.yaml という名前のファイルを作成します。
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In
                values:
                  - web
  1. 変更を適用します。
kubectl apply -f pod-with-node-affinity.yaml
  1. type=web のラベルが付いたノード上にポッドがスケジュールされていることを確認します。
kubectl get pod pod-with-node-affinity -o wide

ノード反アフィニティを持つポッドを作成する

このステップでは、特定のラベルが付いたノード上にはスケジュールされないことを保証するノード反アフィニティルールを持つポッドを作成します。

  1. /home/labex ディレクトリに、以下の内容を持つ pod-with-node-anti-affinity.yaml という名前のファイルを作成します。
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-anti-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: NotIn
                values:
                  - web
  1. 変更を適用します。
kubectl apply -f pod-with-node-anti-affinity.yaml
  1. type=db のラベルが付いたノード上にポッドがスケジュールされていないことを確認します。
kubectl get pod pod-with-node-anti-affinity -o wide

ノードアフィニティとノードセレクタを持つポッドを作成する

このステップでは、ノードアフィニティルールとノードセレクタの両方を備えたポッドを作成します。これにより、特定のラベルが付いたノード上にポッドがスケジュールされることが保証されます。

  1. /home/labex ディレクトリに、以下の内容を持つ pod-with-node-affinity-and-selector.yaml という名前のファイルを作成します。
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-node-affinity-and-selector
spec:
  containers:
    - name: nginx
      image: nginx:latest
  nodeSelector:
    type: web
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In
                values:
                  - db
  1. 変更を適用します。
kubectl apply -f pod-with-node-affinity-and-selector.yaml
  1. type=web のラベルが付いたノード上にポッドがスケジュールされていないことを確認します。
kubectl get pod pod-with-node-affinity-and-selector -o wide

複数のノードアフィニティルールを持つポッドを作成する

このステップでは、複数のノードアフィニティルールを持つポッドを作成します。これにより、すべてのルールに一致するラベルが付いたノード上にポッドがスケジュールされることが保証されます。

  1. /home/labex ディレクトリに、以下の内容を持つ pod-with-multiple-node-affinity.yaml という名前のファイルを作成します。
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-multiple-node-affinity
spec:
  containers:
    - name: nginx
      image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: type
                operator: In
                values:
                  - web
          - matchExpressions:
              - key: disktype
                operator: In
                values:
                  - ssd
  1. 変更を適用します。
kubectl apply -f pod-with-multiple-node-affinity.yaml
  1. type=web および disktype=ssd のラベルが付いたノード上にポッドがスケジュールされていることを確認します。
kubectl get pod pod-with-multiple-node-affinity -o wide

まとめ

この実験では、ノードアフィニティを使用して特定のノード上にポッドをスケジュールする方法を学びました。ラベルが付いたノードを作成し、その後、特定のラベルが付いたノード上にスケジュールされることを保証するノードアフィニティルールを持つポッドを作成しました。また、特定のラベルが付いたノード上にはスケジュールされないことを保証するノード反アフィニティルールを持つポッドを作成しました。最後に、すべてのルールに一致するラベルが付いたノード上にスケジュールされることを保証する複数のノードアフィニティルールを持つポッドを作成しました。