kubespary를 통해 kubernetes가 구축된 환경에서 work node를 제거할 때, reset.yml과 kubectl delete node의 차이는 무엇일까?
우선, reset.yml을 파해쳐보자.
$ cat reset.yml
---
- name: Check ansible version
import_playbook: ansible_version.yml
- name: Ensure compatibility with old groups
import_playbook: legacy_groups.yml
- name: Install bastion ssh config
hosts: bastion[0]
gather_facts: False
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults}
- { role: bastion-ssh-config, tags: ["localhost", "bastion"]}
- name: Gather facts
import_playbook: facts.yml
- name: Reset cluster
hosts: etcd:k8s_cluster:calico_rr
gather_facts: False
pre_tasks:
- name: Reset Confirmation
pause:
prompt: "Are you sure you want to reset cluster state? Type 'yes' to reset your cluster."
register: reset_confirmation_prompt
run_once: True
when:
- not (skip_confirmation | default(false) | bool)
- reset_confirmation is not defined
- name: Check confirmation
fail:
msg: "Reset confirmation failed"
when:
- not reset_confirmation | default(false) | bool
- not reset_confirmation_prompt.user_input | default("") == "yes"
- name: Gather information about installed services
service_facts:
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults}
- { role: kubernetes/preinstall, when: "dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'", tags: resolvconf, dns_early: true }
- { role: reset, tags: reset }
reset.yml에서 Reset cluster를 보면 프롬프트에 yes가 들어가면 수행이 된다.
수행하는 role은 reset이라는 role을 참조하여 수행한다.
정확하게 뭘 수행하는지 알려면 아래 path로 들어가서 각기 yml파일을 확인하면된다.
kubespray/roles/reset/tasks
해당 yml파일을은 양이 많아 문서에 다 적기는 곤란하니, 내 스스로 줄여서 말을 해보면, reset이 수행하는 task는 cluster를 초기화하는 role로 daemon, container kubernets network 삭제 등 의 task가 존재하며 reset.yml은 k8s의 cluster 전체 초기화와 관련된 yml인것이며 일반적인 work node를 제거하는 것과는 맞지않는다.
reset.yml로 특정 work node를 제거해보면 어떻게될까?
limit으로 특정 node를 지정해서 확인해보았다.
ansible-playbook --extra-vars=@vars.yml \
-b kubespray/reset.yml --limit=bjdev-compute-02
....
TASK [network_plugin/calico : Reset | remove the network device created by calico] ***************************************************************************************************************************
Wednesday 05 March 2025 14:40:34 +0900 (0:00:01.189) 0:05:55.238 *******
skipping: [bjdev-compute-02]
TASK [network_plugin/calico : Reset | get and remove remaining routes set by bird] ***************************************************************************************************************************
Wednesday 05 March 2025 14:40:34 +0900 (0:00:00.048) 0:05:55.287 *******
ok: [bjdev-compute-02]
TASK [reset : Reset | Restart network] ***********************************************************************************************************************************************************************
Wednesday 05 March 2025 14:40:35 +0900 (0:00:01.202) 0:05:56.490 *******
changed: [bjdev-compute-02]
PLAY RECAP ***************************************************************************************************************************************************************************************************
bjdev-compute-02 : ok=145 changed=18 unreachable=0 failed=0 skipped=137 rescued=0 ignored=0
ansible-playbook은 정상적으로 수행완료되었다.
다만, kubernetes cluster를 확인해보면 아래와 같이 node가 제거된 내용은 보이지가 않는다.
$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
bjdev-compute-01 Ready <none> 17m v1.28.3
bjdev-compute-02 NotReady <none> 17m v1.28.3
bjdev-control-01 Ready control-plane 18m v1.28.3
왜냐, reset role에서는 delete node에 대한 tasks가 없다.
reset.yml을 보는동안 눈에 띈 remove_node.yml이라는게 보인다.
remove_node.yml은 뭘까?
Ref :: https://github.com/kubernetes-sigs/kubespray/blob/master/docs/operations/nodes.md
결과적으로보면,
remove_node와 reset role의 차이는 다음과 같다.
reset.yml
remove_node
로 차이가 있다.
그럼 remove_node로 동작 시키면 어떻게 될까?
$ ansible-playbook --extra-vars=@vars.yml \ -b kubespray/playbooks/remove_node.yml -e node=bjdev-compute-02
TASK [remove-node/post-remove : Remove-node | Delete node] ***************************************************************************************************************************************************
Wednesday 05 March 2025 15:31:19 +0900 (0:00:00.074) 0:03:18.295 *******
changed: [bjdev-compute-02 -> bjdev-control-01]
work node가 제거 된 것을 확인 할 수 있다.
$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
bjdev-compute-01 Ready <none> 66m v1.28.3
bjdev-control-01 Ready control-plane 67m v1.28.3
당연히 제거된 work node에서는 kubelet daemon도 사라져있다.
[user@bjdev-compute-02 ~]$ sudo systemctl status kubelet
Unit kubelet.service could not be found.
그럼 일반적인 kubectl delete node로 work node를 삭제하면 어떻게 될까?
$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
bjdev-compute-01 Ready <none> 82m v1.28.3
bjdev-compute-02 Ready <none> 2m36s v1.28.3
bjdev-control-01 Ready control-plane 83m v1.28.3
$ sudo kubectl delete node bjdev-compute-02
node "bjdev-compute-02" deleted
$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
bjdev-compute-01 Ready <none> 83m v1.28.3
bjdev-control-01 Ready control-plane 84m v1.28.3
[user@bjdev-compute-02 ~]$ sudo systemctl status kubelet
● kubelet.service - Kubernetes Kubelet Server
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2025-03-05 15:45:40 KST; 3min 44s ago
Docs: https://github.com/GoogleCloudPlatform/kubernetes
Main PID: 1578110 (kubelet)
Tasks: 15 (limit: 198992)
Memory: 51.6M
CGroup: /system.slice/kubelet.service
└─1578110 /usr/bin/kubelet --v=2 --node-ip=10.3.2.195 --hostname-override=bjdev-compute-02 --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --config=/etc/kubernetes/kubelet-config.y>
...
결론,
reset.yml 을 수행하면 kubectl delete node tasks가 없기에 kubectl get node로는 보이게되며, service에 대해서만 삭제가 된다.
remove_compute.yml을 수행하면 node 제거 및 service 제거가 된다. 다만 변수를 입력하지 않으면 control-01을 제외한 나머지 node는 모두 삭제된다.
kubectl delete node로 node를 삭제할 경우 cluster에서는 제외가 되지만, service(daemon 등)이 남는다.
즉, kubectl delete node 로 지울때와의 차이는 node drain 과정과 service 제거의 과정의 작업이 추가로 있을 뿐이다.