Rancher 관리 클러스터에서 Deployment 가 실제 컨테이너가 되기까지의 순서(API 접수 → 컨트롤러 → 스케줄링 → 볼륨 → 이미지 pull → 샌드박스 → 컨테이너)와, Cloudera ECS(Embedded Container Service) 노드에 rancher, rke2, k3s 디렉터리가 함께 보이는 이유를 정리했다.
Rancher 는 관리 평면일 뿐 스케줄링에 관여하지 않는다. UI 의 Deploy 는 브라우저 → Rancher server → 터널 → 다운스트림 kube-apiserver 로 프록시될 뿐이고 이후는 순수 쿠버네티스 동작이다. 모든 컴포넌트는 apiserver 의 watch 를 구독해 spec 과 status 의 차이를 메우는 조정 루프로 움직인다.
rancher-webhook 포함) → etcd 저장. 이 시점에는 Pod 객체가 없다.nodeName 이 빈 Pending 파드를 만든다.NodeResourcesFit 은 requests 만 본다, TaintToleration, VolumeBinding 등) → Scoring(ImageLocality 는 이미지를 이미 가진 노드에 가산점) → Binding 으로 nodeName 을 채운다. 실패하면 FailedScheduling 이벤트가 남는다.syncPod 가 cgroup 생성 → 볼륨 준비 → 이미지 pull → 샌드박스(pause 컨테이너, CNI ADD) → init 컨테이너 → 앱 컨테이너 순으로 진행한다. 여기가 ContainerCreating 구간이다.PVC 는 volumeBindingMode: WaitForFirstConsumer 가 권장이며 CSI 는 CreateVolume → ControllerPublishVolume → NodeStageVolume(globalmount) → NodePublishVolume(/var/lib/kubelet/pods/<uid>/volumes/...) 순으로 호출된다. Longhorn 은 NodeStageVolume 시점에 iSCSI 세션이 붙는다. emptyDir 은 /var/lib/kubelet/pods/<uid>/volumes/kubernetes.io~empty-dir/ 에 생기고 medium: Memory 면 메모리 limit 에 포함된다. 컨테이너 쓰기 레이어는 overlayfs upperdir 이며 ephemeral-storage limit 초과 시 축출된다.
imagePullPolicy 는 태그가 :latest 거나 생략되면 Always 가 된다. manifest list 에서 플랫폼에 맞는 manifest 를 고른 뒤 레이어를 병렬로 받고 chainID 가 같은 레이어는 재사용한다. kubelet 의 serializeImagePulls(기본 true) 는 노드 단위로 순차 pull 하므로 대규모 롤아웃에서 maxParallelImagePulls 와 함께 튜닝 대상이다. 실패는 ErrImagePull → ImagePullBackOff(최대 5분 간격) 로 이어진다.
| 단계 | 상태 | 확인 |
|---|---|---|
| 스케줄링 | Pending + FailedScheduling |
kubectl describe pod |
| 볼륨 attach | FailedAttachVolume |
kubectl get volumeattachment |
| 볼륨 mount | FailedMount |
노드 journalctl -u kubelet |
| 이미지 | ErrImagePull |
crictl pull <image> 로 재현 |
| 설정 | CreateContainerConfigError |
없는 ConfigMap·Secret 참조 |
| 네트워크 | ContainerCreating 지속 |
CNI 파드 로그 |
| 실행 | CrashLoopBackOff |
kubectl logs --previous |
ECS 는 Cloudera Manager 가 parcel 로 쿠버네티스를 배포·관리하는 방식이며 내부 쿠버네티스가 Rancher 의 RKE2 다. 디렉터리 이름의 rancher 는 제조사 네임스페이스(/etc/rancher, /var/lib/rancher)이고, 실제 Rancher Server 도 cattle-system 네임스페이스에 파드로 떠 ECS Web UI 를 제공한다. RKE2 는 K3s 의 supervisor 엔진을 임베드해 만들어졌기 때문에 containerd 소켓이 /run/k3s/containerd/containerd.sock 에 남아 있다. ECS 에 K3s 클러스터가 따로 있는 것이 아니다.
/etc/rancher/rke2/config.yaml, rke2.yaml(admin kubeconfig)
/var/lib/rancher/rke2/bin/ kubectl, crictl, ctr, containerd, runc
/var/lib/rancher/rke2/agent/containerd/ 이미지 레이어 (디스크 소모 최대)
/var/lib/rancher/rke2/agent/pod-manifests/ static pod (etcd, apiserver, scheduler, cm)
/var/lib/rancher/rke2/server/db/etcd/ etcd 데이터
/run/k3s/containerd/containerd.sock CRI 소켓
/var/lib/longhorn/ Longhorn 블록 데이터
export PATH=$PATH:/var/lib/rancher/rke2/bin
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
export CONTAINER_RUNTIME_ENDPOINT=unix:///run/k3s/containerd/containerd.sock
kubectl get nodes
crictl ps -a; crictl images
ctr -a /run/k3s/containerd/containerd.sock -n k8s.io images ls
journalctl -u rke2-server -f # 서버 노드, 에이전트 노드는 rke2-agent
kubectl 은 ECS Server(컨트롤 플레인) 노드에서 실행해야 한다. Agent 전용 워커에는 API 서버가 없어 localhost:8080 connection refused 가 난다. KUBECONFIG 와 PATH 를 ~/.bashrc 에 넣어 두면 편하며 rke2.yaml 은 600 권한을 유지한다.
/var/lib/rancher 는 이미지·etcd·로그가 모두 쌓이므로 전용 볼륨으로 분리한다. rm -rf /var/lib/rancher/* 는 클러스터 완전 삭제다. Longhorn 노드 drain 시 csi-attacher, csi-provisioner, longhorn 웹훅 계열 파드는 --pod-selector 로 제외한다. RKE2 바이너리 버전은 Cloudera 가 parcel 로 고정하므로 임의 업그레이드하면 지원 대상에서 벗어난다.