Forçar o kubernetes a usar o containerd quando o docker estiver instalado

Forçar o kubernetes a usar o containerd quando o docker estiver instalado

Tenho nós do Kubernetes com docker e containerd instalados. Preciso do docker no nó para executar pipelines e compilações de CI. Como posso fazer com que o Kubernetes use o containerd recomendado em vez do docker? A documentação existente recomenda remover o docker do sistema, o que não é desejável para o meu caso.

Existe uma maneira de forçar o Kubernetes a usar o containerd como tempo de execução do contêiner em vez do docker quando ambos estão instalados?

Responder1

Kubelet é o processo responsável pelas ações do contêiner no Node e temum conjunto de sinalizadores de linha de comandopara solicitar que ele use um provedor de gerenciamento remoto de contêineres (tanto o containerd quanto o cri-o são consumidos da mesma maneira, AFAIK):

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

(assumindo que seu containerd está escutando no mesmo dockershim.sockcaminho)

O bom manual diz especificamente para garantir que você não troque esses sinalizadores com um registro de Node existente, uma vez que faz certas suposições ao criar os contêineres, então se você já possui um Node que está usando o docker, o ideal é parar o kubelet, explodir esses contêineres e kubectl delete node $the_node_namedeixe o kubelet registrar-se novamente com a configuração correta

Responder2

Testado no Ubunut 20.04, uma maneira simples e limpa de habilitar o tempo de execução do containerd foi adicionar este conteúdo a /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"

Isso adiciona alguns argumentos extras ao serviço kubelet, para habilitar o containerd em vez de depender do docker-shim por padrão.

É recomendado reiniciar o nó, ou pelo menos parar o kubelet, docker e containerd para o switch, pois uma simples reinicialização do kubelet tentará executar os contêineres via containerd enquanto eles ainda estão em execução usando o docker.

informação relacionada