如何信任不安全的镜像仓库?

目录

问题描述

托管平台组件镜像的镜像仓库可能不提供 HTTPS 服务,或者没有由公共证书颁发机构签发的有效 TLS 证书。如果您信任该仓库,请按照以下步骤配置您的容器运行时。

配置信任不安全的镜像仓库

配置步骤因容器运行时而异。本文档涵盖 Docker 和 Containerd。

Docker 运行时

步骤

  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. (可选)使用 jq 验证 Docker 配置语法。

    TIP

    确保已安装 jq。例如:yum install jq -y

    jq . < /etc/docker/daemon.json
  3. 重启所有节点上的 Docker。

    systemctl daemon-reload
    systemctl restart docker

Containerd 运行时

注意:

  • 所有需要使用镜像的节点(包括新加入的节点)都必须配置并重启 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='<registry address obtained in the "Get the registry address" section>'    
      
      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