Cloudera Private Cloud Data Services 의 ECS(RKE2 기반) 클러스터를 중지한 뒤 다시 올라오지 않거나, 설치를 지우고 처음부터 다시 하려는 경우다. CM 이 설치한 ECS 는 systemctl stop rke2-server 가 아니라 parcel 안의 스크립트로 관리하는데, /opt/cloudera/parcels/ECS/bin/rke2-killall.sh 가 없는 버전도 있어 수동 정리가 필요하다.
ps -ef | grep -E "k3s|rke2|containerd" | grep -v grep
/usr/local/bin/rke2-uninstall.sh 2>/dev/null || true
/usr/local/bin/k3s-uninstall.sh 2>/dev/null || true
# 남은 마운트를 깊은 경로부터 lazy umount
grep -E 'k3s|kubelet|containerd' /proc/mounts | awk '{print $2}' | sort -r | xargs -I {} umount -l {} 2>/dev/null
grep -E 'k3s|kubelet|containerd' /proc/mounts # 아무것도 안 나와야 한다
마운트가 남아 있으면 rm -rf /run/k3s/* 가 Device or resource busy 로 실패한다.
RHEL 8 에서 iptables -L 이 iptables-legacy tables present 경고를 내면 /sbin/iptables 가 nft 래퍼이고 legacy 규칙이 따로 남아 있는 것이다. nft 와 iptables-legacy 바이너리가 없으면 아래처럼 전 테이블을 비운다.
iptables -F; iptables -X; iptables -Z
iptables -t nat -F; iptables -t nat -X
iptables -t mangle -F; iptables -t mangle -X
iptables -P INPUT ACCEPT; iptables -P FORWARD ACCEPT; iptables -P OUTPUT ACCEPT
iptables-save | grep -iE "flannel|cali|KUBE" # 남은 규칙 확인
ip link delete flannel.1 2>/dev/null || true
ip link delete cni0 2>/dev/null || true
ip link delete tunl0 2>/dev/null || true
rm -rf /run/k3s/* /run/containerd/*
rm -rf /var/lib/kubelet /var/lib/rancher /etc/rancher
rm -rf /var/lib/longhorn
rm -rf /etc/cni /var/lib/cni /var/lib/calico
rm -rf /var/lib/docker /etc/docker # Docker 를 ECS 전용으로 썼을 때
rm -rf /opt/cloudera/parcels/ECS* /opt/cloudera/parcel-cache/ECS*
삭제 후 ls /var/lib/rancher · iptables -L -n -v · ip link | grep -E "flannel|cni" · ps aux | grep -E "k3s|rke2" 가 모두 비어 있으면 재설치할 수 있다.
| 항목 | 내용 |
|---|---|
fs.inotify.max_user_instances |
256 이상. /etc/sysctl.d/99-ecs.conf 에 fs.inotify.max_user_instances=256 후 sysctl --system |
| 시간대 | timedatectl set-timezone Asia/Seoul. VM 에서 set-local-rtc 0 이 hwclock failed 로 실패해도 무시해도 된다 |
| Docker data directory | Host Inspector 의 "Docker data directory is not defined" 는 ECS 역할 배정 후 다시 검사하면 사라진다 |
| DNS | 모든 노드의 정방향 · 역방향 조회가 되어야 한다. nslookup <host> 가 실패하면 /etc/hosts 가 아니라 DNS 서버(named)에 A · PTR 을 넣는다. *.apps.<ecs-host> 와일드카드도 필요하다 |
| VXLAN 포트 | 노드 간 UDP 8472(flannel) · 4789 가 열려야 한다 |
| kubectl | /etc/rancher/rke2/rke2.yaml 을 ~/.kube/config 로 복사하고 /var/lib/rancher/rke2/bin/kubectl 을 /usr/local/bin/kubectl 로 심볼릭 링크한다 |
nc -u 는 UDP 응답이 없어 판정이 어렵다. 양쪽에서 tcpdump 로 본다.
# 수신 노드
tcpdump -i any -nn udp port 8472 or udp port 4789
# 송신 노드
echo test | nc -u <target> 8472
송신 노드의 tcpdump 에는 패킷이 찍히는데 수신 노드에는 아무것도 없으면 중간(AWS 보안그룹 등)에서 막힌 것이다. 보안그룹 인바운드에 Custom UDP 8472 · 4789 를 노드 대역으로 연다. ICMP port unreachable 이 돌아오면 노드까지는 도달했지만 리스너가 없는 것이다.
kubectl get pods -A -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,CPU_REQ:.spec.containers[*].resources.requests.cpu,MEM_REQ:.spec.containers[*].resources.requests.memory,CPU_LIM:.spec.containers[*].resources.limits.cpu,MEM_LIM:.spec.containers[*].resources.limits.memory"
kubectl top pods -A
<none> 은 리소스 요청 · 제한이 없는 파드다.