このチュートリアルでは、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-harbor
HARBOR_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-creds
Namespace の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.25
nginx
コンテナ イメージをマネージド 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 EOF
nginx
サービスの IP アドレスをエクスポートします。export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
curl
を使用してnginx
サーバーの IP アドレスをテストします。curl http://$IP
次のステップ
- コンテナの管理方法については、コンテナのドキュメントをご覧ください。