このチュートリアルでは、Google Distributed Cloud(GDC)のエアギャップ アプライアンス環境でコンテナ アプリケーションをアップロードし、そのアプリケーションをアプライアンス環境で実行する方法について説明します。このチュートリアルでは、Harbor プロジェクトの作成方法、Harbor へのイメージのアップロード方法、ワークロードの作成方法について説明します。コンテナ化されたワークロードは、プロジェクトの Namespace 内で実行されます。
GDC エアギャップ アプライアンス環境には、tear という GDC プロジェクトに tear-harbor という事前構成済みの Harbor レジストリが用意されています。この例では、このレジストリを使用します。
このチュートリアルでは、 Google CloudArtifact Registry から入手できるサンプル ウェブサーバー アプリを使用します。
目標
- コンテナ イメージをマネージド Harbor レジストリに push します。
- サンプル コンテナアプリをクラスタにデプロイします。
始める前に
コンテナ化されたデプロイを管理するプロジェクトがあることを確認します。プロジェクトがない場合は、プロジェクトを作成します。
プロジェクトの Namespace を環境変数として設定します。
export NAMESPACE=PROJECT_NAMESPACE組織の IAM 管理者に次のロールを付与するよう依頼します。
プロジェクト Namespace の Namespace 管理者ロール(
namespace-admin)。このロールは、プロジェクトにコンテナ ワークロードをデプロイするために必要です。プロジェクト Namespace の Harbor インスタンス閲覧者ロール(
harbor-instance-viewer)。このロールは、Harbor インスタンスを表示して選択するために必要です。プロジェクトの Namespace の Harbor プロジェクト作成者ロール(
harbor-project-creator)。このロールは、Harbor プロジェクトにアクセスして管理するために必要です。
Kubernetes クラスタにログインし、ユーザー ID を使用して kubeconfig ファイルを生成します。kubeconfig パスを環境変数として設定していることを確認します。
export KUBECONFIG=CLUSTER_KUBECONFIG
レジストリに Harbor プロジェクトを作成する
GDC は Harbor as a Service を提供します。これは、Harbor を使用してコンテナ イメージを保存および管理できるフルマネージド サービスです。
Harbor as a Service を使用するには、tear-harbor レジストリ インスタンス内に Harbor プロジェクトを作成して、コンテナ イメージを管理する必要があります。
tear-harborの URL が必要です。インスタンスの URL を一覧表示します。gdcloud harbor instances describe tear-harbor --project=tear出力は
harbor-1.org-1.zone1.google.gdc.testのようになります。チュートリアルの後半で使用する変数としてインスタンス URL を設定します。
export INSTANCE_URL=INSTANCE_URLプロジェクトを作成する前に、前の手順の URL を使用して Harbor にログインする必要があります。ブラウザを使用してこの URL を開き、Harbor インスタンスにログインします。
Harbor プロジェクトを作成します。
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=tear \ --instance=tear-harborHARBOR_PROJECTは、作成する Harbor プロジェクトの名前に置き換えます。Harbor プロジェクトは、どのプロジェクト Namespace にも作成できません。tearプロジェクトを使用する必要があります。このチュートリアルの後半で使用する変数として、Harbor プロジェクト名を設定します。
export HARBOR_PROJECT=HARBOR_PROJECT
Configure Docker
Harbor レジストリで Docker を使用する手順は次のとおりです。
Harbor as a Service を信頼するように Docker を構成します。詳細については、Harbor ルート CA を信頼するように Docker を構成するをご覧ください。
Harbor に対する Docker 認証を構成します。詳細については、Harbor レジストリ インスタンスに対する Docker 認証を構成するをご覧ください。
tear-harborは事前構成済みの Harbor レジストリであるため、Google Distributed Cloud のエアギャップ内部 CA によって署名された証明書を信頼する必要があります。IO に以下の情報を尋ねます。
- Harbor クラスタの外部 URL。
- Google Distributed Cloud エアギャップ内部 CA の
.crtファイル。通常、このファイルはコントロール プレーンにanthos-credsNamespace のtrust-store-internal-onlyという名前の Secret として保存されます。
前の手順と同様に、Harbor クラスタの外部 URL の名前でフォルダを作成し、
.crtファイルをフォルダ内に保持します。
Kubernetes イメージ pull シークレットを作成する
非公開の Harbor プロジェクトを使用しているため、Kubernetes イメージ pull シークレットを作成する必要があります。
Harbor プロジェクトのロボット アカウントを追加します。Harbor UI の手順に沿って、ロボット アカウントを作成し、ロボット シークレット トークンをコピーします。https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account
新しいロボット プロジェクトのアカウント名をメモします。構文は次のとおりです。
<PREFIX><PROJECT_NAME>+<ACCOUNT_NAME>たとえば、ロボット プロジェクトのアカウント名の形式は
harbor@library+artifact-accountのようになります。Harbor でロボット プロジェクトのアカウント名を確認する方法については、Harbor のドキュメント(https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#view-project-robot-accounts)をご覧ください。
Harbor プロジェクトのロボット アカウントとシークレット トークンを使用して Docker にログインします。
docker login ${INSTANCE_URL}プロンプトが表示されたら、
Usernameにロボット プロジェクトのアカウント名を挿入し、Passwordにシークレット トークンを挿入します。イメージ pull シークレットに任意の名前を設定します。
export SECRET=SECRETイメージ pull に必要なシークレットを作成します。
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n NAMESPACE次のように置き換えます。
DOCKER_CONFIG:.docker/config.jsonファイルのパス。NAMESPACE: 作成する Secret の Namespace。
コンテナ イメージをマネージド Harbor レジストリに push する
このチュートリアルでは、nginx ウェブサーバー イメージをダウンロードしてマネージド Harbor レジストリに push し、それを使用してサンプル nginx ウェブサーバー アプリを Kubernetes クラスタにデプロイします。nginx ウェブサーバー アプリは、一般公開されている Google Cloud Artifact Registry から入手できます。
外部ネットワークを使用して、 Google Cloud Artifact Registry からローカル ワークステーションに
nginxイメージを pull します。docker pull gcr.io/cloud-marketplace/google/nginx:1.25イメージの名前を設定します。完全なイメージ名の形式は次のとおりです。
${INSTANCE_URL}/${HARBOR_PROJECT}/nginxローカル イメージにリポジトリ名でタグ付けします。
docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25nginxコンテナ イメージをマネージド Harbor レジストリに push します。docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
サンプル コンテナアプリをデプロイする
これで、nginx コンテナ イメージをアプライアンス クラスタにデプロイする準備が整いました。
Kubernetes では、アプリケーションは Pod リソースとして表されます。これは、1 つ以上のコンテナを保持するスケーラブルな単位です。Pod は、Kubernetes でデプロイ可能な最小単位です。通常は、Pod をレプリカのセットとしてデプロイし、クラスタ全体で一緒にスケーリングと分散を行えます。レプリカのセットをデプロイする 1 つの方法は、Kubernetes Deployment を使用することです。
このセクションでは、クラスタで nginx コンテナアプリを実行する Kubernetes Deployment を作成します。この Deployment にはレプリカ(Pod)があります。1 つの Deployment Pod には、nginx コンテナ イメージという 1 つのコンテナのみが含まれます。また、クライアントが Deployment の Pod にリクエストを安定して送信できるようにする Service リソースも作成します。
nginx ウェブサーバーをデプロイします。
Kubernetes の
Deploymentカスタム リソースとServiceカスタム リソースを作成してデプロイします。kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25 ports: - containerPort: 80 imagePullSecrets: - name: ${SECRET} --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 protocol: TCP type: LoadBalancer EOFデプロイによって Pod が作成されたことを確認します。
kubectl get pods -l app=nginx -n ${NAMESPACE}出力は次のようになります。
NAME READY STATUS RESTARTS AGE nginx-deployment-1882529037-6p4mt 1/1 Running 0 1h nginx-deployment-1882529037-p29za 1/1 Running 0 1h nginx-deployment-1882529037-s0cmt 1/1 Running 0 1hすべてのネットワーク トラフィックを Namespace に許可するネットワーク ポリシーを作成します。
kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOFnginxサービスの IP アドレスをエクスポートします。export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`curlを使用してnginxサーバーの IP アドレスをテストします。curl http://$IP
次のステップ
- コンテナの管理方法については、コンテナのドキュメントをご覧ください。