Kubernetes — Как Добавить (Присоединить) Новый Рабочий Узел К Существующему Кластеру K8S Только С Выборочным Планированием

  • Автор темы GS Igor
  • Обновлено
  • 22, Oct 2024
  • #1

Дан рабочий кластер Kubernetes, состоящий из мастера и нескольких воркеров.

Нам нужно добавить узел для запуска очень специфического модуля и быть частью кластера по сетевым причинам. Затем мастер в значительной степени игнорирует его для последующего создания модуля.

Добавление селекторов в каждое развертывание, чтобы избежать этого узла, не может быть и речи.

Спасибо!

#kubernetes #kubeadm

GS Igor


Рег
19 Feb, 2010

Тем
61

Постов
191

Баллов
556
  • 25, Oct 2024
  • #2

Возможно вы ищете это особенность который закрывается без каких-либо действий, поскольку есть способы обойти эту проблему.

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..

 

Igor3


Рег
09 Nov, 2011

Тем
66

Постов
182

Баллов
532
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно