このチュートリアルでは、エアギャップ環境の Google Distributed Cloud(GDC)にコンテナ アプリケーションをアップロードし、そのアプリケーションを Kubernetes クラスタで実行する方法について説明します。コンテナ化されたワークロードは、プロジェクト Namespace 内の Kubernetes クラスタで実行されます。クラスタは、プロジェクトや他のクラスタと論理的に分離され、異なる障害発生ドメインと分離保証を提供します。ただし、コンテナ化されたワークロードをプロジェクト内で管理できるようにするには、クラスタをプロジェクトに接続する必要があります。
このワークフローは、組織のアプリケーション ワークロードの作成を担当するアプリケーション オペレーター グループ内のアプリケーション デベロッパーを対象としています。詳細については、 GDC エアギャップ ドキュメントの対象読者をご覧ください。
コンテナアプリをデプロイする際の最大の障害の 1 つは、アプリのバイナリをエアギャップ データセンターに取得することです。インフラストラクチャ チームと管理者に協力して、アプリケーションをワークステーションに転送するか、このチュートリアルを継続的インテグレーションと継続的デリバリー(CI/CD)サーバーに直接実装してください。
このチュートリアルでは、 Google Cloud Artifact Registry から入手できるサンプル ウェブサーバー アプリを使用します。
目標
- マネージド Harbor レジストリを作成する。
- コンテナ イメージをマネージド Harbor レジストリに push する。
- Kubernetes クラスタを作成する。
- サンプル コンテナアプリをクラスタにデプロイする。
費用
GDC はエアギャップ データセンターで実行するように設計されているため、課金プロセスと情報は GDC デプロイに限定され、他の Google プロダクトでは管理されません。
料金計算ツール を使うと、予想使用量に基づいて費用の見積もりを生成できます。
[予想費用] ダッシュボード を使用して、請求書の今後の SKU の費用を予測します。
ストレージとコンピューティングの使用量を追跡するには、 [請求の使用量] ダッシュボードを使用します。
始める前に
コンテナ化されたデプロイを管理するプロジェクトがあることを確認します。 プロジェクトがない場合は 作成します。
プロジェクト Namespace を環境変数として設定します。
export NAMESPACE=PROJECT_NAMESPACE組織 IAM 管理者に次のロールの付与を依頼します。
プロジェクト Namespace の Namespace 管理者ロール(
namepspace-admin)。 このロールは、プロジェクトにコンテナ ワークロードをデプロイするために必要です。プロジェクト Namespace の Harbor インスタンス管理者ロール(
harbor-instance-admin)。このロールは、すべての Harbor リソースに対する読み取り / 書き込みアクセス権に必要です。Harbor インスタンスを削除する場合にも必要です。プロジェクト Namespace の Harbor インスタンス閲覧者ロール(
harbor-instance-viewer)。このロールは、Harbor インスタンスを表示して選択するために必要です。プロジェクト Namespace の Harbor プロジェクト作成者ロール(
harbor-project-creator)。このロールは、Harbor プロジェクトにアクセスして管理するために必要です。ユーザー クラスタ管理者ロール(
user-cluster-admin)。このロールは Kubernetes クラスタの作成に必要で 、Namespace にバインドされていません。
サインイン してゾーン管理 API サーバーにアクセスし、 ユーザー ID を使用して kubeconfig ファイルを生成します。kubeconfig パスを環境変数として設定します。
export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
マネージド Harbor レジストリを作成する
GDC エアギャップは、Harbor as a Service を提供します。これは、Harbor を使用してコンテナ イメージを保存および管理できるフルマネージド サービスです。
Harbor as a Service を使用するには、まず Harbor レジストリ インスタンスと Harbor プロジェクトを作成する必要があります。
Harbor レジストリ インスタンスを作成する
Harbor コンテナ レジストリ インスタンスを作成する手順は次のとおりです。
コンソール
ナビゲーション メニューで、[CI/CD] セクションから [Harbor Container Registry] を選択します。
Harbor インスタンスを作成するゾーンを選択します。Harbor インスタンスはゾーンリソースであり、高可用性を確保するには、各ゾーンで手動で作成する必要があります。
[インスタンスを作成] をクリックします。
インスタンスの名前を入力し、Harbor マネージド利用規約に同意します。
[インスタンスを作成] をクリックします。
[Harbor インスタンス] セクションに新しい Harbor インスタンスが存在することを確認します。
[Go to Harbor Instance] 外部リンクをクリックし、インスタンス URL をメモします。たとえば、インスタンス URL の形式は
harbor-1.org-1.zone1.google.gdc.testのようになります。インスタンス URL にはhttps://プレフィックスを含めないでください。インスタンス URL を変数として設定し、チュートリアルの後半で使用します。
export INSTANCE_URL=INSTANCE_URLINSTANCE_URL は、Harbor レジストリ インスタンスの URL に置き換えます。
次に例を示します。
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
新しい Harbor コンテナ レジストリ インスタンスを作成します。
gdcloud harbor instances create INSTANCE_NAME \ --project=PROJECT \次のように置き換えます。
INSTANCE_NAME: Harbor インスタンスの名前。PROJECT: GDC プロジェクトの名前。
インスタンスの URL を一覧表示します。
gdcloud harbor instances describe INSTANCE_NAME \ --project=PROJECT出力は次のようになります。
# Several lines of code are omitted here. status: url: https://harbor-1.org-1.zone1.google.gdc.testインスタンス URL を変数として設定し、チュートリアルの後半で使用します。
export INSTANCE_URL=INSTANCE_URLINSTANCE_URL は、Harbor レジストリ インスタンスの URL に置き換えます。インスタンス URL に
https://プレフィックスが含まれていないことを確認します。次に例を示します。
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
レジストリに Harbor プロジェクトを作成する
コンテナ イメージを管理するには、Harbor レジストリ インスタンス内に Harbor プロジェクトを作成する必要があります。
コンソール
[Harbor Container Registry] ページで [Create A Harbor Project] をクリックします。
プロジェクトの名前を入力します。
[作成] をクリックします。
Harbor プロジェクト名を変数として設定し、チュートリアルの後半で使用します。
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
新しい Harbor プロジェクトを作成します。
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAME次のように置き換えます。
HARBOR_PROJECT: 作成する Harbor プロジェクトの名前。PROJECT: GDC プロジェクトの名前。INSTANCE_NAME: Harbor インスタンスの名前。
Harbor プロジェクト名を変数として設定し、チュートリアルの後半で使用します。
export HARBOR_PROJECT=HARBOR_PROJECT
Docker を構成する
Harbor レジストリで Docker を使用する手順は次のとおりです。
Harbor as a Service を信頼するように Docker を構成します。詳細については、 Harbor ルート CA を信頼するように Docker を構成するをご覧ください。
Harbor への Docker 認証を構成します。詳細については、 Harbor レジストリ インスタンスへの Docker 認証を構成するをご覧ください。
Kubernetes イメージ pull Secret を作成する
プライベート Harbor プロジェクトを使用しているため、Kubernetes イメージ pull Secret を作成する必要があります。
サービス アカウントとして機能する Harbor プロジェクト ロボット アカウントを追加します。
Harbor コンソールで、Harbor プロジェクトを選択します。
[ロボット アカウント] をクリックします。
[新しいロボット アカウント] を選択します。
新しいロボット アカウントに名前を付け、追加の設定を定義します。
[追加] をクリックします。
ロボット アカウント名と Secret が成功画面に表示されます。次のステップで参照できるように、この画面を開いたままにします。
詳細については、Harbor のドキュメント( https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account)をご覧ください。
新しいターミナル ウィンドウで、Harbor プロジェクトのロボット アカウントと Secret トークンを使用して Docker にログインします。
docker login ${INSTANCE_URL}プロンプトが表示されたら、Harbor コンソールの成功画面で前のステップで提供されたロボット プロジェクト名を [ユーザー名] に、Secret トークンを [パスワード] に挿入します。
イメージ pull Secret に任意の名前を設定します。
export SECRET=SECRETイメージ pull に必要な Secret を作成します。
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}DOCKER_CONFIGは、.docker/config.jsonファイルのパスに置き換えます。Secret が GDC プロジェクト Namespace に存在することを確認します。
kubectl get secrets -n ${NAMESPACE}出力は次のようになります。
NAME TYPE DATA AGE my-secret kubernetes.io/dockerconfigjson 1 23s
コンテナ イメージをマネージド Harbor レジストリに push する
このチュートリアルでは、nginx ウェブサーバー イメージをダウンロードしてマネージド Harbor レジストリに push し、それを使用してサンプル nginx ウェブサーバー アプリを Kubernetes クラスタにデプロイします。nginx ウェブサーバー アプリは、一般公開されている Docker Hub リポジトリから入手できます。
外部ネットワークを使用して、Docker Hub からローカル ワークステーションに
nginxイメージを pull します。docker pull nginxローカル イメージにレジストリ名でタグ付けします。
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25nginxコンテナ イメージをマネージド Harbor レジストリに push します。docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
Kubernetes クラスタを作成する
nginx コンテナ イメージがマネージド Harbor レジストリに保存され、アクセスできるようになったので、nginx ウェブサーバーを実行する共有 Kubernetes クラスタを作成します。
コンソール
ナビゲーション メニューで、[Kubernetes Engine > クラスタ] を選択します。
[クラスタを作成] をクリックします。
[名前] フィールドに、クラスタの名前を指定します。
Kubernetes クラスタを作成するゾーンを選択します。Kubernetes クラスタはゾーンリソースであり、高可用性を確保するには、各ゾーンで手動で作成する必要があります。
[プロジェクトを接続] をクリックし、クラスタに接続するプロジェクトを選択します。 [保存] をクリックします。
[作成] をクリックします。
クラスタが作成されるまで待ちます。クラスタを使用できる状態になると、クラスタ名の横にステータス
READYが表示されます。
API
Clusterカスタム リソースを作成し、cluster.yamlなどの YAML ファイルとして保存します。apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platformCLUSTER_NAMEの値をクラスタの名前に置き換えます。カスタム リソースを GDC インスタンスに適用します。
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}GDC コンソールを使用して、プロジェクトを Kubernetes クラスタに接続します 。現時点では、API を使用してプロジェクトをクラスタに接続することはできません。
共有 Kubernetes クラスタの作成の詳細については、 共有クラスタを作成するをご覧ください。 使用可能なクラスタ構成オプションの詳細については、 Kubernetes クラスタ構成をご覧ください。
サンプル コンテナアプリをデプロイする
これで、nginx コンテナ イメージを Kubernetes クラスタにデプロイする準備が整いました。
Kubernetes は、アプリケーションを Pod リソースとして表します。これは、1 つ以上のコンテナを保持するスケーラブルな単位です。Pod は、Kubernetes でデプロイ可能な最小単位です。通常は、Pod をレプリカのセットとしてデプロイし、クラスタ全体で一緒にスケーリングと分散を行えます。レプリカのセットをデプロイする 1 つの方法は、Kubernetes の Deployment を使用することです。
このセクションでは、Kubernetes Deployment を作成して、クラスタで nginx コンテナアプリを実行します。この Deployment にはレプリカ(Pod)があります。1 つの Deployment Pod には 1 つのコンテナ(nginx コンテナ イメージ)のみが含まれます。また、クライアントが Deployment の Pod にリクエストを送信するための安定した方法を提供する Service リソースも作成します。
nginx ウェブサーバーを Kubernetes クラスタにデプロイします。
サインイン して Kubernetes クラスタにログインし、ユーザー ID を使用して kubeconfig ファイルを生成します。kubeconfig パスを環境変数として設定します。
export KUBECONFIG=CLUSTER_KUBECONFIG_PATHKubernetes
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 EOFDeployment によって 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
クリーンアップ
このチュートリアルで使用したリソースについて GDC アカウントに課金されないようにするには、作成したリソースを削除する必要があります。
コンテナ イメージを削除する
GDC エアギャップ環境からコンテナ イメージを削除するには、イメージを含む Harbor インスタンスを削除するか、Harbor インスタンスを保持して個々のコンテナ イメージを削除します。
マネージド Harbor レジストリからコンテナ イメージを削除するには、GDC コンソールを使用します。
ナビゲーション メニューで、[CI/CD] セクションから [Harbor Container Registry] を選択します。
[Go to Harbor Instance] 外部リンクをクリックします。
Harbor UI を使用してコンテナ イメージを削除します。詳細については、 Harbor レジストリ インスタンスを削除するをご覧ください。
コンテナアプリを削除する
デプロイされたコンテナアプリを削除するには、リソースを含む GDC プロジェクトを削除するか、GDC プロジェクトを保持して個々のリソースを削除します。
リソースを個別に削除する手順は次のとおりです。
コンテナアプリの
Serviceオブジェクトを削除します。kubectl delete service nginx-service -n ${NAMESPACE}コンテナアプリの
Deploymentオブジェクトを削除します。kubectl delete deployment nginx-deployment -n ${NAMESPACE}このチュートリアル専用にテスト Kubernetes クラスタを作成した場合は、削除します。
kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \ -n platform --kubeconfig ${MANAGEMENT_API_SERVER}これにより、Kubernetes クラスタを構成するリソース(コンピューティング インスタンス、ディスク、ネットワーク リソースなど)が削除されます。
次のステップ
クラスタ アーキテクチャについて学習する。
Kubernetes クラスタにデプロイされたコンテナを管理する方法については、GDC の Kubernetes コンテナ のドキュメントをご覧ください。
コンテナ ワークロードのデプロイ後に Kubernetes クラスタを管理する 方法を学習する。
コンテナ ワークロードやその他のサービス リソースを設定するためのベスト プラクティス を確認する。