クラスタからコンテナ イメージを push および pull する

システム アーティファクトは、組織のインフラストラクチャ クラスタの Artifact Registry に存在します。プラットフォーム管理者(PA)が Google Distributed Cloud(GDC)エアギャップ アプライアンスに組織を作成すると、すべてのシステム アーティファクトが組織インフラストラクチャ クラスタから複製されます。

インフラストラクチャ オペレーター(IO)は、新しいシステム アーティファクトを組織のインフラストラクチャ クラスタに push する必要があります。新しいシステム アーティファクトのプッシュは、PA がオプション機能の有効化をリクエストした場合、またはシステムにバグや停止が発生し、新しいアーティファクトをパッチ適用することで修正できる場合にのみ行われます。

始める前に

システム Artifact Registry プロジェクトのリソースに管理者としてアクセスするために必要な権限を取得するには、コンテナ イメージを push するクラスタに応じて、次のロールを付与するようセキュリティ管理者に依頼してください。

必要な権限を取得したら、次の手順に沿って、インフラストラクチャ クラスタのシステム Artifact Registry にイメージを push します。

  1. gdcloud コマンドライン インターフェース(CLI)の手順に沿って、Distributed Cloud CLI をダウンロードしてインストールします。

  2. コンポーネントをインストールするの手順に沿って、docker-credential-gdcloud コンポーネントをインストールします。

    gdcloud components install docker-credential-gdcloud
    
  3. 構成済みの ID プロバイダでログインする:

    gdcloud auth login
    
  4. kubeconfig ファイルをエクスポートします。

    gdcloud clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME はクラスタの名前で置き換えます。

  5. Docker を構成します。

    gdcloud auth configure-docker
    

ストレージ バケットからコンテナ イメージをダウンロードする

PA がストレージ バケットからイメージをダウンロードして、システム Artifact Registry にアップロードするようリクエストした場合は、このセクションの手順に沿って対応します。PA は、プロジェクト名やバケット名などの詳細を提供する必要があります。

IO として、ストレージ バケットからコンテナ イメージをダウンロードする権限が必要です。

  • セキュリティ管理者に、プロジェクトの Namespace でプロジェクト バケット オブジェクト閲覧者(project-bucket-object-viewer)ロールを付与するよう依頼します。

詳細については、IAM R0005 ランブックをご覧ください。

プロジェクト内のバケットと、そのバケット内のオブジェクトに対する読み取り専用アクセス権が付与されます。

必要な権限を取得したら、次の手順で PA プロジェクトの Namespace のストレージ バケットからコンテナ イメージをダウンロードします。

  1. PA にバケットのシークレット名を確認します。シークレット名は次のようになります。

    object-storage-key-std-user-ID
    

    シークレット名には、バケットにアクセスするための一意の ID 値が含まれています。

  2. バケットのシークレット名をコピーします。

  3. バケット アクセス認証情報を取得して、gdcloud CLI を構成します。

    SECRET_NAME=SECRET_NAME ACCESS_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.access-key-id}' | base64 -d)
    SECRET_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.secret-access-key}' | base64 -d)
    S3_ENDPOINT=objectstorage.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    echo "Access Key: ${ACCESS_KEY}" \
    && echo "Secret Key: ${SECRET_KEY}" \
    && echo "S3 Endpoint: ${S3_ENDPOINT}"
    
    gdcloud config set storage/s3_access_key_id ${ACCESS_KEY}
    gdcloud config set storage/s3_secret_access_key ${SECRET_KEY}
    gdcloud config set storage/s3_endpoint ${S3_ENDPOINT}
    

    SECRET_NAME は、前のステップでコピーした値に置き換えます。

  4. ストレージ バケットからワークステーションにコンテナ イメージをダウンロードします。

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

    次のように置き換えます。

    • BUCKET_NAME: コンテナ イメージを含むストレージ バケットの名前。この名前は PA が提供します。
    • CONTAINER_IMAGE_NAME: ストレージ バケットからダウンロードするコンテナ イメージ ファイルの名前。

イメージをシステム Artifact Registry に push する

次の手順に沿って、ワークステーションにあるコンテナ イメージのファイルを Management API サーバーのシステム Artifact Registry に push します。

  1. Console を開きます。

  2. コンテナ イメージを push するクラスタのシステム Artifact Registry エンドポイントのパスを取得します。

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. コンテナ イメージを読み込んでタグ付けし、クラスタのシステム Artifact Registry エンドポイントに push します。

    docker load --input CONTAINER_IMAGE_PATH
    
    docker tag CONTAINER_IMAGE_PATH ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    
    docker push ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    

    CONTAINER_IMAGE_PATH は、ローカル ファイル システム内のコンテナ イメージ ファイルのパスに置き換えます。このパスの有効な値は、たとえば oracle_db.tar です。

Harbor アーティファクトを pull する

通常、GDC システムはシステム アーティファクト レジストリ(SAR)と自動的にやり取りして、Harbor から最新のアーティファクトを取得します。一部の例外的なケースでは、このオペレーションを手動で実行できます。Harbor からアーティファクト イメージを手動で pull する手順は次のとおりです。

  1. アプリケーションごとに定義したアーティファクトの詳細を設定します。

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    次のように置き換えます。

    • APP: アプリケーションの名前。
    • HARBOR_PROJECT_NAME: Harbor プロジェクト名。
    • REPOSITORY: リポジトリの名前。
  2. Harbor 情報を取得します。

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. アーティファクト タグを取得します。タグを取得する方法は 2 つあります。

    • 方法 1: こちらをおすすめします。

      1. ローカル バンドル内のアーティファクトを一覧表示し、対応するタグを取得します。
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • 方法 2: この方法は、方法 1 が想定どおりに機能しない場合にのみ使用してください。

      1. Harbor のタグを一覧表示し、最新のタグを選択します。

          ADMIN_PASS=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} -n harbor-system get secret harbor-admin -o jsonpath="{.data.secret}" | base64 -d)
        
          curl -k -X GET \
            --header 'Accept: application/json' \
            --header "authorization: Basic $(echo -n admin:${ADMIN_PASS:?} | base64)" \
          "${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT:?}/repositories/${REPOSITORY:?}/artifacts?with_tag=true" | jq -r '.[] | select(.tags != null) | .tags[] | {tag: .name, updated:.push_time}'
        

        出力は次の例のようになります。

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. 更新日時が最も新しいタグの値をエクスポートします。

        TAG=MOST_RECENT_TAG
        

        MOST_RECENT_TAG は、更新日時が最も新しいタグに置き換えます。

  4. Harbor からアーティファクトをダウンロードします。

    gdcloud artifacts pull --single-manifest-repo \
    ${HARBOR_IP:?}/${HARBOR_PROJECT:?}/${REPOSITORY:?}:${TAG:?} \
    ${APP_NAME:?}-${TAG:?}
    

    次のエラー メッセージが表示された場合は、無視してかまいません。

    tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
    

既知の問題

Harbor アーティファクトの pull に関連する既知の問題がいくつかあります。

  • 引数 --kubeconfig ${INFRA_ORG_KUBECONFIG:?} を追加する必要がある場合があります。
  • curl コマンドを実行すると、次のエラー メッセージが表示されることがあります: certificate signed by unknown authority。このエラーを軽減するには、次のいずれかの方法を使用します。

    • 一時的な修正: gdcloud artifacts pull コマンドに --insecure フラグを追加します。
    • 信頼性の高い修正: 組織のインフラストラクチャ CA を信頼します。詳細については、イメージの pull エラーをご覧ください。
  • コンテンツの抽出が必要になる場合があります。

    gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted