docker가 설치되면 kubernetes에서 컨테이너d를 사용하도록 강제합니다.

docker가 설치되면 kubernetes에서 컨테이너d를 사용하도록 강제합니다.

docker와 Containerd가 모두 설치된 Kubernetes 노드가 있습니다. CI 파이프라인과 빌드를 실행하려면 노드에 Docker가 필요합니다. Kubernetes가 docker 대신 권장되는 컨테이너를 사용하도록 하려면 어떻게 해야 합니까? 기존 문서에서는 시스템에서 도커를 제거하도록 권장하는데, 이는 제 경우에는 바람직하지 않습니다.

둘 다 설치된 경우 Kubernetes가 docker 대신 컨테이너 런타임으로 컨테이너 런타임을 사용하도록 강제하는 방법이 있습니까?

답변1

Kubelet은 노드 상의 컨테이너 작업을 담당하는 프로세스이며,명령줄 플래그 세트원격 컨테이너 관리 공급자를 사용하도록 지시합니다(containerd와 cri-o는 AFAIK와 같은 방식으로 사용됩니다).

[Service]
ExecStart=/usr/local/bin/kubelet --container-runtime=remote --container-runtime-endpoint=unix:///var/run/dockershim.sock

(containerd가 동일한 dockershim.sock경로에서 수신한다고 가정)

훌륭한 매뉴얼에는 컨테이너를 생성할 때 특정 가정을 하기 때문에 기존 노드 등록으로 해당 플래그를 전환하지 않도록 구체적으로 명시되어 있으므로 이미 docker를 사용하는 노드가 있는 경우 이상적으로는 kubelet을 중지하고 해당 컨테이너를 날려버리십시오. , kubectl delete node $the_node_name그리고 kubelet이 올바른 구성으로 다시 등록하도록 합니다.

답변2

Ubunut 20.04에서 테스트되었으며, Containerd 런타임을 활성화하는 간단하고 깔끔한 방법은 다음 콘텐츠를 추가하는 것입니다 /etc/systemd/system/kubelet.service.d/20-use-containerd.conf.

Environment="KUBELET_EXTRA_ARGS=--container-runtime remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock"

이는 기본적으로 docker-shim에 의존하는 대신 컨테이너d를 활성화하기 위해 kubelet 서비스에 몇 가지 추가 인수를 추가합니다.

노드를 다시 시작하거나 스위치를 위해 최소한 kubelet, docker 및 컨테이너d를 중지하는 것이 좋습니다. 간단한 kubelet 다시 시작은 컨테이너가 docker를 사용하여 계속 실행되는 동안 Containerd를 통해 컨테이너를 실행하려고 시도하기 때문입니다.

관련 정보