K8S Container Runtime 전환 방법

Kubernetes 1.24 이후 버전에서 더이상 Docker를 컨테이너 런타임으로 지원하지 않는다. 그래서 containerd 또는 CRI-O와 같은 다른 호환 가능한 컨테이너 런타임 중 하나로 전환하는 방법을 정리했다.


용어정리

우선 설명 전 용어정리부터 하자.

OCI(Open Container Initiative)

컨테이너 런타임과 이미지 관련 업계 개방형 표준을 만들기 위해 Linux Foundation 산하의 오픈소스 단체이다.


CRI(Container Runtime Interface)

Container runtime tool이 docker 이외에도 많이 생겨남에 따라 kubelet과 container runtime간의 통일화된 인터페이스이다.


containerd

컨테이너 관리 및 실행을 처리하는 데몬 프로세스이다. 이미지 pull/push, 스토리지 및 네트워킹 제어, 컨테이너 실행을 감독한다.


cri-o

Kubernetes용 OCI 컨테이너 런타임이다. 오픈소스 커뮤니티 중심으로 한 컨테이너 엔진으로, 쿠버네티스에서 주로 사용되었던 Docker를 대체하는 것에 목적이 있다. 쿠버네티스의 CRI 표준 컴포넌트를 최소한의 런타임으로 구현을 염두에 두고 설계되었다.


K8S 1.24에서 docker를 컨테이너 런타임으로 지원하지 않는 이유

명확한 이유를 먼저 말하자면, 원래 Docker 지원은 쿠버네티스에 하드코딩 되었지만 프로젝트가 발전함에 따라 쿠버네티스는 더 많은 런타임에 대한 지원을 추가하기 시작했다. 이에 docker와 같은 타사 솔루션들을 코드에 직접 통합하는 대신 보다 체계적이고 표준화된 인터페이스로의 변화를 결정했다. docker 지원 중단은 쿠버네티스 이용자들에게 별 문제가 되지 않기 때문에 1.24 릴리즈부터 적용이 된 것이다.

Docker Container Runtime의 경우 CRI를 지원하지 않는다. 따라서 kubelet은 docker-shim이라는 CRI-shim을 통해 Docker Container를 제어했다. docker-shim이란 kubelet과 docker간의 통신(CRI)을 위해 구현된 프로젝트이다. kubelet과 docker 사이의 translate 계층 역할이라고 보면 될 것 같다. 쿠버네티스에서 1.24 릴리즈에서 변경된 사항을 정확히 말하자면, 쿠버네티스 1.24 릴리즈 이후로 kubelet에서 docker-shim의 지원이 deprecation 되는 것이다. 1.24 릴리즈 전 후의 흐름을 보면 아래와 같다.


K8S Container Runtime 전환 방법

서비스 중지

컨테이너 런타임을 전환하기 전에 기존 스케줄링 정지와 서비스되고 있는 pod들을 다른 노드로 이동시키기 위해 cordon & drain 설정부터 한다.

$ kubectl cordon {노드명}
$ kubectl drain {노드명} --ignore-daemonsets

그후 kubelet과 docker 서비스를 중지시킨다.

$ systemctl stop kubelet
$ systemctl stop docker


docker 제거(선택 사항)

기존에 설치되어 있던 docker 삭제는 선택사항이다. docker image build 등 docker 자체 기능이 필요한 경우가 있어서 docker 유지를 선택할 수 있다.

$ yum remove docker-ce docker-ce-cli

위 명령어로 docker를 삭제하면 실제 docker 구조에 있는 docker-shim, dockerd, docker cli만 삭제되고 docker 구조에 포함되어 있는 containerd는 삭제되지 않는다.(docker 내부 구조에서 실제 컨테이너를 실행시키는 것은 containerd)

사전 작업은 마쳤다. 아래 containerd와 cri-o 두 가지 전환 방법을 각각 설명하였다.


1. Docker에서 containerd로 마이그레이션

containerd 설정 변경

/etc/containerd/config.toml에서 disabled_plugins 라인을 주석처리 하여 기존 설정을 제거한다.

#disabled_plugins = ["cri"]

만약 /etc/containerd/config.toml이 없는 경우 아래 명령어로 새 기본 containerd 구성 파일을 생성 가능하다.

$ containerd config default > /etc/containerd/config.toml

그 후 containerd를 재시작한다.

$ systemctl restart containerd


kubernetes container runtime tool 변경

containerd를 containerd runtime tool로 설정하기 위해 /var/lib/kubelet/kubeadm-flags.env을 편집한다.

기존 설정은 아마 아래와 비슷하게 되어있을 것이다.

KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.x"

여기에 --container-runtime=remote--container-runtimeendpoint=unix:///run/containerd/containerd.sock 을 추가한다.

KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.x --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"

Leave a comment