web-dev-qa-db-ja.com

Kubernetesポッド警告:1つのノードにボリュームノードアフィニティの競合がありました

Kubernetesクラスターをセットアップしようとしています。 Persistent Volomue、Persistent Volume Claim、およびStorageクラスをすべてセットアップして実行していますが、展開からポッドを作成したい場合、ポッドは作成されますが、保留状態でハングします。説明した後、「1つのノードにボリュームノードのアフィニティの競合がありました」という警告のみが表示されます。ボリューム構成で不足しているものを誰かに教えてもらえますか?

apiVersion: v1
kind: PersistentVolume
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: mariadb-pv0
  name: mariadb-pv0
spec:
  volumeMode: Filesystem
  storageClassName: local-storage
  local:
    path: "/home/gtcontainer/applications/data/db/mariadb"
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    namespace: default
    name: mariadb-claim0
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu
            operator: In
            values:
            - master

status: {}
15
Krzysztof

エラー「ボリュームノードアフィニティ競合」は、ポッドが使用している永続ボリュームが1つのゾーンではなく異なるゾーンでスケジュールされているために発生します。別のゾーン。これを確認するには、すべての永続ボリュームの詳細を確認できます。それを確認するには、まずPVCを取得します。

$ kubectl get pvc -n <namespace>

次に、永続ボリュームの詳細を取得します(ボリュームクレームではありません)

$  kubectl get pv

あなたのPVCに対応するPVを見つけて説明してください

$  kubectl describe pv <pv1> <pv2>

各PVのSource.VolumeIDを確認できます。ほとんどの場合、それらは異なるアベイラビリティゾーンになるため、ポッドでアフィニティエラーが発生します。これを修正するには、単一のゾーンのstorageclassを作成し、PVCでそのstorageclassを使用します。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: region1storageclass
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  encrypted: "true" # if encryption required
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - eu-west-2b # this is the availability zone, will depend on your cloud provider
    # multi-az can be added, but that defeats the purpose in our scenario
17
Sownak Roy

このエラーを引き起こす可能性のあるものがいくつかあります。

  1. ノードに適切なラベルが付けられていません。 AWSでこの問題が発生したのは、ワーカーノードに適切なラベルがなかった場合(マスターが持っていた)

    failure-domain.beta.kubernetes.io/region=us-east-2

    failure-domain.beta.kubernetes.io/zone=us-east-2c

    ラベルでノードにパッチを適用した後、「1 node(s)has volume node affinity conflict」エラーがなくなったため、ポッド付きのPV、PVCが正常にデプロイされました。これらのラベルの価値はクラウドプロバイダー固有です。基本的に、これらのラベルを設定するのはクラウドプロバイダーの仕事です(キューブコントローラー、APIサーバー、kubeletで定義されたクラウドプロバイダーオプションを使用)。適切なラベルが設定されていない場合は、CloudProvider統合が正しいことを確認してください。私はkubeadmを使用したため、設定は面倒ですが、他のツール(kopsなど)を使用するとすぐに動作します。

  2. PV定義とnodeAffinityフィールドの使用法に基づいて、ローカルボリュームを使用しようとしています(こちらを参照してください ローカルボリュームの説明リンク、公式ドキュメント )。そのような(それは私の場合AWSで働いていました):

    nodeAffinity:

         required:
          nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - my-node  # it must be the name of your node(kubectl get nodes)
    

そのため、リソースを作成し、describeを実行すると、次のように表示されます。

         Required Terms:  
                    Term 0:  kubernetes.io/hostname in [your node name]
  1. StorageClass定義(ここではポストされていないlocal-storageという名前)は、ローカルストレージが正常に機能するためにvolumeBindingModeをWaitForFirstConsumerに設定して作成する必要があります。ここの例を参照してください ストレージクラスのローカル説明、公式ドキュメント その背後にある理由を理解してください。
4
Alex

ここで説明されているほぼ同じ問題... https://github.com/kubernetes/kubernetes/issues/6162

「ローカルボリュームを使用していて、ノードがクラッシュした場合、ポッドを別のノードに再スケジュールすることはできません。同じノードにスケジュールする必要があります。ローカルストレージを使用することの注意点です。ノード。"

0
jitendra

"1 node(s)has volume node affinity conflict"エラーは、PersistentVolumeのpersistenvolume.spec.nodeAffinityフィールドに適合するノードにポッドをスケジュールできないため、スケジューラーによって作成されます(PV)。

つまり、PVで、このPVを使用するポッドはkubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu = masterのラベルを持つノードにスケジュールする必要があると言いますが、これは何らかの理由で不可能です。

ポッドをそのようなノードにスケジュールできない理由はさまざまです。

  • ポッドには、ターゲットノードと競合するノードアフィニティ、ポッドアフィニティなどがあります。
  • ターゲットノードが汚染されています
  • ターゲットノードが「ノードあたりの最大ポッド」制限に達しました
  • 指定されたラベルを持つノードは存在しません

原因の検索を開始する場所は、ノードとポッドの定義です。

0
weibeld