Я использую кластер Kubernetes в EKS, но по какой-то причине не всегда используется атрибут nodeSelector в развертывании.
Три развертывания: 1 - Cassandra:
kind: StatefulSet
metadata:
name: cassandra
labels:
app: cassandra
spec:
serviceName: cassandra
replicas: 3
...
spec:
terminationGracePeriodSeconds: 1800
containers:
- name: cassandra
image: gcr.io/google-samples/cassandra:v13
...
nodeSelector:
layer: "backend"
2 - Кафка
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
service: kafka
...
spec:
containers:
image: strimzi/kafka:0.11.3-kafka-2.1.0
...
nodeSelector:
layer: "backend"
...
3 - Zookeeper
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
service: zookeeper
...
spec:
containers:
image: strimzi/kafka:0.11.3-kafka-2.1.0
...
nodeSelector:
layer: "backend"
...
Примечание - все три имеют параметр nodeSelector "layer = backend" в контейнере spe c. У меня есть только 2 "серверных" модуля, однако, когда я смотрю на них, я вижу:
% kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/cassandra-0 1/1 Running 0 9m32s 10.1.150.39 ip-...-27.us-west-2.compute.internal <none> <none>
pod/cassandra-1 1/1 Running 0 7m56s 10.1.100.7 ip-...-252.us-west-2.compute.internal <none> <none>
pod/cassandra-2 1/1 Running 0 6m46s 10.1.150.254 ip-...-27.us-west-2.compute.internal <none> <none>
pod/kafka-56dcd8665d-hfvz4 1/1 Running 0 9m32s 10.1.100.247 ip-...-252.us-west-2.compute.internal <none> <none>
pod/zookeeper-7f74f96f56-xwjjt 1/1 Running 0 9m32s 10.1.100.128 ip-...-154.us-west-2.compute.internal <none> <none>
Они размещены на трех разных узлах - 27, 252 и 154. Просмотр метки "layer" на каждом из них:
> kubectl describe node ip-...-27.us-west-2.compute.internal | grep layer
layer=backend
> kubectl describe node ip-...-252.us-west-2.compute.internal | grep layer
layer=backend
> kubectl describe node ip-...-154.us-west-2.compute.internal | grep layer
layer=perf
Узел 154 имеет метку «perf», а не «backend». Таким образом, согласно моему пониманию nodeSelector, модуль zookeeper не должен был быть помещен туда. Я удалил все (включая сами узлы) и попробовал несколько раз - иногда туда помещается kafka, иногда zookeeper, но надежно что-то помещается туда, куда не следует.
Насколько я могу скажем, у узлов, которые я действительно хочу, достаточно места, и даже если бы их не было, я бы ожидал ошибку, что модуль не может быть запланирован, вместо того, чтобы игнорировать nodeSelector.
Чего мне не хватает? Является ли nodeSelector надежным на 100%? Есть ли другой способ, которым я могу заставить блоки размещаться только на узлах с указанными c метками?