ノードアフィニティは一連のルールです。これは、ポッドをクラスタ内のどこに配置できるかを決定するためにスケジューラによって使用されます。ルールは、ノードのラベルとポッド定義で指定されたラベルセレクターを使用して定義されます。ノードアフィニティを使用すると、ポッドは、スケジュール可能なノードのグループに対するアフィニティを指定できます。ポッドを制限して、特定のノードでのみ実行できるようにすることができます。
nodeSelectorは、ノード選択制約の最も単純な形式です。 nodeSelectorは、PodSpecのプロパティです。ポッドをノードで実行できるようにするには、ノードに指定された各ラベルが必要です。
ノードアフィニティは、概念的にはnodeSelectorに似ています。これにより、ノードのラベルに基づいて、ポッドがスケジュールできるノードを制限できます。
現在、ノードアフィニティには2つのタイプがあります。
- requiredDuringSchedulingIgnoredDuringExecutionおよび
- preferredDuringSchedulingIgnoredDuringExecution。
スケジュール中とは
- ここでは、ポッドはまだ作成されておらず、初めて作成される予定です。
- 通常、ポッドが作成されると、アフィニティルールが適用されます。
実行中とは
- ここでは、ポッドが実行されており、nodeAffinityに影響する環境で変更が加えられています。
ノードアフィニティの詳細については、kubernete.ioのKubernetesの公式ドキュメントにアクセスしてください。
この記事では、Kubernetesクラスタで「requiredDuringSchedulingIgnoredDuringExecution」ノードアフィニティを使用して、Kubernetesポッドを特定のノードに割り当てる方法を説明します。
- 少なくとも1つのワーカーノードを持つKubernetesクラスタ。
Kubernetesクラスタの作成方法を学びたい場合は、ここをクリックしてください。このガイドは、AWS Ubuntu18.04EC2インスタンスで1つのマスターと2つのノードを持つKubernetesクラスターを作成するのに役立ちます。
何をしますか?
- ノードアフィニティの構成
まず、クラスターで使用可能なノードのリストを取得しましょう。
kubectl get nodes #Get all the nodes in the cluster
ノードに汚染があるかどうかを確認します。
kubectl describe node node01 | grep Taints #Describe the node node01 and grep Taints
kubectl describe node master | grep Taints #Describe the node master and grep Taints
ワーカーノードnode01にラベルを追加します。
kubectl label node node01 app=qa #Add a label
デプロイ定義ファイルを作成し、その中に次の定義を追加します。
vim my-deployment-without-affinity.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-without-affinity
spec:
replicas: 20
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ポッドとデプロイメントのリストを取得します。
kubectl get pods #Get pods in the default namespace
kubectl get deployment #Get deployments in the default namespace
作成した定義からデプロイメントを作成します。
kubectl create -f my-deployment-without-affinity.yml #Create a deployment object
kubectl get deployment #Get deployments in the default namespace
kubectl get pods #Get pods in the default namespace
展開によって作成されたポッドの詳細を取得します。
ここでは、ポッドがマスターノードにも配置されていることがわかります。これは、ノードに汚染がないため、ポッドが使用可能なノードのいずれかに配置できるためです。
kubectl get pods -o wide #Get pods in the default namespace with more information about them using -o wide
次に、ノードアフィニティで定義されたデプロイメント定義を作成します。
vim my-deployment-with-affinity.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-with-afiinity
spec:
replicas: 6
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: app
operator: In
values:
- qa
上記の手順で作成したファイルを使用して、既存の導入のリストを取得し、アフィニティを使用して新しい導入を作成します。
kubectl get deployments #Get deployments in the default namespace
kubectl create -f my-deployment-with-affinity.yml #Create a deployment object
kubectl get deployments #Get deployments in the default namespace
これで、今回のポッドはワーカーノードnode01にのみ配置されたことがわかります。これは、デプロイメント定義でノードアフィニティを定義し、定義された条件/ラベルに一致するノードにポッドが確実にデプロイされるようにするためです。
kubectl get pods -o wide | grep app-with-afiinity #Get pods in the default namespace with more information about them using -o wide and grep app-with-afiinity
この記事では、ノードにラベルを追加する方法を学び、ノードアフィニティを使用して必要なノードでスケジュールされるようにポッドを制限する方法を確認しました。また、汚染がない場合でも、ポッドをマスターノードにデプロイできることもわかりました。