С Kubespray вы получаете мощь Ansible и Kubeadm для установки, настройки и обслуживания кластера Kubernetes. Он использует определенный файл инвентаризации для идентификации узлов, входящих в кластер, и для того, чтобы знать, какие роли должен играть узел. Он также предоставляет дополнительные конфигурационные файлы, которые позволяют точно настроить параметры кластера Kubernetes и различные компоненты кластера. В нашей недавней статье мы рассказали о процессе обновления кластера Kubespray Kubernetes до более новой версии.

Используя возможности Kubespray, достаточно просто запустить игровой блокнот ansible, и желаемое состояние будет отображено на целевых серверах. В этой статье мы покажем вам, как добавить новый узел в кластер Kubernetes с помощью Kubespray. Для начала отредактируйте файл инвентаризации и добавьте новый узел (узлы), который вы хотите настроить для использования в кластере Kubernetes.

cd kubespray

Откройте файл инвентаризации для редактирования

$ vim inventory/k8scluster/inventory.ini
# ## Configure 'ip' variable to bind kubernetes services on a
# ## different ip than the default iface
# ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.
[all]
master01 ansible_host=192.168.1.10 etcd_member_name=etcd1   ansible_user=core
master02 ansible_host=192.168.1.11 etcd_member_name=etcd2   ansible_user=core
master03 ansible_host=192.168.1.12 etcd_member_name=etcd3   ansible_user=core
node01   ansible_host=192.168.1.13 etcd_member_name=        ansible_user=core
node02   ansible_host=192.168.1.14 etcd_member_name=        ansible_user=core
node03   ansible_host=192.168.1.15 etcd_member_name=        ansible_user=core
node04   ansible_host=192.168.1.16 etcd_member_name=        ansible_user=core
node05   ansible_host=192.168.1.17 etcd_member_name=        ansible_user=core
node06   ansible_host=192.168.1.18 etcd_member_name=        ansible_user=core

# ## configure a bastion host if your nodes are not directly reachable
# [bastion]
# bastion ansible_host=x.x.x.x ansible_user=some_user

[kube_control_plane]
master01
master02
master03

[etcd]
master01
master02
master03

[kube_node]
node01
node02
node03
node04
node05
node06

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

Добавим новый узел Node07

# ## Configure 'ip' variable to bind kubernetes services on a
# ## different ip than the default iface
# ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value.
[all]
master01 ansible_host=192.168.1.10 etcd_member_name=etcd1   ansible_user=core
master02 ansible_host=192.168.1.11 etcd_member_name=etcd2   ansible_user=core
master03 ansible_host=192.168.1.12 etcd_member_name=etcd3   ansible_user=core
node01   ansible_host=192.168.1.13 etcd_member_name=        ansible_user=core
node02   ansible_host=192.168.1.14 etcd_member_name=        ansible_user=core
node03   ansible_host=192.168.1.15 etcd_member_name=        ansible_user=core
node04   ansible_host=192.168.1.16 etcd_member_name=        ansible_user=core
node05   ansible_host=192.168.1.17 etcd_member_name=        ansible_user=core
node06   ansible_host=192.168.1.18 etcd_member_name=        ansible_user=core
node07   ansible_host=192.168.1.19 etcd_member_name=        ansible_user=core


# ## configure a bastion host if your nodes are not directly reachable
# [bastion]
# bastion ansible_host=x.x.x.x ansible_user=some_user

[kube_control_plane]
master01
master02
master03

[etcd]
master01
master02
master03

[kube_node]
node01
node02
node03
node04
node05
node06
node07

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

Вы видите, что мы добавляем обычный рабочий узел для запуска контейнерных рабочих нагрузок. Он размещается под kube_node группе. При добавлении главного узла он должен находиться внутри kube_control_plane, затем используйте playbook cluster.yml , а не scale.yml.

После этого мы можем использовать плейбук Ansible под названием scale.yml и ограничить выполнение только новым узлом, который мы добавляем.

