はじめに
Kubernetes では、ノードアフィニティを使用して特定の条件に一致するノード上にポッドをスケジュールします。これを使用すると、特定のタイプのノード上にポッドがスケジュールされるようにするか、ノード間でワークロードをバランスさせることができます。この実験では、特定のノード上にポッドをスケジュールするためにノードアフィニティをどのように使用するかを学びます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Kubernetes では、ノードアフィニティを使用して特定の条件に一致するノード上にポッドをスケジュールします。これを使用すると、特定のタイプのノード上にポッドがスケジュールされるようにするか、ノード間でワークロードをバランスさせることができます。この実験では、特定のノード上にポッドをスケジュールするためにノードアフィニティをどのように使用するかを学びます。
リソースを作成する前に、動作中のKubernetesクラスタが必要です。Minikubeは、ローカルマシン上で動作する軽量のKubernetes環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。
cd /home/labex/project
Minikubeを起動する:
Minikubeを起動してKubernetesクラスタを初期化します。
minikube start
Minikubeが動作していることを確認する:
Minikubeクラスタの状態を確認します。
minikube status
kubelet
やapiserver
などのコンポーネントがRunning
と表示されていることを確認します。minikube start
を再度実行します。Minikubeの起動に問題がある場合は、必要に応じてminikube delete
を使用して環境をリセットします。
このステップでは、ポッドのスケジュールに使用されるラベル付きのノードを作成します。
/home/labex
ディレクトリに、以下の内容を持つ 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
このステップでは、特定のラベルが付いたノード上にスケジュールされることを保証するノードアフィニティルールを持つポッドを作成します。
/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
kubectl apply -f pod-with-node-affinity.yaml
type=web
のラベルが付いたノード上にポッドがスケジュールされていることを確認します。kubectl get pod pod-with-node-affinity -o wide
このステップでは、特定のラベルが付いたノード上にはスケジュールされないことを保証するノード反アフィニティルールを持つポッドを作成します。
/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
kubectl apply -f pod-with-node-anti-affinity.yaml
type=db
のラベルが付いたノード上にポッドがスケジュールされていないことを確認します。kubectl get pod pod-with-node-anti-affinity -o wide
このステップでは、ノードアフィニティルールとノードセレクタの両方を備えたポッドを作成します。これにより、特定のラベルが付いたノード上にポッドがスケジュールされることが保証されます。
/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
kubectl apply -f pod-with-node-affinity-and-selector.yaml
type=web
のラベルが付いたノード上にポッドがスケジュールされていないことを確認します。kubectl get pod pod-with-node-affinity-and-selector -o wide
このステップでは、複数のノードアフィニティルールを持つポッドを作成します。これにより、すべてのルールに一致するラベルが付いたノード上にポッドがスケジュールされることが保証されます。
/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
kubectl apply -f pod-with-multiple-node-affinity.yaml
type=web
および disktype=ssd
のラベルが付いたノード上にポッドがスケジュールされていることを確認します。kubectl get pod pod-with-multiple-node-affinity -o wide
この実験では、ノードアフィニティを使用して特定のノード上にポッドをスケジュールする方法を学びました。ラベルが付いたノードを作成し、その後、特定のラベルが付いたノード上にスケジュールされることを保証するノードアフィニティルールを持つポッドを作成しました。また、特定のラベルが付いたノード上にはスケジュールされないことを保証するノード反アフィニティルールを持つポッドを作成しました。最後に、すべてのルールに一致するラベルが付いたノード上にスケジュールされることを保証する複数のノードアフィニティルールを持つポッドを作成しました。