이번 블로그에서는 kubernetes 1.24 버전에서 더 이상 Docker를 컨테이너 런타임으로 지원하지 않고, containerd 또는 CRI-O와 같은 다른 호환 가능한 컨테이너 런타임 중 하나로 전환해야 하는 내용에 대해 설명합니다.
간단하게 컨테이너는 운영 체제, 종속성, 라이브러리와의 문제를 최소화하고 프로세스를 실행하기 위한 가상 환경을 의미합니다.
1) OCI(Open Container Initiative)는 컨테이너 런타임과 이미지 관련 업계 개방형 표준을 만들기 위해 Linux Foundation 산하의 오픈 소스 단체입니다.
2) CRI(Container Runtime Interface)는 Kubernetes 구성 요소인 kubelet이 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스입니다.
1) docker: 애플리케이션을 빠르게 개발, 테스트 및 배포하기 위한 소프트웨어 프레임워크입니다. Docker는 라이브러리, 시스템 도구, 코드 및 런타임과 같이 소프트웨어가 작동하는 데 필요한 모든 것을 포함하는 컨테이너입니다.
Docker는 코드를 실행하는 일관된 메커니즘을 제공하여 컨테이너 운영 체제로 작동하고 OS 커널의 리소스 격리를 사용하여 동일한 OS에서 여러 컨테이너를 실행이 가능합니다. Docker를 사용하면 cli를 사용하여 컨테이너 빌드, 시작 및 중지를 위한 간단한 명령을 실행할 수 있습니다.
2) containerd: 컨테이너 관리 및 실행을 처리하는 데몬 프로세스입니다. 이미지를 가져오고 푸시하고 스토리지 및 네트워킹을 제어하고 컨테이너 실행을 감독합니다.
Linux 및 Windows에서 데몬이 실행되고, 이미지 전송 및 저장에서 컨테이너 실행 및 감독, 저수준 저장, 네트워크 연결 등에 이르기까지 호스트 시스템의 전체 컨테이너 수명 주기를 관리합니다.
3) cri-o: 모든 컨테이너 레지스트리에서 가져올 수 있으며 OCI 컨테이너 이미지를 지원합니다.
OCI 호환 런타임을 사용할 수 있도록 하는 Kubernetes CRI 구현입니다. Kubernetes의 런타임으로 Docker를 사용하는 것보다 더 가벼운 대안입니다. 이를 통해 Kubernetes는 포드 실행을 위해 모든 OCI 호환 컨테이너 런타임을 사용할 수 있습니다.
Docker 런타임은 CRI가 도입되기 전에 kubelet의 소스 코드에 하드 코딩된 상태였으며, Kubernetes의 사용량이 많아짐에 따라 커뮤니티에서는 추가 런타임 지원이 필요하기 시작했습니다.
kubelet은 특정 런타임이 아닌 CRI와 통합하여 많은 컨테이너 런타임을 지원하게 되었고, 현재 containerd는 완전한 CRI 구현을 제공합니다.
docker 이미지는 docker 전용 이미지가 아닌 OCI(Open Container Initiative) 이미지를 생성하고, containerd와 CRI-O는 모두 docker 이미지를 가져오고 실행할 수 있습니다.
$ kubectl cordon <Node name>
$ kubectl drain <Node Name> --ignore-daemonsets
$ systemctl stop kubelet
$ systemctl stop docker
apt purge docker-ce docker-ce-cli
또는
yum remove docker-ce docker-ce-cli
Docker에서 containerd로 마이그레이션
/etc/containerd/config.toml에서 disabled_plugins 라인을 비활성화하여 CRI 인터페이스를 활성화합니다.
#disabled_plugins = ["cri"]
참고: 아직 없는 경우 새 기본 containerd 구성 파일을 만들 수 있습니다.
containerd config default > /etc/containerd/config.toml
그런 다음 containerd를 다시 시작하십시오.
systemctl restart containerd
--container-runtime=remote
--container-runtimeendpoint=unix:///run/containerd/containerd.sock"
systemctl start kubelet
kubectl get nodes -o wide
이제 노드를 해제할 수 있습니다.
kubectl uncordon node
$ add-apt-repository ppa:projectatomic/ppa
$ apt update
$ apt install -y cri-o-1.15
vi /etc/sysctl.d/99-kubernetes-crio.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
sysctl -a
vim /etc/crio/crio.conf
which conmon
# Path to the conmon binary, used for monitoring the OCI runtime.
conmon = "/usr/bin/conmon"
registries = [
"quay.io",
"docker.io",
]
$ systemctl enable crio
$ systemctl start crio
KUBELET_EXTRA_ARGS=--feature-gates="AllAlpha=false" --container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-request-timeout=5m
systemctl start kubelet
kubectl uncordon <Node>
결론적으로, 쿠버네티스에서 도커를 런타임으로 지원하지 않는다는 것이 도커를 사용할 수 없다는 것을 의미하는 것이 아닙니다.
단지 도커가 쿠버네티스에서 기본 엔진으로 사용되지 않는다는 것을 의미합니다.
자세한 내용은 Kubernetes의 공식 문서에서 확인이 가능합니다.