Но прежде чем использовать --limit нам нужно запустить плейбук facts.yml без ограничения, чтобы обновить кэш фактов для всех узлов.

ansible-playbook -i inventory/k8scluster/inventory.ini  --become --become-user=root playbooks/facts.yml

Ожидаемый результат:

факты kubespray

После этого мы можем использовать плейбук Ansible под названием scale.yml и ограничить выполнение только новым узлом, который мы добавляем.

ansible-playbook -i inventory/k8scluster/inventory.ini  --become --become-user=root scale.yml --limit=node07

Если ОС вашего рабочего узла основана на CoreOS, например Flatcar Container Linux, укажите путь к Python в переменной окружения.

ansible-playbook -e 'ansible_python_interpreter=/opt/bin/python' -i inventory/k8scluster/inventory.ini  --become --become-user=root scale.yml --limit=node07

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

[all]
....
node07   ansible_host=192.168.1.19 etcd_member_name=        ansible_user=core
node08   ansible_host=192.168.1.20 etcd_member_name=        ansible_user=core

[kube_node]
....
node07
node08

[new_nodes]
node07
node08

# Then limit execution to new_nodes
$ ansible-playbook -i inventory/k8scluster/inventory.ini  --become --become-user=root scale.yml --limit=new_nodes

Следите за выводом результатов выполнения финальных задач.

Перечислите узлы в кластере Kubernetes, чтобы убедиться, что новый узел был добавлен.

$ kubectl get nodes
NAME       STATUS   ROLES           AGE    VERSION
master01   Ready    control-plane   237d   v1.29.2
master02   Ready    control-plane   237d   v1.29.2
master03   Ready    control-plane   230d   v1.29.2
node01     Ready    <none>          237d   v1.29.2
node02     Ready    <none>          237d   v1.29.2
node03     Ready    <none>          237d   v1.29.2
node04     Ready    <none>          230d   v1.29.2
node05     Ready    <none>          230d   v1.29.2
node06     Ready    <none>          14d    v1.29.2
node07     Ready    <none>          23m    v1.29.2

Мы можем подтвердить SSH в экземпляр.

$ ssh [email protected]
Warning: Permanently added '192.168.1.19' (ED25519) to the list of known hosts.
Enter passphrase for key '/Users/jkmutai/.ssh/id_rsa':
Flatcar Container Linux by Kinvolk stable xxxxyy
core@node07 ~ $

Вы можете перечислить все поды, запущенные на узле, с помощью следующих команд:

$ kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=node07
NAMESPACE        NAME                                 READY   STATUS            RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
kube-system      calico-node-24z2l                    1/1     Running           0          26m   192.168.1.19    node07   <none>           <none>
kube-system      kube-proxy-pghkm                     1/1     Running           0          26m   192.168.1.19    node07   <none>           <none>
kube-system      nodelocaldns-dsxkf                   1/1     Running           0          26m   192.168.1.19    node07   <none>           <none>
metallb-system   speaker-gk6ll                        1/1     Running           0          24m   192.168.1.19    node07   <none>           <none>
monitoring       node-exporter-gj6gh                  2/2     Running           0          26m   192.168.1.19    node07   <none>           <none>
rook-ceph        csi-cephfsplugin-zq664               2/2     Running           0          24m   192.168.1.19    node07   <none>           <none>
rook-ceph        csi-rbdplugin-wll2x                  2/2     Running           0          24m   192.168.1.19    node07   <none>           <none>
rook-ceph        rook-ceph-osd-prepare-node07-spm2q   0/1     PodInitializing   0          24m   10.233.87.129   node07   <none>           <none>

Вот и все. В этой статье вы смогли добавить новый узел в существующий кластер Kubernetes с помощью Kubespray. Мы смогли подтвердить статус узла, чтобы он был Ready, и смог увидеть результаты работы некоторых уже запущенных узлов.