kubespary의 reset.yml과 kubectl delete node의 차이

beomjin·2025년 5월 28일

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

  • kubernetes 초기화 (서비스 및 모든 k8s 정보)

remove_node

  • 특정 node 제거
  • 특정 node의 service 제거 (reset role 수행)
  • k8s cluster로부터 node delete (roles/remove-node/post-remove)
  • -e 로 node를 지정하지 않으면, 1번째 control node를 제외한 나머지 node를 전부 delete
  • 특정 node의 대한 삭제로 제거 전 node drain을 수행 후 제거함

로 차이가 있다.
그럼 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 제거의 과정의 작업이 추가로 있을 뿐이다.

0개의 댓글