GNU/Linux >> Linux の 問題 >  >> Linux

Kubernetesでノードアフィニティを使用する

ノードアフィニティは一連のルールです。これは、ポッドをクラスタ内のどこに配置できるかを決定するためにスケジューラによって使用されます。ルールは、ノードのラベルとポッド定義で指定されたラベルセレクターを使用して定義されます。ノードアフィニティを使用すると、ポッドは、スケジュール可能なノードのグループに対するアフィニティを指定できます。ポッドを制限して、特定のノードでのみ実行できるようにすることができます。

nodeSelectorは、ノード選択制約の最も単純な形式です。 nodeSelectorは、PodSpecのプロパティです。ポッドをノードで実行できるようにするには、ノードに指定された各ラベルが必要です。

ノードアフィニティは、概念的にはnodeSelectorに似ています。これにより、ノードのラベルに基づいて、ポッドがスケジュールできるノードを制限できます。

現在、ノードアフィニティには2つのタイプがあります。

  1. requiredDuringSchedulingIgnoredDuringExecutionおよび
  2. preferredDuringSchedulingIgnoredDuringExecution。

スケジュール中とは

  • ここでは、ポッドはまだ作成されておらず、初めて作成される予定です。
  • 通常、ポッドが作成されると、アフィニティルールが適用されます。

実行中とは

  • ここでは、ポッドが実行されており、nodeAffinityに影響する環境で変更が加えられています。

ノードアフィニティの詳細については、kubernete.ioのKubernetesの公式ドキュメントにアクセスしてください。

この記事では、Kubernetesクラスタで「requiredDuringSchedulingIgnoredDuringExecution」ノードアフィニティを使用して、Kubernetesポッドを特定のノードに割り当てる方法を説明します。

前提条件
  1. 少なくとも1つのワーカーノードを持つKubernetesクラスタ。
    Kubernetesクラスタの作成方法を学びたい場合は、ここをクリックしてください。このガイドは、AWS Ubuntu18.04EC2インスタンスで1つのマスターと2つのノードを持つKubernetesクラスターを作成するのに役立ちます。

何をしますか?

  1. ノードアフィニティの構成
ノードアフィニティの構成

まず、クラスターで使用可能なノードのリストを取得しましょう。

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

結論

この記事では、ノードにラベルを追加する方法を学び、ノードアフィニティを使用して必要なノードでスケジュールされるようにポッドを制限する方法を確認しました。また、汚染がない場合でも、ポッドをマスターノードにデプロイできることもわかりました。


Linux
  1. TerraformKubernetesプロバイダーの使用方法

  2. Jshintを機能させる方法は?

  3. Node.jsの競合:/ sbin/nodeと/usr/ bin / node?

  1. ApacheにPhp7.0(7.1ではない)を使用させる方法は?

  2. Kubernetesでポッドを再起動する方法[K8sのクイックヒント]

  3. Kubernetesでノードをドレインする方法

  1. Kubernetesのノードにラベルを追加または削除する方法

  2. 調査によると:267人の開発者がNode.jsをどのように使用しているか

  3. NVM を使用して複数の Node.js バージョンを使用する方法