Возможно вы ищете это особенность который закрывается без каких-либо действий, поскольку есть способы обойти эту проблему.
kubeadm уже позволяет устанавливать ограничения для присоединяющегося узла, используя файл конфигурации во время соединения (проверь мой другой отвечать подробнее о том, как это сделать)
Еще один способ добиться этого — запустить join как обычно, но после присоединения выполнить несколько дополнительных шагов, как показано ниже.
1) После успешного присоединения Принудительно осушить новый узел чтобы убедиться, что он удаляет нежелательный модуль, который мог масштабироваться до него после операции соединения.
$ kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-npmz5 1/1 Running 0 3m46s 192.168.85.193 k8s-node01 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27m <none>
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
daemonset.apps/nginx 1 1 1 1 1 <none> 3m46s nginx nginx app=nginx
2) Команда дренажа автоматически оцепит покинуть узел. (Примечание: также рассмотрите специальную обработку для удаления любого демонсета который мог бы масштабироваться до этого узла после присоединения)
3) Сейчас Испортить новый узел по мере необходимости а затем разкордон это
4) Добавить селектор узлов плюс толерантность к модулям вы хотите, чтобы вас запланировали на этом новом узле.
Журналы вышеуказанных шагов для справки приведены ниже.
В приведенном ниже примере я присоединился к новому узлу-02 и предполагаю, что некоторые модули были масштабированы в существующем развертывании, поэтому новый узел использовался сразу же при присоединении, поэтому перед добавлением нам необходимо выполнить действие по сливу, а затем испортить узел, поэтому в дальнейшем планирование невозможно. сделано, если модуль не имеет толерантности к добавленному заражению
Узлы перед сливом или загрязнением
$ kubectl describe node k8s-node02 | grep -i Taint
Taints: specialnode2.kubernetes.io/SpecialNode2:NoSchedule
Сливной узел
apiVersion: kubeadm.k8s.io/v1beta1
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: "<control_plain_ip>:6443"
token: "your_token"
caCertHashes:
- sha256:$CERT_HASH
nodeRegistration:
taints:
- effect: NoSchedule
key: specialnode2.kubernetes.io/SpecialNode2
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 25m v1.17.2
k8s-node01 Ready <none> 15m v1.17.2
k8s-node02 Ready <none> 22s v1.17.2
Испортить новый узел
ubuntu@k8s-master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 24m v1.17.2
k8s-node01 Ready <none> 14m v1.17.2
ubuntu@k8s-master:~$ kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-npmz5 1/1 Running 0 50s 192.168.85.193 k8s-node01 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24m <none>
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
daemonset.apps/nginx 1 1 1 1 1 <none> 50s nginx nginx app=nginx
Теперь мы готовы отсоединить узел, больше никакие модули не смогут использовать этот noe, если они не добавят терпимости к новой порче..
$ kubectl describe node k8s-node01 | grep -i Taint
Taints: specialnode1.kubernetes.io/SpecialNode1:NoSchedule
Мы тестируем путем масштабирования развертывания, и на node02 ничего не нужно добавлять.
ubuntu@k8s-master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 18m v1.17.2
k8s-node01 Ready <none> 8m11s v1.17.2
||answer||
kubeadm уже позволяет устанавливать ограничения для присоединяющегося узла, используя файл конфигурации во время соединения..
Шаги о том, как это сделать во время присоединения к узлу, приведены ниже.
Построить Файл Config.yaml со сведениями о повреждении и сведениями о начальной загрузке. как получено от мастера во время инициализации kubeadm.
Пример config.yaml вам следует обновить значения в соответствии с информацией о вашем кластере, приведенной ниже.
root@k8s-node01:# kubeadm join --config=config.yaml
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Передайте эту конфигурацию с узла, к которому вы хотите присоединиться. он присоединится с установленной при запуске taint.
apiVersion: kubeadm.k8s.io/v1beta1
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: "<control_plain_ip>:6443"
token: "your_token"
caCertHashes:
- sha256:$CERT_HASH
nodeRegistration:
taints:
- effect: NoSchedule
key: specialnode1.kubernetes.io/SpecialNode1
Узел должен присоединиться к кластеру, и во время запуска он будет иметь порчу, поэтому модули, не имеющие допуска, не будут запланированы на этом новом узле..
$ kubectl scale deployment --replicas=3 nginx
deployment.apps/nginx scaled
$ kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-86c57db685-vm8ql 1/1 Running 0 3m30s 192.168.182.75 k8s-node01-calico <none> <none>
pod/nginx-86c57db685-xnh6q 1/1 Running 0 10m 192.168.182.78 k8s-node01-calico <none> <none>
pod/nginx-86c57db685-zh2sj 1/1 Running 0 8m19s 192.168.182.76 k8s-node01-calico <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/nginx 3/3 3 3 10m nginx nginx app=nginx
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-86c57db685 3 3 3 10m nginx nginx app=nginx,pod-template-hash=86c57db685
Проверьте наличие загрязнения, как показано ниже.
$ kubectl uncordon k8s-node02-calico
node/k8s-node02-calico uncordoned
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-calico Ready master 2d v1.17.2
k8s-node01-calico Ready <none> 2d v1.17.2
k8s-node02-calico Ready <none> 2d v1.17.2
Для дальнейшего тестирования мы создадим набор демонов, который будет работать на узле 01, и добавим еще один узел 02 с новым пятном. Набор демонов не должен автоматически масштабироваться до нового узла с новым пятном..
$ kubectl taint node k8s-node02-calico newnode=nobodyallowed:NoSchedule
node/k8s-node02-calico tainted
Добавьте новый узел с новым файлом config.yaml и убедитесь, что узел готов и на новом узле, добавленном в кластер, установлено ограничение.
$ kubectl drain k8s-node02-calico
node/k8s-node02-calico cordoned
evicting pod "nginx-86c57db685-8cdkx"
pod/nginx-86c57db685-8cdkx evicted
node/k8s-node02-calico evicted
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-calico Ready master 2d v1.17.2
k8s-node01-calico Ready <none> 2d v1.17.2
k8s-node02-calico Ready,SchedulingDisabled <none> 2d v1.17.2
Обратите внимание на новую порчу на node02.
$ kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-86c57db685-8cdkx 1/1 Running 0 27s 192.168.58.120 k8s-node02-calico <none> <none>
pod/nginx-86c57db685-xnh6q 1/1 Running 0 65s 192.168.182.78 k8s-node01-calico <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/nginx 2/2 2 2 65s nginx nginx app=nginx
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-86c57db685 2 2 2 65s nginx nginx app=nginx,pod-template-hash=86c57db685
Теперь проверьте, масштабируется ли набор демонов до нового узла или нет. Этого не произойдет, если мы не удалим порчу или не добавим толерантности к набору демонов.
kubectl drain <node name> --force
Таким образом, мы можем использовать описанные выше шаги, чтобы добавить новый узел в работающий кластер и выбрать, что запланировано на нем, с помощью taints..