[kubernetes] k8s 1.24에서 docker 지원 중단에 따른 container 런타임(docker, containerd, cri-o) 전환 방법

dawon·2022년 2월 6일
4

이번 블로그에서는 kubernetes 1.24 버전에서 더 이상 Docker를 컨테이너 런타임으로 지원하지 않고, containerd 또는 CRI-O와 같은 다른 호환 가능한 컨테이너 런타임 중 하나로 전환해야 하는 내용에 대해 설명합니다.

1. container

간단하게 컨테이너는 운영 체제, 종속성, 라이브러리와의 문제를 최소화하고 프로세스를 실행하기 위한 가상 환경을 의미합니다.

2. oci, cri

1) OCI(Open Container Initiative)는 컨테이너 런타임과 이미지 관련 업계 개방형 표준을 만들기 위해 Linux Foundation 산하의 오픈 소스 단체입니다.

2) CRI(Container Runtime Interface)는 Kubernetes 구성 요소인 kubelet이 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스입니다.

3. docker, containerd, cri-o

1) docker: 애플리케이션을 빠르게 개발, 테스트 및 배포하기 위한 소프트웨어 프레임워크입니다. Docker는 라이브러리, 시스템 도구, 코드 및 런타임과 같이 소프트웨어가 작동하는 데 필요한 모든 것을 포함하는 컨테이너입니다.

Docker는 코드를 실행하는 일관된 메커니즘을 제공하여 컨테이너 운영 체제로 작동하고 OS 커널의 리소스 격리를 사용하여 동일한 OS에서 여러 컨테이너를 실행이 가능합니다. Docker를 사용하면 cli를 사용하여 컨테이너 빌드, 시작 및 중지를 위한 간단한 명령을 실행할 수 있습니다.

2) containerd: 컨테이너 관리 및 실행을 처리하는 데몬 프로세스입니다. 이미지를 가져오고 푸시하고 스토리지 및 네트워킹을 제어하고 컨테이너 실행을 감독합니다.

Linux 및 Windows에서 데몬이 실행되고, 이미지 전송 및 저장에서 컨테이너 실행 및 감독, 저수준 저장, 네트워크 연결 등에 이르기까지 호스트 시스템의 전체 컨테이너 수명 주기를 관리합니다.

3) cri-o: 모든 컨테이너 레지스트리에서 가져올 수 있으며 OCI 컨테이너 이미지를 지원합니다.

OCI 호환 런타임을 사용할 수 있도록 하는 Kubernetes CRI 구현입니다. Kubernetes의 런타임으로 Docker를 사용하는 것보다 더 가벼운 대안입니다. 이를 통해 Kubernetes는 포드 실행을 위해 모든 OCI 호환 컨테이너 런타임을 사용할 수 있습니다.

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

Docker 런타임은 CRI가 도입되기 전에 kubelet의 소스 코드에 하드 코딩된 상태였으며, Kubernetes의 사용량이 많아짐에 따라 커뮤니티에서는 추가 런타임 지원이 필요하기 시작했습니다.
kubelet은 특정 런타임이 아닌 CRI와 통합하여 많은 컨테이너 런타임을 지원하게 되었고, 현재 containerd는 완전한 CRI 구현을 제공합니다.

docker 이미지는 docker 전용 이미지가 아닌 OCI(Open Container Initiative) 이미지를 생성하고, containerd와 CRI-O는 모두 docker 이미지를 가져오고 실행할 수 있습니다.

5. Docker에서 containerd 및 CRI-O로 전환하는 방법

사전 작업

1단계: Cordon & Drain 노드

$ kubectl cordon <Node name>
$ kubectl drain <Node Name> --ignore-daemonsets

2단계: 서비스 중지

$ systemctl stop kubelet
$ systemctl stop docker

3단계: Docker 제거(선택 사항):

apt purge docker-ce docker-ce-cli

또는

yum remove docker-ce docker-ce-cli
Docker에서 containerd로 마이그레이션

Docker에서 containerd로 마이그레이션

4단계: 컨테이너 구성

/etc/containerd/config.toml에서 disabled_plugins 라인을 비활성화하여 CRI 인터페이스를 활성화합니다.

#disabled_plugins = ["cri"]

참고: 아직 없는 경우 새 기본 containerd 구성 파일을 만들 수 있습니다.

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

그런 다음 containerd를 다시 시작하십시오.

systemctl restart containerd

5단계: 런타임 변경 /var/lib/kubelet/kubeadm-flags.env에 다음 2개의 containerd 런타임 플래그를 추가합니다.

--container-runtime=remote 
--container-runtimeendpoint=unix:///run/containerd/containerd.sock"

6단계: 이제 kubelet을 시작할 수 있습니다.

systemctl start kubelet

7단계: containerd 런타임 테스트

kubectl get nodes -o wide

이제 노드를 해제할 수 있습니다.

kubectl uncordon node

Docker에서 CRI-O로 마이그레이션

4단계: CRI-O 저장소 및 설치

$ add-apt-repository ppa:projectatomic/ppa
$ apt update
$ apt install -y cri-o-1.15

5단계: CRI-O 구성 및 커널 생성 파일 99-kubernetes-crio.conf 생성

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

crio.conf를 확인하고 Docker 레지스트리를 사용하도록 cri-o 편집

파일 열기 crio.conf:

vim /etc/crio/crio.conf

구성에서 conmon에 대한 경로가 정확한지 확인하십시오. 그렇지 않은 경우 다음 명령을 실행합니다.

which conmon

crio.conf 파일에 출력 추가

# Path to the conmon binary, used for monitoring the OCI runtime.
conmon = "/usr/bin/conmon"

또한 "레지스트리" 옵션이 주석 처리되어 있는지 확인하십시오.

registries = [
        "quay.io",
        "docker.io",
]

6단계: 이제 CRI-O를 시작할 수 있습니다.

$ systemctl enable crio
$ systemctl start crio

7단계: kubelet 편집을 구성하고 시작 vi /etc/default/kubelet 하면 다음과 같아야 합니다.

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

그런 다음 kubelet을 시작합니다.

systemctl start kubelet

8단계: 이제 노드의 코드를 해제할 수 있습니다.

kubectl uncordon <Node>

6. 정리

결론적으로, 쿠버네티스에서 도커를 런타임으로 지원하지 않는다는 것이 도커를 사용할 수 없다는 것을 의미하는 것이 아닙니다.
단지 도커가 쿠버네티스에서 기본 엔진으로 사용되지 않는다는 것을 의미합니다.

자세한 내용은 Kubernetes의 공식 문서에서 확인이 가능합니다.

0개의 댓글