컨테이너 런타임 교체과정 정리
Docker + cri-dockerd 환경에서 containerd로 전환
초기 홈랩 Kubernetes 클러스터는 containerd가 아닌 Docker Engine + cri-dockerd 조합으로 구축했는데, 이는 단순히 개인적인 취향 때문이 아니라, 당시 회사에서 요구되는 PoC 환경을 재현해야 했기 때문이다.
당시 개발자들은 Docker CLI 중심의 개발·배포 워크플로우에 익숙한 상황이었고, PoC를 위해 워커 노드를 클러스터에서 분리해 단독 Docker 서버로 시연해야 하는 상황도 자주 발생했다. 이런 요구사항을 모두 충족하기 위해 결국 런타임으로 cri-dockerd를 채택하는 것이 최선이었다.
하지만 지금은 홈랩을 오롯이 내 학습·실험 환경으로만 운영하게 되었고, 새로운 노드를 확장하면서 기존 런타임을 유지할 필요도 사라졌다. 이에 따라 Kubernetes 권장 구성인 containerd 단독 런타임으로 모든 노드를 재정비하기로 결정했다.
이번 글에서는 그 전환 과정에서 실제로 발생한 문제들과 어떻게 해결했는지를 정리해보려 한다.
1. 기존 환경
- Kubernetes 1.28
- Docker Engine + cri-dockerd
- Ubuntu 22.04
전환 목표:
- Docker Engine 및 cri-dockerd 제거 → containerd 단독 런타임으로 통일
2. 전환 절차 요약
- 노드 drain
- cri-dockerd & Docker 중지 및 제거
- containerd 설치 및 설정
- kubelet 설정 변경 및 재시작
- 노드 상태 확인
2.1 노드 drain
해당 노드로 새로운 Pod가 배치되지 않도록 설정
1
kubectl cordon <node-name>
노드 drain: 노드에 배포된 Pod를 다른 노드로 이동
1
2
3
kubectl drain <node-name> \
--ignore-daemonsets \
--delete-emptydir-data
ignore-daemonsets: DaemonSet은 그대로 두고 이동delete-emptydir-data: emptyDir 볼륨 제거
2.2 cri-dockerd & Docker 제거
cri-dockerd 중지
1
2
sudo systemctl stop cri-docker.service
sudo systemctl stop cri-docker.socket
cri-dockerd 제거
설치 방식에 따라 제거
(A) dpkg 설치:
1
sudo apt remove -y cri-dockerd
(B) tar 설치:
1
2
3
sudo rm -f /usr/local/bin/cri-dockerd # 경우에 따라 /usr/bin에 설치했을 수 있음
sudo rm -f /etc/systemd/system/cri-docker.service
sudo rm -f /etc/systemd/system/cri-docker.socket
Docker Enging 중지
1
2
sudo systemctl stop docker.service
sudo systemctl stop docker.socket
Docker Engine 제거
1
sudo apt remove -y docker-*
2.3 containerd 설치 및 설정
containerd 설치
1
sudo apt update && sudo apt install -y containerd
설치 후 containerd 기본 설정 생성
1
2
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
containerd 설정 수정
cgroup을 systemd로 설정 → Kubernetes 1.25+ 에서 필수
1
2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
containerd 재시작
1
2
sudo systemctl restart containerd
sudo systemctl enable containerd
확인:
1
sudo systemctl status containerd
2.4 kubelet 설정 변경 및 재시작
kubelet 설정 변경
기존 kubelet이 cri-dockerd를 바라보고 있던 설정을 containerd로 변경 kubeadm 사용 시 두 파일 중 하나에 설정이 있음:
/var/lib/kubelet/kubeadm-flags.env/etc/default/kubelet
기존 값:
1
--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock
변경 값:
1
--container-runtime-endpoint=unix:///run/containerd/containerd.sock
kubelet 재시작
1
2
sudo systemctl daemon-reload
sudo systemctl restart kubelet
2.5 노드 상태 확인
노드 상태 확인
런타임 확인
1
sudo crictl info
여기서 runtime-endpoint가 다음으로 표시되면 성공
1
"runtimeEndpoint": "unix:///run/containerd/containerd.sock"
노드 상태 확인
1
kubectl get nodes
노드 status가 Ready인지 확인
해당 노드로 새로운 Pod가 배치되도록 설정
1
kubectl uncordon <node-name>
📌 Pod 재생성 관련
대부분의 Pod는 새로운 런타임을 기반으로 자동으로 재시작(DaemonSet, Deployments) 되지만, Static Pod 또는 수동으로 띄운 Pod가 있다면 재배포 필요