Kubernetes ワークロードを Container Service for Kubernetes (ACK) に移行する際、多数のコンテナイメージの移行がボトルネックになることがよくあります。docker pull と docker push に基づくスクリプトは、イメージサイズに比例したディスク容量を必要とし、Docker デーモンに依存します。また、タグフィルタリングや複数宛先への同期が必要な場合には扱いにくくなります。image-syncer はこれらの制約を取り除きます。Docker デーモンやホスト上のディスクストレージを必要とせず、メモリとネットワーク帯域幅のみを使用してレジストリ間でイメージを直接コピーします。image-syncer を実行するサーバーは、サーバーの帯域幅を最大限に活用し、ディスク容量は不要です。サポートするイメージリポジトリの最大容量は 3 TB を超えます。
仕組み
image-syncer は、認証情報と同期ルールを定義する JSON 設定ファイルを読み込み、レジストリ間でイメージを直接転送します。単一の設定ファイルで、複数のソースイメージリポジトリから複数の宛先イメージリポジトリへイメージを同時に同期するルールを定義できます。実行のたびに、宛先にすでに存在するイメージをチェックしてスキップするため、ツールを再実行しても安全です。設定可能な並列度で同時転送を処理し、失敗したタスクを自動的に再試行することで、ネットワークジッターに対応します。
image-syncer は、Alibaba Cloud Container Registry (ACR)、Docker Hub、Quay.io、Harbor など、Docker Registry V2 と互換性のあるあらゆるサービスをサポートしています。本番環境での TB スケールのイメージ移行に使用されています。
制限事項
同期ルールを設定する前に、以下の制約にご注意ください:
-
1 つの同期ルールは、1 つのソースリポジトリを 1 つの宛先リポジトリにマッピングします。単一のルールで名前空間またはレジストリ全体を同期することはできません。
-
ソースリポジトリの URL を空にすることはできません。
-
ソース URL で複数のタグ (カンマ区切り) を指定する場合、宛先 URL にタグを含めることはできません。
前提条件
開始する前に、以下を確認してください:
-
ホストマシンからすべてのソースレジストリおよび宛先レジストリへのネットワーク接続があること
-
すべてのソースリポジトリに対するプルアクセスとタグ一覧表示の権限があること
-
すべての宛先レジストリに対するプッシュアクセスとリポジトリの作成権限があること
image-syncer の設定
image-syncer は、auth と images という 2 つのトップレベルフィールドを持つ JSON 設定ファイルを使用します。
認証 (auth)
auth フィールドは、各レジストリ URL をその認証情報にマッピングします。レジストリが認証を必要としない場合は、auth から除外します。image-syncer は匿名でアクセスします。
auth 内のレジストリ URL は、イメージ URL で使用されるレジストリのホスト名と完全に一致する必要があります。
| フィールド | 必須 | タイプ | デフォルト | 説明 |
|---|---|---|---|---|
username |
いいえ | 文字列 | — | レジストリのユーザー名 |
password |
いいえ | 文字列 | — | レジストリのパスワード |
insecure |
いいえ | ブール値 | false |
HTTPS の代わりに HTTP 経由で接続するには true に設定します。V1.0.1 以降でサポートされています。 |
同期ルール (images)
images フィールドは、キーと値のペアとして同期ルールを定義します。キーはソースイメージ URL、値は宛先イメージ URL です。どちらも registry/namespace/repository:tag の形式に従います。
タグの動作は、ソース URL の指定方法によって異なります:
| ソース URL | 宛先 URL | 動作 |
|---|---|---|
| タグなし | タグなし | ソースリポジトリ内のすべてのタグが、元のタグ名を維持したまま同期されます |
単一タグ (例::v1) |
タグなし | そのタグを持つイメージのみが、元のタグ名を維持したまま同期されます |
単一タグ (例::v1) |
タグ付き (例::stable) |
そのイメージのみが同期され、宛先タグに名前が変更されます |
複数タグ (例::v1,v2,v3) |
タグなし (必須) | これらのタグのみが、元のタグ名を維持したまま同期されます |
| タグなし | 空の文字列 "" |
すべてのタグが、デフォルトレジストリのデフォルト名前空間にある同名のリポジトリに同期されます |
設定ファイルの例
{
"auth": {
"quay.io": {
"username": "xxx",
"password": "xxxxxxxxx",
"insecure": true
},
"registry.cn-beijing.aliyuncs.com": {
"username": "xxx",
"password": "xxxxxxxxx"
},
"registry.hub.docker.com": {
"username": "xxx",
"password": "xxxxxxxxxx"
}
},
"images": {
"quay.io/coreos/kube-rbac-proxy": "quay.io/ruohe/kube-rbac-proxy",
"xxxx": "xxxxx",
"xxx/xxx/xx:tag1,tag2,tag3": "xxx/xxx/xx"
}
}
プレースホルダーの値を、実際のレジストリ URL、認証情報、イメージパスに置き換えてください。
image-syncer の実行
設定ファイルを準備した後、そのファイルを使用して image-syncer を実行します。このツールは、同期に失敗したイメージの数をログに記録し、問題の診断に役立つ詳細なエラー出力を提供します。
完全な実用例については、「セルフマネージドの Harbor プロジェクトから Container Registry Enterprise Edition にイメージを同期する」をご参照ください。