Приложение Kubernetes, работающее на мастере — DaemonSet

Есть ли способ избежать выполнения приложения, развернутого как DaemonSet на мастере?
Я видел, что это ожидаемое поведение, но я хотел бы каким-то образом избежать выполнения.

Обычные модули не планируются на мастере, но модули DaemonSet делают это.

Если да, можно ли установить эту информацию в файле yml (параметр..etc??)?

 kubectl create -f mydaemon.yml

logspri-4zwl4              1/1       Running           0          <invalid>   X.X.X.X   k8s-master-e7c355e2-0
logspri-kld2w              1/1       Running           0          <invalid>   X.X.X.X     k8s-agent-e7c355e2-0
logspri-lksrh              1/1       Running           0          <invalid>   X.X.X.X     k8s-agent-e7c355e2-1

Я бы не хотел, чтобы мой модуль работал на k8s-master-e7c355e2-0

Я пытался :

annotations:
          scheduler.alpha.kubernetes.io/affinity: >
            {
              "nodeAffinity": {
                "requiredDuringSchedulingRequiredDuringExecution": {
                  "nodeSelectorTerms": [
                    {
                      "matchExpressions": [
                        {
                          "key": "kubernetes.io/role",
                          "operator": "NotIn",
                          "values": ["master"]
                        }
                      ]
                    }
                  ]
                }
              }
            }

Попытка также применить следующую роль (как было предложено), но она не работает:

kubectl get nodes
NAME                    STATUS                     AGE       VERSION
k8s-agent-e7c355e2-0    Ready                      49d       v1.5.3
k8s-agent-e7c355e2-1    Ready                      49d       v1.5.3
k8s-master-e7c355e2-0   Ready,SchedulingDisabled   49d       v1.5.3

Выполню ли я:

VirtualBox:~/elk/logspout$ kubectl taint node k8s-master-e7c355e2-0 k8s-master-e7c355e2-0/ismaster=:NoSchedule
node "k8s-master-e7c355e2-0" tainted

Даже если кажется, что мастер испорчен, я вижу, что приложение всегда находится на мастере.

Role:           
Labels:         beta.kubernetes.io/arch=amd64
            beta.kubernetes.io/instance-type=Standard_D2
            beta.kubernetes.io/os=linux
            failure-domain.beta.kubernetes.io/region=northeurope
            failure-domain.beta.kubernetes.io/zone=0
            kubernetes.io/hostname=k8s-master-e7c355e2-0
Annotations:        volumes.kubernetes.io/controller-managed-attach-detach=true
Taints:         <none>
CreationTimestamp:  Wed, 17 May 2017 14:38:06 +0200
Phase:          
Conditions:

Что не так? Не могли бы вы дать мне правильную команду для выполнения?

та же проблема сообщается здесь без очевидного решения:

kubectl taint nodes nameofmaster dedicated=master:NoSchedule

Спасибо, Приско.


person Prisco    schedule 05.07.2017    source источник
comment
Вы также можете использовать nodeSelectors, но taints - лучшее решение, как предлагается в ответе. kubernetes.io/docs/concepts /рабочие нагрузки/контроллеры/daemonset/   -  person iamnat    schedule 05.07.2017


Ответы (2)


Из https://github.com/kubernetes/kubernetes/issues/29108 вы можно добавить флаг taint в ваш главный узел kubelet, поэтому даже модули в DaemonSet не запланированы там.

   --register-with-taints=node.alpha.kubernetes.io/ismaster=:NoSchedule

Вам нужно будет перезапустить kubelet в вашем узле

person Javier Salmeron    schedule 05.07.2017
comment
Ударь меня. ;) - person vjdhama; 05.07.2017
comment
Я использую Azure. Я должен проверить, как это сделать там. Я попробую. Спасибо - person Prisco; 05.07.2017

К Even if it seems that the master is tainted I see that the application is always on master. я не уверен, был ли DaemonSet создан до или после заражения.

Если вы сначала испортили, а затем создали DaemonSet, модуль должен быть отброшен зараженным узлом без дальнейшей настройки. В противном случае модуль из DaemonSet не будет автоматически завершен. Чтобы немедленно вытеснить существующие модули, требуется NoExecute taint.

Из здесь:

Обычно, если к узлу добавляется заражение с эффектом NoExecute, любые модули, которые не переносят заражение, будут немедленно вытеснены, а любые поды, которые допускают заражение, никогда не вытесняются. Однако допуск с эффектом NoExecute может указывать необязательное поле tolerationSeconds, определяющее, как долго модуль будет оставаться привязанным к узлу после добавления заражения.

person Eugene Chow    schedule 06.07.2017
comment
Набор демонов был создан после. Во всяком случае, если я выполняю команду для описания мастера узла, я вижу, что в строке TAINTS появляется NONE ... Верна ли команда, которую я ввел ранее? – - person Prisco; 06.07.2017
comment
Мой kubectl taint node <hostname> node-role.kubernetes.io/master=:NoExecute. IIRC, название заражения не имеет значения. У меня это работало OOTB без дополнительной настройки. Можете поделиться манифестом DaemonSet? - person Eugene Chow; 07.07.2017