Debian 13 trixie

Kubernetes : ノードを削除する2025/08/25

 

既存の Kubernetes クラスターからノードを削除する場合は以下のように設定します。

[1] Control Plane ノードを削除する場合のみ、事前に Etcd の削除やロードバランス設定の削除を実行します。
root@ctrl:~#
kubectl get nodes

NAME               STATUS   ROLES           AGE    VERSION
dlp-1.srv.world    Ready    control-plane   11m    v1.36.0
dlp.srv.world      Ready    control-plane   21h    v1.36.0
node01.srv.world   Ready    <none>          20h    v1.36.0
node02.srv.world   Ready    <none>          20h    v1.36.0
node03.srv.world   Ready    <none>          3m7s   v1.36.0

root@ctrl:~#
kubectl get pods -n kube-system | grep etcd

etcd-dlp-1.srv.world                      1/1     Running   0             11m
etcd-dlp.srv.world                        1/1     Running   1 (72m ago)   21h

# 例として [dlp-1.srv.world] を削除する
# 削除しない方の Control Plane で起動している Etcd へアクセスして
# 削除対象ノードの設定を削除する

root@ctrl:~# kubectl -n kube-system exec -it etcd-dlp.srv.world -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key member list 
2000d81d53d2d7c5, started, dlp-1.srv.world, https://10.0.0.31:2380, https://10.0.0.31:2379, false
dd4b95995dc266b1, started, dlp.srv.world, https://10.0.0.30:2380, https://10.0.0.30:2379, false

# remove a member which you like to delete
root@ctrl:~# kubectl -n kube-system exec -it etcd-dlp.srv.world -- etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key member remove 2000d81d53d2d7c5 
Member 2000d81d53d2d7c5 removed from cluster 63678238411c70a3

root@ctrl:~#
vi /etc/nginx/nginx.conf
# 対象ノードの設定を削除
stream {
    upstream k8s-api {
        server 10.0.0.30:6443;
        ###server 10.0.0.31:6443;
    }
    server {
        listen 6443;
        proxy_pass k8s-api;
    }
}

root@ctrl:~#
systemctl reload nginx
[2] ノードをクラスターから削除します。
以降は Control Plane / Worker 共に同じ手順です。
root@ctrl:~#
kubectl get nodes

NAME               STATUS   ROLES           AGE     VERSION
dlp-1.srv.world    Ready    control-plane   18m     v1.36.0
dlp.srv.world      Ready    control-plane   21h     v1.36.0
node01.srv.world   Ready    <none>          21h     v1.36.0
node02.srv.world   Ready    <none>          21h     v1.36.0
node03.srv.world   Ready    <none>          9m57s   v1.36.0

# 対象ノードを安全に削除するための事前準備
# --ignore-daemonsets ⇒ DeamonSet の Pod は無視
# --delete-emptydir-data ⇒ emptyDir ボリュームを持つ Pod は無視
# --force ⇒ 単体で作成された Pod も削除

root@ctrl:~#
kubectl drain dlp-1.srv.world --ignore-daemonsets --delete-emptydir-data --force

node/dlp-1.srv.world cordoned
Warning: ignoring DaemonSet-managed Pods: calico-system/calico-node-7sb9c, calico-system/csi-node-driver-5875w, kube-system/kube-proxy-bhdv8
node/dlp-1.srv.world drained

# 一定時間経過後に確認
# 時間は環境によって異なる

root@ctrl:~#
kubectl get nodes dlp-1.srv.world

NAME              STATUS                        ROLES           AGE   VERSION
dlp-1.srv.world   NotReady,SchedulingDisabled   control-plane   16m   v1.36.0

# 削除処理を実行

root@ctrl:~#
kubectl delete node dlp-1.srv.world

node "dlp-1.srv.world" deleted

root@ctrl:~#
kubectl get nodes

NAME               STATUS   ROLES           AGE     VERSION
dlp.srv.world      Ready    control-plane   3h30m   v1.36.0
node01.srv.world   Ready    <none>          3h23m   v1.36.0
node02.srv.world   Ready    <none>          3h21m   v1.36.0
node03.srv.world   Ready    <none>          8m34s   v1.36.0
[3] 削除したノードで、kubeadm の設定をリセットしておきます。
root@dlp-1:~#
kubeadm reset

[reset] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[reset] Use 'kubeadm init phase upload-config --config your-config-file' to re-upload it.
W0822 22:48:51.733080    6850 reset.go:137] [reset] Unable to fetch the kubeadm-config ConfigMap from cluster: failed to get node registration: failed to get corresponding node: nodes "dlp-1.srv.world" not found
W0822 22:48:51.733402    6850 preflight.go:56] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
W0822 22:48:52.972691    6850 removeetcdmember.go:106] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] Deleted contents of the etcd data directory: /var/lib/etcd
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of directories: [/etc/kubernetes/manifests /var/lib/kubelet /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/super-admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]

The reset process does not perform cleanup of CNI plugin configuration,
network filtering rules and kubeconfig files.

For information on how to perform this cleanup manually, please see:
    https://k8s.io/docs/reference/setup-tools/kubeadm/kubeadm-reset/
関連コンテンツ