はじめに
Kubernetesにおいて、ノードアフィニティ(Node Affinity)は、特定の条件を満たすノードにPodをスケジュールするために使用されます。これを利用することで、特定の種類のノードにPodを確実に配置したり、ノード間でワークロードを分散させたりすることが可能です。この実験では、ノードアフィニティを使用して特定のノードにPodをスケジュールする方法を学びます。
Minikubeクラスターの起動
リソースを作成する前に、実行中のKubernetesクラスターが必要です。Minikubeは、ローカルマシン上で動作する軽量なKubernetes環境です。
作業ディレクトリへの移動:
ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。
cd /home/labex/projectMinikubeの起動:
Minikubeを起動してKubernetesクラスターを初期化します。
minikube start- このコマンドは、ローカルマシン上にシングルノードのKubernetesクラスターをセットアップします。
- システムのパフォーマンスによっては、Minikubeの起動に数分かかる場合があります。
Minikubeの稼働確認:
Minikubeクラスターの状態を確認します。
minikube statuskubeletやapiserverなどのコンポーネントがRunningと表示されていることを確認してください。- クラスターが実行されていない場合は、再度
minikube startを実行してください。
Minikubeの起動で問題が発生した場合は、必要に応じて minikube delete を使用して環境をリセットしてください。
この実験の残りのステップは、YAMLファイルが同じ作業ディレクトリに保持されるよう、/home/labex/project から実行してください。
ラベル付きノードの作成
このステップでは、Podのスケジューリングに使用するラベルが付与されたノードを作成します。
/home/labex/projectディレクトリにnode-with-label.yamlという名前のファイルを作成し、以下の内容を記述します。
apiVersion: v1
kind: Node
metadata:
name: minikube
labels:
type: web
- 変更を適用します。
kubectl apply -f node-with-label.yaml
- ノードが作成され、ラベルが付与されたことを確認します。
kubectl get nodes --show-labels
ノードアフィニティを持つPodの作成
このステップでは、特定のラベルを持つノードに確実にスケジュールされるよう、ノードアフィニティルールを持つPodを作成します。
/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
- 変更を適用します。
kubectl apply -f pod-with-node-affinity.yaml
- Podが
type=webラベルを持つノードにスケジュールされていることを確認します。
kubectl get pod pod-with-node-affinity -o wide
ノードアンチアフィニティを持つPodの作成
このステップでは、特定のラベルを持つノードにはスケジュールされないようにする、ノードアンチアフィニティ(Node Anti-Affinity)ルールを持つPodを作成します。
/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
- 変更を適用します。
kubectl apply -f pod-with-node-anti-affinity.yaml
- Podが
type=dbラベルを持つノードにスケジュールされていないことを確認します。
kubectl get pod pod-with-node-anti-affinity -o wide
ノードアフィニティとノードセレクターを持つPodの作成
このステップでは、ノードアフィニティルールとノードセレクター(Node Selector)の両方を使用して、特定のラベルを持つノードにスケジュールされるPodを作成します。
/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
- 変更を適用します。
kubectl apply -f pod-with-node-affinity-and-selector.yaml
- Podが
type=webラベルを持つノードにスケジュールされていないことを確認します。
kubectl get pod pod-with-node-affinity-and-selector -o wide
複数のノードアフィニティルールを持つPodの作成
このステップでは、複数のノードアフィニティルールを使用して、すべてのルールに一致するラベルを持つノードにスケジュールされるPodを作成します。
/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
- 変更を適用します。
kubectl apply -f pod-with-multiple-node-affinity.yaml
- Podが
type=webおよびdisktype=ssdラベルを持つノードにスケジュールされていることを確認します。
kubectl get pod pod-with-multiple-node-affinity -o wide
まとめ
この実験では、ノードアフィニティを使用して特定のノードにPodをスケジュールする方法を学びました。ラベル付きノードを作成し、特定のラベルを持つノードにPodが配置されるようアフィニティルールを設定しました。また、ノードアンチアフィニティを使用して特定のノードへの配置を回避する方法や、複数のアフィニティルールを組み合わせて厳密なスケジューリングを行う方法についても確認しました。


