ノードアフィニティによるスケジューリング

KubernetesBeginner
オンラインで実践に進む

はじめに

Kubernetesにおいて、ノードアフィニティ(Node Affinity)は、特定の条件を満たすノードにPodをスケジュールするために使用されます。これを利用することで、特定の種類のノードにPodを確実に配置したり、ノード間でワークロードを分散させたりすることが可能です。この実験では、ノードアフィニティを使用して特定のノードにPodをスケジュールする方法を学びます。

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 を使用して環境をリセットしてください。

この実験の残りのステップは、YAMLファイルが同じ作業ディレクトリに保持されるよう、/home/labex/project から実行してください。

ラベル付きノードの作成

このステップでは、Podのスケジューリングに使用するラベルが付与されたノードを作成します。

  1. /home/labex/project ディレクトリに 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

ノードアフィニティを持つPodの作成

このステップでは、特定のラベルを持つノードに確実にスケジュールされるよう、ノードアフィニティルールを持つPodを作成します。

  1. /home/labex/project ディレクトリに 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. Podが type=web ラベルを持つノードにスケジュールされていることを確認します。
kubectl get pod pod-with-node-affinity -o wide

ノードアンチアフィニティを持つPodの作成

このステップでは、特定のラベルを持つノードにはスケジュールされないようにする、ノードアンチアフィニティ(Node Anti-Affinity)ルールを持つPodを作成します。

  1. /home/labex/project ディレクトリに 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. Podが type=db ラベルを持つノードにスケジュールされていないことを確認します。
kubectl get pod pod-with-node-anti-affinity -o wide

ノードアフィニティとノードセレクターを持つPodの作成

このステップでは、ノードアフィニティルールとノードセレクター(Node Selector)の両方を使用して、特定のラベルを持つノードにスケジュールされるPodを作成します。

  1. /home/labex/project ディレクトリに 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. Podが type=web ラベルを持つノードにスケジュールされていないことを確認します。
kubectl get pod pod-with-node-affinity-and-selector -o wide

複数のノードアフィニティルールを持つPodの作成

このステップでは、複数のノードアフィニティルールを使用して、すべてのルールに一致するラベルを持つノードにスケジュールされるPodを作成します。

  1. /home/labex/project ディレクトリに 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. Podが type=web および disktype=ssd ラベルを持つノードにスケジュールされていることを確認します。
kubectl get pod pod-with-multiple-node-affinity -o wide

まとめ

この実験では、ノードアフィニティを使用して特定のノードにPodをスケジュールする方法を学びました。ラベル付きノードを作成し、特定のラベルを持つノードにPodが配置されるようアフィニティルールを設定しました。また、ノードアンチアフィニティを使用して特定のノードへの配置を回避する方法や、複数のアフィニティルールを組み合わせて厳密なスケジューリングを行う方法についても確認しました。