Развёртывание containerd 1.x в изолированной среде

1. Добавление загрузки модуля overlay в систему

Модуль overlay добавляет в систему поддержку файловой системы OverlayFS. Эта файловая система используется для хранения слоёв образов, которые использует containerd.

Этот шаг можно пропустить, так как загрузка модуля overlay выполняется через systemd-юнит 'containerd.service', где присутствует строка 'ExecStartPre=-/sbin/modprobe overlay'.

  1. Выполните:

    cat << EOF > /etc/modules-load.d/containerd.conf
    overlay
    EOF
    
    modprobe overlay

2. Скачивание компонентов containerd из внутреннего raw-репозитория

  1. Если внутренний репозиторий требует аутентификации, то задайте учётные данные для скачивания компонентов containerd:

    set +o history
    USER_PASS='ken:xxxxxxxxxxxxxxx'
    set -o history
  2. Скачайте компоненты, предварительно изменив номера версий на актуальные:

    CONTAINERD_VER='1.7.16'
    CONTAINERD_SERVICE_VER='231012'
    RUNC_VER='1.1.12'
    INTERNAL_REPO='http://nexus.example.org:8081/repository/evolut_raw'
    REPO_FOLDER='kubernetes/containerd'
    
    mkdir -p /root/tmp
    cd /root/tmp
    
    curl -LO -u $USER_PASS ${INTERNAL_REPO}/${REPO_FOLDER}/containerd-${CONTAINERD_VER}-linux-amd64.tar.gz
    curl -LO -u $USER_PASS ${INTERNAL_REPO}/${REPO_FOLDER}/containerd.service.${CONTAINERD_SERVICE_VER}
    curl -LO -u $USER_PASS ${INTERNAL_REPO}/${REPO_FOLDER}/runc.amd64-${RUNC_VER}

3. Установка containerd

  1. Распакуйте containerd в каталог /usr/local:

    tar Cxvf /usr/local containerd-${CONTAINERD_VER}-linux-amd64.tar.gz
    stdout:
    bin/
    bin/containerd-shim-runc-v2
    bin/containerd-stress
    bin/containerd
    bin/containerd-shim-runc-v1
    bin/ctr
    bin/containerd-shim

4. Добавление в систему systemd-юнит containerd

  1. Добавьте в Systemd ранее скачанный юнит:

    cp containerd.service.${CONTAINERD_SERVICE_VER} /etc/systemd/system/containerd.service
    systemctl daemon-reload

5. Установка runc

  1. Скопируйте ранее скачанный runc в каталог /usr/local/sbin/:

    install -m 755 runc.amd64-${RUNC_VER} /usr/local/sbin/runc

6. Создание файла конфигурации containerd

  1. Сгенерируйте конфиг по-умолчанию для containerd:

    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml

7. Конфигурирование containerd

  1. Включите в конфиге использование 'Control Group':

    sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
  2. Переключите версию pause-образа:

    sed -i "s|pause:3.8|pause:3.9|" /etc/containerd/config.toml
    Почему меняем образ pause:3.8 на pause:3.9?

    Потому что видел в логах инициализации кластера фразу: 'detected that the sandbox image "registry.k8s.io/pause:3.8" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.k8s.io/pause:3.9" as the CRI sandbox image.'

    Перепроверить!

  3. Если требуется, то приведите опцию 'bin_dir' в секции '[plugins."io.containerd.grpc.v1.cri".cni]' к актуальному значению. В опции указан каталог, где будет установлен пакет cni-plugins и куда будут распаковываться устанавливаемые плагины, например cilium:

    bin_dir = "/opt/cni/bin"

8. Перенастройка для работы с внутренним registry

  1. Выполните:

    INTERNAL_REGISTRY='https://dockerhub.example.org'
    
    PRIVATE_REGISTRY='nexus.example.org:5022'
    PRIVATE_REGISTRY_HTTP='http://${PRIVATE_REGISTRY}'
    
    mkdir -p /etc/containerd/certs.d/_default
    cat << EOF > /etc/containerd/certs.d/_default/hosts.toml
    [host."${INTERNAL_REGISTRY}"]
      capabilities = ["pull", "resolve"]
      #skip_verify = true
    EOF
    
    mkdir -p /etc/containerd/certs.d/${PRIVATE_REGISTRY}
    cat << EOF > /etc/containerd/certs.d/${PRIVATE_REGISTRY}/hosts.toml
    [host."${PRIVATE_REGISTRY_HTTP}"]
      capabilities = ["pull", "resolve"]
      inscure_skip_verify = true
    EOF
    
    # Поиск строки .registry и замена следующей строки на
    # config_path = "/etc/containerd/certs.d"
    sed -i '/\.registry\]/{ n; s|config_path = .*|config_path = \"/etc/containerd/certs.d\"|g }' /etc/containerd/config.toml

9. Запуск containerd

  1. Включите и запустите демон containerd:

    systemctl enable --now containerd

10. Тестирование containerd

  • С комментариями

  • Одним скриптом

  1. С помощью утилиты ctr убедитесь, что списки контейнеров и образов в containerd пусты:

    ctr c ls   #ctr containers ls
    ctr i ls   #ctr images ls
  2. Скачайте 'Hello, World' для Docker’а:

    ctr images pull --hosts-dir "/etc/containerd/certs.d" \
      docker.io/hello-world:latest
    stdout:
    docker.io/hello-world:latest:                                                     resolved       |++++++++++++++++++++++++++++++++++++++|
    index-sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75:    done           |++++++++++++++++++++++++++++++++++++++|
    manifest-sha256:e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57: done           |++++++++++++++++++++++++++++++++++++++|
    layer-sha256:c1ec31eb59444d78df06a974d155e597c894ab4cda84f08294145e845394988e:    done           |++++++++++++++++++++++++++++++++++++++|
    config-sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a:   done           |++++++++++++++++++++++++++++++++++++++|
    elapsed: 1.1 s                                                                    total:  12.5 K (11.4 KiB/s)
    unpacking linux/amd64 sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75...
    done: 31.118275ms
  3. Запустите тестовый контейнер 'Hello, World':

    ctr run -rm docker.io/hello-world:latest hello-world
    stdout:
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
  4. Удалите ранее скачанный образ:

    ctr i rm docker.io/hello-world:latest
  5. Вновь убедитесь, что списки контейнеров и образов пусты:

    ctr c ls
    ctr i ls
  1. Выполните:

    ctr c ls   #ctr containers ls
    ctr i ls   #ctr images ls
    ctr images pull --hosts-dir "/etc/containerd/certs.d" \
      docker.io/hello-world:latest
    ctr run -rm docker.io/hello-world:latest hello-world
    ctr i rm docker.io/hello-world:latest
    ctr c ls
    ctr i ls