イメージリポジトリ間のイメージの移行と同期は、Kubernetes クラスターのデータを移行するための基盤です。 image-syncer は、複数のコンテナイメージを同時に移行または同期することができます。 既存のコンテナイメージを Alibaba Cloud Container Registry にスムーズに移行するために使用することができます。 本ページでは、image-syncer を使用してコンテナイメージを移行する方法について説明します。

このタスクについて

他のクラウドベンダーが構築および保守する Kubernetes クラスターと比較して、Kubernetes の Alibaba Cloud Container Service は、サービスコスト、メンテナンスコスト、使いやすさ、および長期安定性の点で優れています。 多くのクラウドベンダーは、Kubernetes の負荷を Kubernetes の Container Service に移行したいと考えています。 イメージの数が少ない場合、docker pull および docker push コマンドを使用してイメージを移行することができます。 数百または数千のイメージを移行する必要がある場合、またはイメージリポジトリのサイズが数 TB にも及ぶ場合、前述のコマンドでイメージを移行するには時間がかかり、この処理中にデータが失われる可能性があります。 この場合、イメージリポジトリ間でイメージを移行するには、イメージ同期機能が必要です。 Alibaba Cloud が開発したオープンソースツールのイメージシンクロナイザー (image-syncer) は、この機能を提供し、多くのクラウドベンダーがイメージを移行するのに役立ちました。イメージリポジトリの最大容量は 3 TB を超えます。 同期タスクの実行に使用されるサーバーは、その全帯域幅を利用でき、サーバーのディスク容量に要件はありません。

イメージ同期の概要

イメージリポジトリ間のイメージの移行と同期は、Kubernetes クラスターのデータを移行するための基盤です。 docker pulldocker push コマンドを含むスクリプトを使用した従来のイメージ同期方法には次の制限があります。
  • ディスクストレージに依存します。 同期中にイメージをローカルディスクに保存する必要があります。 したがって、ディスク領域が使い果たされないように、ローカルイメージを適時に消去する必要があります。 さらに、ローカルディスクにイメージを書き込むために余分な時間が必要です。 これらの制限により、従来の方法を使用して、実稼働シナリオで多数のイメージを移行することはできません。
  • Docker デーモンに依存します。 Docker デーモンは、同時にプルまたはプッシュできるイメージの数を厳密に制限します。 その結果、従来の方法では、高い同時実行性でイメージを同期することができません。
  • HTTP API に依存して、いくつかの機能を実施します。 Docker CLI のみを使用してイメージを同期することはできません。 そのため、複雑な同期スクリプトを作成する必要があります。
image-syncer は、複数のイメージを同時に移行または同期するためのシンプルで使いやすいツールです。 image-syncer を使用すると、コンテナレジストリ、Docker、Hub、Quay.io、Harbour など、Docker Registry V2 に基づいたほぼすべてのメインストリームイメージリポジトリサービスとの間で Docker イメージを同期することができます。 実稼働環境で TB レベルのイメージを移行できることが検証されています。 詳細については、『image-syncer』をご参照ください。

機能

image-syncer には次の機能があります。
  • 複数のソースイメージリポジトリから複数の宛先イメージリポジトリにイメージを同期します。
  • Docker Registry V2 に基づく Docker イメージリポジトリサービスをサポートします。

    たとえば、image-syncer は Docker Hub、Quay.io、Container Registry、Harbor をサポートしています。

  • イメージをローカルディスクに保存せずに、メモリとネットワークを介してのみイメージを同期します。 これにより、同期速度が向上します。
  • 増分同期をサポートします。

    image-syncer は、ファイルを使用して、同期されたイメージに関する blob 情報を記録します。 この方法では、イメージは繰り返し同期されません。

  • 同時同期をサポートします。

    設定ファイルで同時にプルまたはプッシュできるイメージの数を調整することができます。

  • 失敗した同期タスクを自動的に再試行して、ネットワークのジッターによって引き起こされるほとんどのイメージ同期の問題を解決します。
  • Docker デーモンなどのプログラムに依存しません。

