Kubernetes 클러스터 운영 중, 특정 노드에서 워크로드를 비우는 drain 작업은 자주 발생합니다. 그러나 때때로 중요한 Pod를 유지하면서 나머지 Pod만 이동시키고자 할 때가 있습니다. 예를 들어 rook-ceph와 같은 스토리지 관리 Pod들은 특별히 다루어야 할 경우가 많죠. 이번 글에서는 특정 Pod를 제외하고 노드를 drain하는 Bash 스크립트를 소개합니다.
1. Node Drain 개요
Kubernetes에서 kubectl drain 명령어는 특정 노드의 워크로드를 비워, 해당 노드의 점검 또는 업그레이드 작업을 가능하게 합니다. drain 과정에서는 노드의 Pod가 삭제되고, 다른 노드로 스케줄링됩니다. 일반적으로, DaemonSet과 같은 특정 리소스는 기본적으로 건드리지 않습니다.
하지만 특정 Pod를 제외하고 dain 작업을 하려면 추가적인 설정이 필요합니다. 이번 스크립트는 rook-ceph와 관련된 Pod는 유지하고 나머지 Pod만 이동시키는 방식으로 설정되어 있습니다.
2. 스크립트 설명
다음 스크립트는 지정한 노드에서 rook-ceph 관련 Pod를 제외한 나머지 Pod만 drain하는 기능을 합니다.
#!/bin/bash
# 노드 이름 입력 받기
read -p "Enter the node name to drain: " NODE
# Drain node, but exclude specific pods by label
kubectl get pods --all-namespaces --field-selector spec.nodeName=$NODE -o json | \\
jq '.items[] | select(.metadata.labels.app != "rook-ceph-osd" and .metadata.labels.app != "rook-ceph-crashcollector" and .metadata.labels.app != "rook-ceph-mon") | .metadata.name' | \\
xargs -I {} kubectl drain $NODE --ignore-daemonsets --pod-selector app!=rook-ceph-osd,app!=rook-ceph-crashcollector,app!=rook-ceph-mon --delete-emptydir-data=true
주요 구성 요소
- NODE 변수 설정: 스크립트가 시작되면, 사용자가 드레인할 노드의 이름을 입력합니다.
- Pod 필터링:
kubectl get pods명령어로 해당 노드의 모든 Pod를 가져온 후,jq명령어를 사용해rook-ceph와 관련된 Pod는 필터링하고 나머지만 선택합니다. - kubectl drain: 필터링된 Pod를 대상으로
kubectl drain명령어를 실행하여,rook-ceph와 관련된 Pod는 제외하고 나머지만 삭제됩니다.
3. 주요 옵션 설명
- kubectl drain 옵션:
-ignore-daemonsets: DaemonSet에 의해 관리되는 Pod는 제외하고 드레인 작업을 수행합니다.-pod-selector app!=rook-ceph-osd,app!=rook-ceph-crashcollector,app!=rook-ceph-mon:app라벨이rook-ceph관련 Pod가 아닌 경우에만 드레인합니다.-delete-emptydir-data=true:emptyDir볼륨이 포함된 Pod의 데이터를 삭제합니다.
4. 사용 방법
이 스크립트를 실행하면 다음과 같은 단계를 거치게 됩니다.
- 노드 이름 입력: 스크립트 실행 후 드레인할 노드 이름을 입력합니다.
- 특정 Pod 필터링: 해당 노드의 모든 Pod 중에서
rook-ceph관련 Pod를 제외하고 필터링합니다. - Drain 명령 실행: 필터링된 Pod에 대해 드레인 작업이 수행됩니다.
이제 이 스크립트를 사용하면 중요한 스토리지 또는 로그 관리 Pod는 남겨두고 나머지 워크로드만 이동시킬 수 있습니다.
5. 마무리
이 스크립트는 kubectl drain의 유연성을 높여주는 유용한 도구가 될 수 있습니다. 특히 스토리지 관련 Pod를 보호해야 하는 경우, 커스텀한 드레인이 필수적입니다. 클러스터 운영 시 이런 세부적인 관리 방안을 통해 안정성을 높일 수 있습니다.