Я пытаюсь поэкспериментировать с кластером из 2 узлов (который будет увеличен после стабилизации) для mongodb. Это с использованием ЭКС. Два узла работают в двух разных зонах aws. Дескриптор выглядит следующим образом:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongod
labels:
name: mongo-repl
spec:
serviceName: mongodb-service
replicas: 2
selector:
matchLabels:
app: mongod
role: mongo
environment: test
template:
metadata:
labels:
app: mongod
role: mongo
environment: test
spec:
terminationGracePeriodSeconds: 15
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
- ap-south-1a
- ap-south-1b
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mongod
- key: role
operator: In
values:
- mongo
- key: environment
operator: In
values:
- test
topologyKey: kubernetes.io/hostname
containers:
.....
Цель здесь - НЕ планировать другой модуль на том же узле, где уже есть модуль с метками - app = mongod, role = mon go, environment = test is выполняя
Когда я развертываю spe c, на одном узле создается только 1 набор модулей mon go.
ubuntu@ip-192-170-0-18:~$ kubectl describe statefulset mongod
Name: mongod
Namespace: default
CreationTimestamp: Sun, 16 Feb 2020 16:44:16 +0000
Selector: app=mongod,environment=test,role=mongo
Labels: name=mongo-repl
Annotations: <none>
Replicas: 2 desired | 2 total
Update Strategy: OnDelete
Pods Status: 1 Running / 1 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=mongod
environment=test
role=mongo
Containers:
kubectl описывают pod mongod-1
Node: <none>
Labels: app=mongod
controller-revision-hash=mongod-66f7c87bbb
environment=test
role=mongo
statefulset.kubernetes.io/pod-name=mongod-1
Annotations: kubernetes.io/psp: eks.privileged
Status: Pending
....
....
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 42s (x14 over 20m) default-scheduler 0/2 nodes are available: 1 Insufficient pods, 1 node(s) didn't match pod affinity/anti-affinity, 1 node(s) didn't satisfy existing pods anti-affinity rules.
0/2 узла доступно: 1 Недостаточно модулей, 1 узел (-ы) не соответствуют сродству / анти-сродству к pod , 1 узел (ы) не удовлетворяет существующим правилам анти-аффинности pods.
Невозможно выяснить, что противоречит спецификациям аффинности. Я буду очень признателен за понимание!
Редактировать 21 февраля: добавлена информация о новой ошибке ниже
Основано на предложения, я теперь масштабировал рабочие узлы и начал получать более четкое сообщение об ошибке -
События: Тип Reason Age From Message ---- ------ ---- ---- ------- Предупреждение FailedScheduling 51s (x554 в течение 13 ч) доступны планировщики по умолчанию 0/2 узла: 1 узел (-ы) не соответствует сходству / анти-сходству модуля, 1 узел (-ы) не удовлетворяет существующие правила анти-сходства модулей, у 1-го узла был конфликт сродства с узлом тома.
Таким образом, основной проблемой сейчас (после увеличения рабочих узлов) является -
1 узел (ы) имел конфликт сродства узла тома
Повторная публикация ниже всех моих артефактов конфигурации:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongod
labels:
name: mongo-repl
spec:
serviceName: mongodb-service
replicas: 2
selector:
matchLabels:
app: mongod
role: mongo
environment: test
template:
metadata:
labels:
app: mongod
role: mongo
environment: test
spec:
terminationGracePeriodSeconds: 15
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
- ap-south-1a
- ap-south-1b
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mongod
- key: role
operator: In
values:
- mongo
- key: environment
operator: In
values:
- test
topologyKey: kubernetes.io/hostname
containers:
- name: mongod-container
.......
volumes:
- name: mongo-vol
persistentVolumeClaim:
claimName: mongo-pvc
PV C -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo-pvc
spec:
storageClassName: gp2-multi-az
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
PV -
apiVersion: "v1"
kind: "PersistentVolume"
metadata:
name: db-volume-0
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: gp2-multi-az
awsElasticBlockStore:
volumeID: vol-06f12b1d6c5c93903
fsType: ext4
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
#- key: topology.kubernetes.io/zone
operator: In
values:
- ap-south-1a
apiVersion: "v1"
kind: "PersistentVolume"
metadata:
name: db-volume-1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: gp2-multi-az
awsElasticBlockStore:
volumeID: vol-090ab264d4747f131
fsType: ext4
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
#- key: topology.kubernetes.io/zone
operator: In
values:
- ap-south-1b
Класс хранения -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gp2-multi-az
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
type: gp2
fsType: ext4
allowedTopologies:
- matchLabelExpressions:
- key: failure-domain.beta.kubernetes.io/zone
values:
- ap-south-1a
- ap-south-1b
Я не хочу выбирать динамические c PV C.
В соответствии с предложением @ rabello добавление следующих выводов -
kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
mongod-0 1/1 Running 0 14h app=mongod,controller-revision-hash=mongod-5b4699fd85,environment=test,role=mongo,statefulset.kubernetes.io/pod-name=mongod-0
mongod-1 0/1 Pending 0 14h app=mongod,controller-revision-hash=mongod-5b4699fd85,environment=test,role=mongo,statefulset.kubernetes.io/pod-name=mongod-1
kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
ip-192-170-0-8.ap-south-1.compute.internal Ready <none> 14h v1.14.7-eks-1861c5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=t3.small,beta.kubernetes.io/os=linux,eks.amazonaws.com/nodegroup-image=ami-07fd6cdebfd02ef6e,eks.amazonaws.com/nodegroup=trl_compact_prod_db_node_group,failure-domain.beta.kubernetes.io/region=ap-south-1,failure-domain.beta.kubernetes.io/zone=ap-south-1a,kubernetes.io/arch=amd64,kubernetes.io/hostname=ip-192-170-0-8.ap-south-1.compute.internal,kubernetes.io/os=linux
ip-192-170-80-14.ap-south-1.compute.internal Ready <none> 14h v1.14.7-eks-1861c5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=t3.small,beta.kubernetes.io/os=linux,eks.amazonaws.com/nodegroup-image=ami-07fd6cdebfd02ef6e,eks.amazonaws.com/nodegroup=trl_compact_prod_db_node_group,failure-domain.beta.kubernetes.io/region=ap-south-1,failure-domain.beta.kubernetes.io/zone=ap-south-1b,kubernetes.io/arch=amd64,kubernetes.io/hostname=ip-192-170-80-14.ap-south-1.compute.internal,kubernetes.io/os=linux