• Русский
  • Как доверять небезопасному реестру образов?

    Содержание

    Описание проблемы

    Платформа реестра образов, хранящая компоненты, может не предоставлять HTTPS-сервис или не иметь действительного TLS-сертификата, выданного публичным центром сертификации. Если вы доверяете этому реестру, настройте ваше контейнерное окружение, выполнив следующие шаги.

    Настройка доверия к небезопасному реестру образов

    Шаги настройки зависят от контейнерного рантайма. В этом документе рассматриваются Docker и Containerd.

    Docker runtime

    Шаги

    1. Выполните следующие действия на каждом узле в импортируемом кластере:

      • Создайте резервную копию файла конфигурации Docker.

        mkdir -p '/var/backup-docker-confs/'
        if ! [ -f /etc/docker/daemon.json ]; then
            echo 'Конфигурация Docker не найдена. Пожалуйста, проверьте, правильно ли установлен Docker. Если проблема не решается, обратитесь в техническую поддержку.'
            exit 1
        else
            cp /etc/docker/daemon.json "/var/backup-docker-confs/daemon.json_$(date -u +%F_%R)"
        fi
      • Отредактируйте файл /etc/docker/daemon.json.

        Убедитесь, что параметр insecure-registries существует, и добавьте адрес реестра образов, полученный ранее. Для нескольких реестров, например:

        {
            "insecure-registries": [
                "<registry-address>",
                "192.168.134.43"
            ],
            "registry-mirrors": ["https://6telrzl8.mirror.aliyuncs.com"],
            "log-opts": {
              "max-size": "100m",
              "max-file": "2"
            },
            "live-restore": true,
            "metrics-addr": "0.0.0.0:9323",
            "experimental": true,
            "storage-driver": "overlay2"
        }
    2. (Опционально) Проверьте синтаксис конфигурации Docker с помощью jq.

      TIP

      Убедитесь, что jq установлен. Например: yum install jq -y.

      jq . < /etc/docker/daemon.json
    3. Перезапустите Docker на всех узлах.

      systemctl daemon-reload
      systemctl restart docker

    Containerd runtime

    Примечания:

    • Все узлы, которые должны использовать образы, включая недавно добавленные, должны быть настроены и Containerd должен быть перезапущен.
    • Конфигурация немного отличается для Containerd v1.4/v1.5 и v1.6. Следуйте соответствующим шагам для вашей версии.
    1. Выполните следующие действия на каждом узле в импортируемом кластере:

      • Создайте резервную копию файла конфигурации

        mkdir -p '/var/backup-containerd-confs/'
        if ! [ -f /etc/containerd/config.toml ]; then
            echo 'Конфигурация Containerd не найдена. Пожалуйста, проверьте, правильно ли установлен containerd. Если проблема не решается, обратитесь в техническую поддержку.'
            exit 1
        else
            cp /etc/containerd/config.toml /var/backup-containerd-confs/config.toml_$(date +%F_%T)
        fi
      • Узнайте версию Containerd

        # Получить версию containerd
        # Сравните эту версию с v1.6. Выберите шаги соответственно
        ctr --version | grep -Eo 'v[0-9]+\.[0-9]+\.[0-9]+'
      Конфигурация Containerd v1.4 v1.5 для небезопасных реестров
    2. Выполните следующие действия на каждом узле в импортируемом кластере:

      • Отредактируйте /etc/containerd/config.toml

        # Пример содержимого для добавления в конфигурационный файл
        # Строки в квадратных скобках — это секции. Если файл уже содержит секции с такими именами, объедините их содержимое.
        [plugins."io.containerd.grpc.v1.cri".registry]
            [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
                [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<registry-address>"]
                    endpoint = ["https://<registry-address>", "http://<registry-address>"]
                [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.134.43"]
                    endpoint = ["https://192.168.134.43", "http://192.168.134.43"]
            [plugins."io.containerd.grpc.v1.cri".registry.configs]
                [plugins."io.containerd.grpc.v1.cri".registry.configs."<registry-address>".tls]
                    insecure_skip_verify = true
                [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.134.43".tls]
                    insecure_skip_verify = true
      • Перезапустите Containerd.

        systemctl daemon-reload && systemctl restart containerd
    Конфигурация Containerd v1.6 для небезопасных реестров
    1. Выполните следующие действия на каждом узле в импортируемом кластере:

      • Проверьте, существует ли config_path в конфигурации.

        if ! grep -qF 'config_path' /etc/containerd/config.toml; then
            if grep -qE '\[plugins."io.containerd.grpc.v1.cri".registry.(mirrors|configs)(\.|\])' /etc/containerd/config.toml; then
                echo 'Следуйте шагам в разделе "Конфигурация Containerd v1.4 v1.5 для небезопасных реестров".'
            else
                cat >> /etc/containerd/config.toml << 'EOF'
        [plugins."io.containerd.grpc.v1.cri".registry]
            config_path = "/etc/containerd/certs.d/"
        EOF
            fi
        fi
        
        config_path_var=$(grep -F '/etc/containerd/certs.d' /etc/containerd/config.toml)
        if [ -z "$config_path_var" ]; then
           echo 'Значение config_path в файле неожиданное. Пожалуйста, проверьте!'
           exit 1
        fi
      • Создайте файл hosts.toml.

        Если предыдущая команда вывела Следуйте шагам в разделе "Конфигурация Containerd v1.4 v1.5 для небезопасных реестров"., смотрите Конфигурация Containerd v1.4 v1.5 для небезопасных реестров.

        REGISTRY='<адрес реестра, полученный в разделе "Get the registry address">'    
        
        mkdir -p "/etc/containerd/certs.d/$REGISTRY/"
        cat > "/etc/containerd/certs.d/$REGISTRY/hosts.toml" << EOF
        server = "$REGISTRY"
        [host."http://$REGISTRY"]
          capabilities = ["pull", "resolve", "push"]
          skip_verify = true
        [host."https://$REGISTRY"]
          capabilities = ["pull", "resolve", "push"]
          skip_verify = true
        EOF
      • Перезапустите Containerd.

        systemctl daemon-reload && systemctl restart containerd