コンテナ化されたウェブサーバー アプリをデプロイする


このチュートリアルでは、Google Distributed Cloud(GDC)のエアギャップ アプライアンス環境でコンテナ アプリケーションをアップロードし、そのアプリケーションをアプライアンス環境で実行する方法について説明します。このチュートリアルでは、Harbor プロジェクトの作成方法、Harbor へのイメージのアップロード方法、ワークロードの作成方法について説明します。コンテナ化されたワークロードは、プロジェクトの Namespace 内で実行されます。

GDC エアギャップ アプライアンス環境には、tear という GDC プロジェクトに tear-harbor という事前構成済みの Harbor レジストリが用意されています。この例では、このレジストリを使用します。

このチュートリアルでは、 Google CloudArtifact Registry から入手できるサンプル ウェブサーバー アプリを使用します。

目標

  • コンテナ イメージをマネージド Harbor レジストリに push します。
  • サンプル コンテナアプリをクラスタにデプロイします。

始める前に

  1. コンテナ化されたデプロイを管理するプロジェクトがあることを確認します。プロジェクトがない場合は、プロジェクトを作成します。

  2. プロジェクトの Namespace を環境変数として設定します。

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. gdcloud CLI をダウンロードしてインストールします

  4. 組織の IAM 管理者に次のロールの付与を依頼します。

    • プロジェクトの Namespace の Namespace 管理者ロール(namespace-admin)。このロールは、プロジェクトにコンテナ ワークロードをデプロイするために必要です。

    • プロジェクト Namespace の Harbor インスタンス閲覧者ロール(harbor-instance-viewer)。このロールは、Harbor インスタンスを表示して選択するために必要です。

    • プロジェクト Namespace の Harbor プロジェクト作成者ロール(harbor-project-creator)。このロールは、Harbor プロジェクトにアクセスして管理するために必要です。

  5. Kubernetes クラスタにログインし、ユーザー ID を使用して kubeconfig ファイルを生成します。kubeconfig パスを環境変数として設定していることを確認します。

    export KUBECONFIG=CLUSTER_KUBECONFIG
    

レジストリに Harbor プロジェクトを作成する

GDC は Harbor as a Service を提供します。これは、Harbor を使用してコンテナ イメージを保存および管理できるフルマネージド サービスです。

Harbor as a Service を使用するには、tear-harbor レジストリ インスタンス内に Harbor プロジェクトを作成して、コンテナ イメージを管理する必要があります。

  1. tear-harbor の URL が必要です。インスタンスの URL を一覧表示します。

    gdcloud harbor instances describe tear-harbor --project=tear
    

    出力は harbor-1.org-1.zone1.google.gdc.test のようになります。

  2. チュートリアルの後半で使用する変数としてインスタンス URL を設定します。

    export INSTANCE_URL=INSTANCE_URL
    
  3. プロジェクトを作成する前に、前の手順の URL を使用して Harbor にログインする必要があります。ブラウザを使用してこの URL を開き、Harbor インスタンスにログインします。

  4. Harbor プロジェクトを作成します。

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=tear \
        --instance=tear-harbor
    

    HARBOR_PROJECT は、作成する Harbor プロジェクトの名前に置き換えます。Harbor プロジェクトは、どのプロジェクト Namespace にも作成できません。tear プロジェクトを使用する必要があります。

  5. このチュートリアルの後半で使用する変数として、Harbor プロジェクト名を設定します。

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Configure Docker

Harbor レジストリで Docker を使用するには、次の手順を行います。

  1. Harbor as a Service を信頼するように Docker を構成します。詳細については、Harbor ルート CA を信頼するように Docker を構成するをご覧ください。

  2. Harbor に対する Docker 認証を構成します。詳細については、Harbor レジストリ インスタンスに対する Docker 認証を構成するをご覧ください。

  3. tear-harbor は事前構成済みの Harbor レジストリであるため、Google Distributed Cloud のエアギャップ内部 CA によって署名された証明書を信頼する必要があります。

    1. IO に以下の情報を尋ねます。

      1. Harbor クラスタの外部 URL。
      2. Google Distributed Cloud エアギャップ内部 CA の .crt ファイル。通常、このファイルはコントロール プレーンに anthos-creds Namespace の trust-store-internal-only という名前の Secret として保存されます。
    2. 前の手順と同様に、Harbor クラスタの外部 URL の名前でフォルダを作成し、.crt ファイルをフォルダ内に保持します。

Kubernetes イメージ pull シークレットを作成する

非公開の Harbor プロジェクトを使用しているため、Kubernetes イメージ pull シークレットを作成する必要があります。

  1. Harbor プロジェクトのロボット アカウントを追加します。Harbor UI の手順に沿って、ロボット アカウントを作成し、ロボット シークレット トークンをコピーします。https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account

  2. 新しいロボット プロジェクトのアカウント名をメモします。構文は次のとおりです。

    <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)をご覧ください。

  3. Harbor プロジェクトのロボット アカウントとシークレット トークンを使用して Docker にログインします。

    docker login ${INSTANCE_URL}
    

    プロンプトが表示されたら、Username にロボット プロジェクトのアカウント名を挿入し、Password にシークレット トークンを挿入します。

  4. イメージ pull シークレットに任意の名前を設定します。

    export SECRET=SECRET
    
  5. イメージ 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 から入手できます。

  1. 外部ネットワークを使用して、 Google Cloud Artifact Registry からローカル ワークステーションに nginx イメージを pull します。

    docker pull gcr.io/cloud-marketplace/google/nginx:1.25
    
  2. イメージの名前を設定します。完全なイメージ名の形式は次のとおりです。

    ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx
    
  3. ローカル イメージにリポジトリ名でタグ付けします。

    docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  4. 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 ウェブサーバーをデプロイします。

  1. 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
    
  2. デプロイによって 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
    
  3. すべてのネットワーク トラフィックを 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
    
  4. nginx サービスの IP アドレスをエクスポートします。

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  5. curl を使用して nginx サーバーの IP アドレスをテストします。

      curl http://$IP
    

次のステップ

  • コンテナの管理方法については、コンテナのドキュメントをご覧ください。