image-syncer を使用して、イメージリポジトリ間でイメージを移行、コピー、または段階的に同期するには、ネットワーク経由で image-syncer がソースおよび宛先レジストリと通信できることを確認すれば可能です。image-syncer には、ハードウェアリソースに関する要件はほとんどありません。image-syncer は、ネットワーク接続の回数を、同時に同期されるイメージの数に対して厳密に制限します。 image-syncer が占有するメモリは、同時に同期されるイメージの数に最大イメージレイヤーのサイズを掛けた値以下です。 したがって、単一のイメージレイヤーのサイズと同時に同期されるイメージの数が大きすぎる場合にのみ、同期タスクを実行するためのサーバー上のメモリが使い果たされる可能性があります。 さらに、image-syncer は、再送信機能を提供して、同期中の偶発的な障害を解決します。image-syncer は、同期が終了したときに同期に失敗したイメージの数をカウントし、問題の特定に役立つ詳細なログを提供します。

準備

image-syncer を使用するには、設定ファイルを準備すれば可能です。 例:
{
    "auth": {                   //認証情報フィールド 各オブジェクトには、レジストリにアクセスするためのユーザー名とパスワードが含まれています。
                                // 通常、image-syncer には、ソースレジストリ内のタグからイメージを取得したり、タグにアクセスしたりするためのアクセス権限が必要です。
                                // image-syncer には、宛先レジストリにイメージをプッシュしてリポジトリを作成するアクセス権限が必要です。 レジストリの認証情報が提供されない場合、image-syncer はデフォルトで匿名モードでレジストリにアクセスします。

        "quay.io": {            //レジストリの URLは、イメージ URL のレジストリの URL と同じである必要があります。
            "username": "xxx",               // 任意。 ユーザー名
            "password": "xxxxxxxxx",         // 任意。 パスワード
            "insecure": true                 // 任意。 レジストリが HTTP 経由でアクセスされるかどうかを指定します。 その場合、このパラメーターを true に設定します。 規定値: false このパラメーターをサポートするのは、V1.0.1以降のバージョンの image-syncer のみです。
        },
        "registry.cn-beijing.aliyuncs.com": {
            "username": "xxx",
            "password": "xxxxxxxxx"
        },
        "registry.hub.docker.com": {
            "username": "xxx",
            "password": "xxxxxxxxxx"
        }
    },
    "images": {
        // イメージ同期ルールを記述するフィールド。 各ルールはキーと値のペアであり、キーはソースリポジトリの URL を指定し、値は宛先リポジトリの URL を指定します。

        // 名前空間全体またはレジストリを 1 つのルールで同期することはできません。 最大 1 つのルールでリポジトリを同期することができます。

        // ソースリポジトリと宛先リポジトリの URL は registry/namespace/repository: tag の形式であり、これは docker pull または docker push コマンドで使用されるイメージ URL 形式に似ています。
        //ソースリポジトリのURLには、少なくともregistry / namespace / repositoryが含まれている必要があります。 宛先リポジトリの URL が空の文字列でない場合は、少なくともregistry / namespace / repositoryも含まれている必要があります。
        // ソースリポジトリの URL を空の文字列にすることはでき ません。 ソースリポジトリから複数の宛先リポジトリにイメージを同期するには、複数のルールを設定する必要があります。
        // 宛先リポジトリ名とタグは、ソースのものと異なる場合があります。 この場合、イメージ同期ルールは、ドッカープル、ドッカータグ、ドッカープッシュコマンドを順番に組み合わせたように機能します。
        "quay.io/coreos/kube-rbac-proxy": "quay.io/ruohe/kube-rbac-proxy",
        "xxxx":"xxxxx",
        "xxx/xxx/xx:tag1,tag2,tag3":"xxx/xxx/xx"
        // ソースリポジトリの URL にタグが含まれていない場合、ソースリポジトリ内のすべてのイメージは、元のタグを使用して宛先リポジトリに同期されます。 この場合、宛先リポジトリの URL にもタグを含めることはできません。
        // ソースリポジトリの URL にタグが 1 つしか含まれていない場合、ソースリポジトリ内のこのタグを持つイメージのみが宛先リポジトリに同期されます。 宛先リポジトリの URL にタグが含まれていない場合、同期されたイメージはデフォルトで元のタグを保持します。
        // ソースリポジトリの URL にコンマ (,) で区切られた複数のタグが含まれている場合 (a/b/c: 1,2,3 など) 、宛先リポジトリの URL にタグを含めることはできません。 同期されたイメージは、デフォルトで元のタグを保持します。

        // 宛先リポジトリの URL が空の文字列である場合、イメージはデフォルトレジストリのデフォルト名前空間にある同じ名前とタグを持つリポジトリに同期されます。 デフォルトレジストリと名前空間は、コマンドパラメーターまたは環境変数を使用して設定することができます。
    }     
}