С 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
Ожидаемый результат:
После этого мы можем использовать плейбук 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, и смог увидеть результаты работы некоторых уже запущенных узлов.