Как я могу настроить таргетинг на динамическую метку с помощью podAntiAffinity?

#kubernetes

Вопрос:

Я бы хотел использовать podAntiAffinity, чтобы ограничить количество модулей, которые я запускаю на хосте с одной и той же версией кода.

В частности, я хотел бы запустить 1 модуль версии A и 1 модуль версии B. Это позволяет развертывать canary без создания большого количества новых узлов.

Я попытался установить свою подантиаффинность

         podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - podAffinityTerm:
                labelSelector:
                - matchExpressions:
                  - key: "k8s.git/commit-sha"
                    operator: In
                    values:
                    - valueFrom:
                        fieldRef:
                          fieldPath: "metadata.labels['k8s.git/commit-sha']"
                topologyKey: kubernetes.io/hostname
              weight: 100
 

Но, глядя на исходный код для k8s, он ожидал string , что вместо объекта будет map объект.

Есть ли другой способ добиться этого? Кто-нибудь реализовывал что-то подобное? Я запускаю Kubernetes 1.18.

Ответ №1:

У меня была эта мысль раньше, и я решил ее, используя метод, описанный здесь, сродство между стручками. Короче говоря, метод развертывается на узлах, на которых уже запущен модуль, соответствующий метке intend, которая в вашем случае является commit — sha.