|
Harborは、CNCF Foundationがホストするオープンソースで信頼性の高いクラウドネイティブのDockerレジストリプロジェクトです。イメージコンテンツの保存、署名、スキャンに使用できます。Harborは、セキュリティやID管理などの共通機能を追加することで、Dockerレジストリプロジェクトを拡張します。さらに、レジストリ間でのイメージのコピーをサポートし、ユーザー管理、アクセス制御、アクティビティ監査などの高度なセキュリティ機能を提供します。新バージョンでは、Helmリポジトリホスティングのサポートも追加されています。 Harborの中核機能は、Dockerレジストリに権限保護レイヤーを追加することです。これを実現するには、docker login、pull、pushなどのコマンドをインターセプトし、まず権限チェックを実行してから操作を続行する必要があります。実際、Dockerレジストリv2では、この一連の操作が既にサポートされています。v2はセキュリティ認証機能を統合し、外部サービスにセキュリティ認証を公開することで、外部サービスがセキュリティ認証を実装できるようにしています。 港湾認証原則前述の通り、Docker Registry v2 は外部サービスへのセキュリティ認証を公開します。では、この公開はどのように実現されるのでしょうか?コマンドラインで「docker login https://registry.qikqiak.com」と入力して、認証プロセスを見てみましょう。 - Docker クライアントは、ユーザーから Docker ログイン コマンドを受信し、それをエンジン API の RegistryLogin メソッドへの呼び出しに変換します。
- RegistryLogin メソッドは、HTTP 経由でレジストリ サービス内の認証メソッドを呼び出します。
- サービスのバージョンv2を使用しているため、loginV2メソッドが呼び出されます。loginV2メソッドは/v2/インターフェースを呼び出し、リクエストを認証します。
- この時点でのリクエストにはトークン情報が含まれていないため、認証は失敗し、401エラーが返されます。ヘッダーには、認証リクエストを送信したサーバーのアドレスも返されます。
- 上記の応答を受信した後、レジストリクライアントは認証サーバーに認証リクエストを送信します。認証サーバーに送信されるリクエストのヘッダーには、暗号化されたユーザー名とパスワードが含まれます。
- 認証サーバーは、ヘッダーから暗号化されたユーザー名とパスワードを取得します。この時点で、データベースからユーザー認証情報を照会したり、LDAPサービスに接続して認証検証を行うなど、実際の認証システムと連携して認証を実行できます。
- 認証に成功するとトークンが返されます。クライアントはこのトークンを使用して、レジストリサービスに別のリクエストを送信します。今回は取得したトークンが含まれます。リクエストが正常に検証されると、ステータスコード200が返されます。
- Dockerクライアントは、操作が成功したことを示すステータスコード200を受け取ります。コンソールには「ログイン成功」と表示されます。これでログインプロセス全体が完了します。プロセス全体は、以下のフローチャートで表すことができます。
上記のログイン認証プロセスを完了するには、2つの重要なポイントに注意する必要があります。レジストリサービスにサービス認証アドレスをどのように通知するか、そしてレジストリが独自の認証サービスによって生成されたトークンを認識できるのはなぜか、という点です。 最初の問題は比較的簡単に解決できます。レジストリサービス自体が設定ファイルを提供しており、レジストリサービスを起動する際に設定ファイルに認証サービスのアドレスを指定できます。設定ファイルには以下の設定情報が含まれています。 …… 認証: トークン: レルム: トークン- レルム サービス: トークン- サービス 発行者: レジストリ- トークン- 発行者 rootcertbundle : / root / certs / bundle …… レルムは認証サービスのアドレスを指定するために使用できます。以下に、Harborにおけるこの設定の内容を示します。 レジストリの設定については、公式ドキュメント (https://docs.docker.com/registry/configuration/) を参照してください。
2つ目の疑問は、レジストリが返したトークンファイルをどのように認識するかということです。レジストリの要件に従ってトークンを生成すれば、レジストリはそれを認識できるでしょうか? そのため、認証サーバーでトークンをランダムに生成するのではなく、レジストリの要件に従って生成する必要があります。では、どのように生成するのでしょうか? Dockerレジストリのソースコードを見ると、トークンはJWT(JSON Web Token)を使用して実装されていることがわかります。つまり、要件に従ってJWTトークンを生成するだけです。 Go言語に詳しい方は、Harborのコードをクローンして確認してみてください。HarborはBeegoというWeb開発フレームワークを使用しており、そのソースコードは特に読みにくいものではありません。Harborでは、上で説明した認証サービス部分の実装方法を簡単に確認できます。 インストールHarborには多くのコンポーネントが含まれており、Helmを使用してHarborの高可用性バージョンをインストールできます。これは本番環境へのデプロイメントにも対応しています。高可用性バージョンをインストールする前に、以下の前提条件を満たす必要があります。 - Kubernetes クラスター バージョン 1.10 以降。
- Helm バージョン 2.8.0 以上。
- 可用性の高い Ingress コントローラー。
- 高可用性 PostgreSQL 9.6+ (Harbor はデータベース HA を展開しません)。
- 可用性の高い Redis サービス (Harbor はこれを処理しません)。
- PVC はノード間または外部オブジェクト ストレージ間で共有できます。
Harborのコンポーネントのほとんどはステートレスであるため、Podのレプリカを追加するだけで、コンポーネントを可能な限り複数のノードに分散させることができます。ストレージ層では、アプリケーションデータを保存するための高可用性のPostgreSQLおよびRedisクラスターに加え、ストレージイメージとHelm Charts用のPVCまたはオブジェクトストレージを提供する必要があります。 まず、Chart リポジトリのアドレスを追加します。 # チャートリポジトリを追加 $ helm リポジトリにハーバーを追加します #更新 $ helm リポジトリの更新 #プルして抽出バージョン1.9.2 $ helm pull harbor / harbor -- untar -- バージョン1.9.2 Harborのインストール時には、多くの設定可能なパラメータがあります。これらはharbor-helmプロジェクトで確認できます。インストール中に、`--set`オプションを使用してパラメータを指定するか、`values.yaml`ファイルを直接編集することができます。 - Ingress 構成は、expose.ingress.hosts.core と expose.ingress.hosts.notary を通じて実現されます。
- 外部 URL は externalURL を介して構成されます。
- 外部PostgreSQLは、`database.type`を`external`に設定し、`database.external`の情報を入力することで設定できます。Harborコア、Notaryサーバー、Notary署名者の3つの空のデータベースを手動で作成する必要があります。Harborは起動時にテーブル構造を自動的に作成します。
- 外部Redisインスタンスは、`redis.type`を`external`に設定し、`redis.external`セクションに情報を入力することで設定できます。Harborはバージョン2.1.0でRedis Sentinelモードを導入しました。これは`sentinel_master_set`を設定することで有効にできます。ホストアドレスは`<host_sentinel1>:<port_sentinel1>`、`<host_sentinel2>:<port_sentinel2>`、`<host_sentinel3>:<port_sentinel3>`に設定できます。また、https://community.pivotal.io/s/article/How-to-setup-HAProxy-and-Redis-Sentinel-for-automatic-failover-between-Redis-Master-and-Slave-servers`のドキュメントを参照して、Redisの前にHAProxyを配置し、単一のエントリポイントを公開することもできます。
- デフォルトでは、Kubernetes クラスターにデフォルトの StorageClass が必要です。これは、画像、チャート、タスクログを保存するための PV を自動生成するためのものです。StorageClass を指定する場合は、`persistence.persistentVolumeClaim.registry.storageClass`、`persistence.persistentVolumeClaim.chartmuseum.storageClass`、および `persistence.persistentVolumeClaim.jobservice.storageClass` を使用して設定できます。さらに、PV が異なるノード間でストレージを共有できるようにするには、`accessMode` を `ReadWriteMany` に設定する必要があります。あるいは、`existingClaim` を使用して設定できる既存の PVC を指定してデータを保存することもできます。ノード間で共有できる PVC がない場合は、外部ストレージを使用して画像やチャートを保存し(サポートされている外部ストレージ オプションには、Azure、GCS、S3 Swift、OSS などがあります)、タスクログをデータベースに保存できます。使用したい値をpersistence.imageChartStorage.typeに設定し、対応する部分を入力し、jobservice.jobLoggerをデータベースに設定します。
- レプリカ: portal.replicas、core.replicas、jobservice.replicas、registry.replicas、chartmuseum.replicas、notary.server.replicas、notary.signer.replicas を n (n>= 2) に設定します。
例えば、ここではメインドメインをharbor.k8s.localとして設定し、nfs-client StorageClassを介してストレージを提供します。GitLabのインストール時にPostgreSQLとRedisを個別にインストール済みなので、Harborがこれら2つの外部データベースを使用するように設定することもできます。これにより、リソース使用量を削減できます(両方のデータベースをHAモードと見なすことができます)。ただし、外部データベースを使用するには、事前にデータベースを手動で作成する必要があります。例えば、GitLabが提供するデータベースを使用する場合、このPodにharbor、notary_server、notary_signerの3つのデータベースを作成します。 $ kubectl get pods - n kube - ops - l name = postgresql 名前準備完了ステータス再起動年齢 postgresql - 75 b8447fb5 - th6bw 1 / 1 実行中1 2 d $ kubectl exec -it postgresql -75 b8447fb5 -th6bw / bin / bash -n kube -ops kubectl exec [ POD ] [ COMMAND ] は非推奨であり、 将来のバージョンで削除される予定です。 代わりにkubectl exec [ POD ] -- [ COMMAND ] を使用してください。 root @postgresql - 75 b8447fb5 - th6bw : / var / lib / postgresql # sudo su - postgres postgres @postgresql - 75 b8447fb5 - th6bw : ~$ psql psql ( 12.3 ( Ubuntu 12.3 - 1. pgdg18 .04 + 1 )) ヘルプを表示するには「help」と入力してください。 postgres = # データベースharbor OWNER postgres を作成します。 データベースの作成 postgres = # データベースharbor のすべての権限をpostgres に付与します。 付与 postgres = # データベースharbor のすべての権限をgitlab に付与します。 付与 # Todo : 同じ方法で他の2つのデータベース notary_server と notary_signer を作成します。 …… postgres - # \ q # 終了 データベースの準備が完了したら、カスタム値ファイルを使用してインストールを実行できます。完全なカスタム値ファイルを以下に示します。 # 値- prod.yaml 外部URL : https : harborAdminパスワード: Harbor12345 ログレベル: デバッグ さらす: タイプ: 入力 TLS : 有効: true 入口: className : nginx # イングレスクラスを指定します ホスト: コア: harbor.k8s.local 公証人: notary.k8s.local 持続性: 有効: true リソースポリシー: "keep" 永続ボリュームクレーム: レジストリ: #高可用性を実現するには、複数のレプリカを持つコンポーネントで ReadWriteMany をサポートするバックエンドを使用する必要があります。 # ここでは NFS を使用していますが、実稼働環境では NFS は推奨されません。 ストレージクラス: "nfs-client" # 高可用性を実現するには、複数のレプリカ コンポーネントでReadWriteMany を使用する必要があります。デフォルトはReadWriteOnce です。 アクセスモード: ReadWriteMany サイズ: 5G チャートミュージアム: ストレージクラス: "nfs-client" アクセスモード: ReadWriteMany サイズ: 5G ジョブサービス: ストレージクラス: "nfs-client" アクセスモード: ReadWriteMany サイズ: 1Gi トリビー: ストレージクラス: "nfs-client" アクセスモード: ReadWriteMany サイズ: 2Gi データベース: タイプ: 外部 外部の: ホスト: "postgresql.kube-ops.svc.cluster.local" ポート: "5432" ユーザー名: "gitlab" パスワード: 「passw0rd」 コアデータベース: 「港」 公証サーバーデータベース: "notary_server" 公証人署名データベース: "公証人署名者" レディス: タイプ: 外部 外部の: アドレス: "redis.kube-ops.svc.cluster.local:6379" # デフォルトはレプリカ1つです。高可用性を有効にするには、 レプリカ数を2 以上に設定します。 ポータル: レプリカ: 1 コア: レプリカ: 1 ジョブサービス: レプリカ: 1 レジストリ: レプリカ: 1 チャートミュージアム: レプリカ: 1 トリビー: レプリカ: 1 公証人: サーバー: レプリカ: 1 署名者: レプリカ: 1 これらの構成の詳細は、Harbor の Chart パッケージのデフォルト値に基づいて上書きされ、インストールを直接続行できるようになりました。 $ cd ハーバー $ helm upgrade -- harbor をインストールします。 - f values -prod .yaml -n kube -ops リリース「harbor」が存在しません。 現在インストール中です。 名前: 港 最終展開日: 2022年7月7 日( 木) 17:31:43 名前空間: kube - ops ステータス: 展開済み 改訂1 テストスイート: なし 注記: Harbor の展開が完了するまで数分間お待ちください。 その後、 Harbor ポータル( https : ) にアクセスできるようになります。 詳細については https://github.com/goharbor/harbor をご覧ください。 通常の状況では、しばらくするとインストールは成功します。 $ helm ls -n kube -ops 名前名前空間リビジョン更新ステータスチャートアプリバージョン harbor kube - ops 1 2022 - 07 - 07 17 : 31 : 43.083547 + 0800 CST デプロイ済みharbor - 1.9 .2 2.5 .2 $ kubectl get pods - n kube - ops - l app = harbor 名前準備完了ステータス再起動年齢 港- チャートミュージアム- 544 ddbcb64 - nvk7w 1 / 1 ランニング0 30 m ハーバー- コア- 7f d9964685 - lqqw2 1 / 1 ランニング0 30 m 港- ジョブサービス- 6 dbd89c59 - vvzx5 1 / 1 ランニング0 30 m 港- 公証人- サーバー- 764 b8859bf - 82f 5 q 1 / 1 実行中0 30 m 港- 公証人- 署名者- 869 d9bf585 - kbwwg 1 / 1 ランニング0 30 m 港- ポータル- 74 db6bb688 - 2 w79p 1 / 1 ランニング0 35 m 港- レジストリ- 695 db89bfd - v9wwt 2 / 2 実行中0 30 m ハーバー- トリヴィ- 0 1 / 1 ランニング0 35 m インストール後、ドメイン harbor.k8s.local を Ingress Controller トラフィック エントリ ポイントに解決し、そのドメインを使用してブラウザーからアクセスできるようになります。 $ kubectl get ingress - n kube - ops 名前クラスホストアドレスポート年齢 ハーバー- イングレスnginx ハーバー. k8s . ローカル80 , 443 12 秒 ハーバー- イングレス- 公証人nginx 公証人. k8s . ローカル80 , 443 12 秒 ユーザー名はデフォルトの「admin」、パスワードは上記で設定したデフォルトの「Harbor12345」です。サイトにアクセスするにはHTTPSを使用する必要があります(デフォルトではHTTPSにリダイレクトされます)。HTTPSを使用しない場合、ユーザー名またはパスワードが間違っていることを示すエラーメッセージが表示される場合があります。 ログイン後、Harbor Dashboard ページにアクセスできます。 多くの機能があることがわかります。デフォルトでは「library」というプロジェクトがあり、このプロジェクトはデフォルトで公開されています。プロジェクト内では、Helm Chartパッケージの管理を確認できます。パッケージは手動でアップロードしたり、このプロジェクトでミラーのその他の設定を行ったりできます。 プッシュ画像次に、containerd で Harbor イメージ リポジトリを使用する方法をテストします。 まず、containerd でプライベートイメージリポジトリを設定する必要があります。containerd 設定ファイル /etc/containerd/config.toml を変更します。 [ プラグイン. "io.containerd.grpc.v1.cri" . レジストリ] [ プラグイン. "io.containerd.grpc.v1.cri" . レジストリ. ミラー] [ プラグイン. "io.containerd.grpc.v1.cri" . レジストリ. ミラー. "docker.io" ] エンドポイント= [ "https://bqr1dr1n.mirror.aliyuncs.com" ] [ プラグイン. "io.containerd.grpc.v1.cri" . レジストリ. 構成] [ プラグイン. "io.containerd.grpc.v1.cri" . レジストリ. configs . "harbor.k8s.local" . tls ] 安全でないスキップ検証= true [ プラグイン. "io.containerd.grpc.v1.cri" . レジストリ. configs . "harbor.k8s.local" . 認証] ユーザー名= "admin" パスワード= "Harbor12345" plugins."io.containerd.grpc.v1.cri".registry.configs に、harbor.k8s.local に対応する設定情報を追加します。insecure_skip_verify = true は、セキュリティ検証をスキップすることを示します。次に、plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.k8s.local".auth で、Harbor イメージリポジトリのユーザー名とパスワードを設定します。 設定後、containerd を再起動します。 $ systemctl コンテナを再起動します ここで、nerdctl を使用してログインします。 $ nerdctl login -u admin harbor . k8s . local パスワードを入力してください: ERRO [ 0004 ] tryLoginWithRegHost の呼び出しに失敗しましたerror = "rh.Client.Do: Get \"https://harbor.k8s.local/v2/\": x509: 不明な機関によって署名された証明書" i = 0 FATA [ 0004 ] rh の呼び出しに失敗しました。 クライアント。 実行: "https://harbor.k8s.local/v2/" を取得: x509 : 不明な認証局によって署名された証明書 [ ルート@master1 ~ ] # ご覧のとおり、証明書関連のエラーは依然として発生します。`--insecure-registry` パラメータを追加するだけで、この問題は解決します。 $ nerdctl login -u admin --insecure - registry harbor .k8s .local パスワードを入力してください: 警告[ 0004 ] 「harbor.k8s.local」 のHTTPS 証明書の検証をスキップします 警告: パスワードは暗号化されずに/root/.docker/config.json に保存されます。 この警告を削除するには、 認証ヘルパーを設定します。 ログインに成功しました 次にランダムな鏡像を作成しましょう。 $ nerdctl プルビジーボックス: 1.35 .0 docker .io / library / busybox : 1.35 .0 : 解決済み|++++++++++++++++++++++++++++++++++++++++| インデックス- sha256 : 8 c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68 : 完了|++++++++++++++++++++++++++++++++++++++++| マニフェスト- sha256 : 8 cde9b8065696b65d7b7ffaefbab0262d47a5a9852bfd849799559d296d2e0cd : 完了|++++++++++++++++++++++++++++++++++++++++| config - sha256 : d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c : 完了|++++++++++++++++++++++++++++++++++++++++| レイヤー- sha256 : fc0cda0e09ab32c72c61d272bb409da4e2f73165c7bf584226880c9b85438e63 : 完了|++++++++++++++++++++++++++++++++++++++++| 経過時間: 83.7 秒 次に、Harbor の画像アドレスに画像を再タグ付けします。 $ nerdctl タグbusybox : 1.35.0 harbor.k8s.local / library / busybox : 1.35.0 次に、push コマンドを実行してイメージを Harbor にプッシュします。 $ nerdctl push --insecure - registry harbor .k8s .local / library / busybox : 1.35 .0 INFO [ 0000 ] 縮小プラットフォームイメージとしてプッシュ( application / vnd . docker . distribution . manifest . list . v2 + json 、 sha256 : 29f e0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726 ) 警告[ 0000 ] 「harbor.k8s.local」 のHTTPS 証明書の検証をスキップします インデックス- sha256 : 29f e0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726 : 完了|++++++++++++++++++++++++++++++++++++++++| マニフェスト- sha256 : 8 cde9b8065696b65d7b7ffaefbab0262d47a5a9852bfd849799559d296d2e0cd : 完了|++++++++++++++++++++++++++++++++++++++++| config - sha256 : d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c : 完了|++++++++++++++++++++++++++++++++++++++++| 経過時間: 6.9 秒合計: 2.2 Ki ( 333.0 B / s ) プッシュが完了すると、ポータル ページでミラー情報を確認できます。 イメージのプッシュは成功しました。プル機能をテストすることもできます。 $ nerdctl rmi harbor .k8s .local / library / busybox : 1.35 .0 タグなし: harbor . k8s . local / library / busybox : 1.35 .0 @sha256 : 8 c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68 削除済み: sha256 : cf4ac4fc01444f1324571ceb0d4f175604a8341119d9bb42bc4b2cb431a7f3a5 $ nerdctl rmi ビジーボックス: 1.35 .0 タグなし: docker . io / library / busybox : 1.35 .0 @sha256 : 8 c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68 削除済み: sha256 : cf4ac4fc01444f1324571ceb0d4f175604a8341119d9bb42bc4b2cb431a7f3a5 $ nerdctl pull -- 安全でない- レジストリharbor . k8s . local / library / busybox : 1.35 .0 警告[ 0000 ] 「harbor.k8s.local」 のHTTPS 証明書の検証をスキップします harbor .k8s .local / library / busybox : 1.35 .0 : 解決済み|++++++++++++++++++++++++++++++++++++++++++| インデックス- sha256 : 29f e0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726 : 完了|++++++++++++++++++++++++++++++++++++++++| マニフェスト- sha256 : 8 cde9b8065696b65d7b7ffaefbab0262d47a5a9852bfd849799559d296d2e0cd : 完了|++++++++++++++++++++++++++++++++++++++++| config - sha256 : d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c : 完了|++++++++++++++++++++++++++++++++++++++++| レイヤー- sha256 : fc0cda0e09ab32c72c61d272bb409da4e2f73165c7bf584226880c9b85438e63 : 完了|++++++++++++++++++++++++++++++++++++++++| 経過時間: 0.7 秒合計: 2.2 Ki ( 3.2 KiB / s ) $ nerdctl 画像 リポジトリタグイメージID 作成プラットフォームサイズBLOB サイズ 港.k8s .local / ライブラリ/ ビジーボックス1.35 .0 29f e0126b13c 17 秒前linux / amd64 1.2 MiB 757.7 KiB しかし、上記のように、nerdctlコマンドやctrコマンドを使ってHarborイメージリポジトリにアクセスするなど、containerdのみを使用する場合、証明書の検証をスキップしたり、CA証明書を設定したりしても証明書エラーが発生します。この場合、証明書の検証をスキップするか、証明書パスを指定する必要があります。 #解決策1. -k パラメータを指定して証明書の検証をスキップします。 $ ctr イメージプル-- ユーザーadmin : Harbor12345 -k harbor.k8s.local / library / busybox : 1.35.0 #解決策2. CA 証明書と Harbor 関連の証明書ファイルへのパスを指定します。 $ ctr イメージプル-- ユーザー管理者: Harbor12345 -- tlscacert ca 。 crt ハーバー。 k8s 。 ローカル/ ライブラリ/ ビジーボックス: 1.35 .0 ただし、ctrctl を直接使用すると機能します。 $ crictl pull harbor .k8s .local / library / busybox @sha256 : 29f e0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726 sha256 のイメージは最新です: d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c Kubernetes で使用する場合は、Harbor の認証情報を Secret としてクラスターに追加する必要があります。 $ kubectl シークレットを作成しますdocker - registry harbor - auth --docker - server = https : //harbor.k8s.local 次に、上記のプライベート イメージ リポジトリを使用して Pod を作成します。 # テスト- ハーバー.yaml apiバージョン: v1 種類: ポッド メタデータ 名前: 港- レジストリ- テスト 仕様: コンテナ - 名前: テスト イメージ: harbor.k8s.local / library / busybox : 1.35.0 引数: - 寝る - 「3600」 画像プルシークレット: - 名前: 港- 認証 作成後、Pod がイメージを正常に取得できるかどうかを確認できます。 $ kubectl でポッドハーバー- レジストリ- テストを記述します 名前: 港- レジストリ- テスト 名前空間: デフォルト 優先度: 0 ノード: node1 / 192.168.0.107 開始時間: 木、 2022年7 月7 日18:52:39 + 0800 # …… イベント: タイプ理由年齢送信元 メッセージ ---- ------ ---- ---- ------- 通常スケジュール10 秒default - スケジューラdefault / harbor - registry - test をノード 1 に正常に割り当てました 通常のプル10 秒kubelet イメージ「harbor.k8s.local/library/busybox:1.35.0」 をプルしています 通常のプル5 秒kubelet イメージ「harbor.k8s.local/library/busybox:1.35.0」を4.670528883 秒で正常にプルしました 通常5 秒で作成kubelet コンテナテストを作成 正常開始5 秒kubelet コンテナテストを開始 これは、プライベートイメージリポジトリが正常にセットアップされたことを示しています。プライベートプロジェクトと新しいユーザーを作成して、イメージのプル/プッシュを試してみてください。Harborには、イメージのコピー、Helm Chartパッケージのホスティングなど、他にも機能があります。実際に試して、Harborと公式の組み込みレジストリの違いを体験してください。 |