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: {}
エラー「ボリュームノードアフィニティ競合」は、ポッドが使用している永続ボリュームが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
このエラーを引き起こす可能性のあるものがいくつかあります。
ノードに適切なラベルが付けられていません。 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など)を使用するとすぐに動作します。
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]
ここで説明されているほぼ同じ問題... https://github.com/kubernetes/kubernetes/issues/6162
「ローカルボリュームを使用していて、ノードがクラッシュした場合、ポッドを別のノードに再スケジュールすることはできません。同じノードにスケジュールする必要があります。ローカルストレージを使用することの注意点です。ノード。"
"1 node(s)has volume node affinity conflict"エラーは、PersistentVolumeのpersistenvolume.spec.nodeAffinity
フィールドに適合するノードにポッドをスケジュールできないため、スケジューラーによって作成されます(PV)。
つまり、PVで、このPVを使用するポッドはkubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu = master
のラベルを持つノードにスケジュールする必要があると言いますが、これは何らかの理由で不可能です。
ポッドをそのようなノードにスケジュールできない理由はさまざまです。
原因の検索を開始する場所は、ノードとポッドの定義です。