非公開イメージ レジストリの使用

このトピックでは、Container Registry(GCR)などの非公開のコンテナ イメージ リポジトリで GKE on AWS を使用する方法について説明します。

始める前に

GKE on AWS の使用を始める前に、次のことを確認してください。

  • 管理サービスをインストールしている。
  • ユーザー クラスタを作成している。
  • anthos-aws ディレクトリから anthos-gke を使用して、コンテキストをユーザー クラスタに切り替えている。
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME をユーザー クラスタ名に置き換えます。
  • Docker イメージをビルドして Container Registry に push します。このトピックの例では、GKE on Google Cloud ドキュメントのコンテナ化されたアプリケーションのデプロイの手順で作成した hello-app コンテナを使用します。

限定公開のコンテナ レジストリ

コンテナ レジストリは、コンテナ イメージを保存し、配布します。デフォルトでは、GKE on AWS のインストールで公開イメージにアクセスできます。

Container Registry のイメージを確認する

残りの手順を完了するには、コンテナ イメージが必要です。次の手順を実行して、コンテナ イメージの名前を取得します。

  1. Docker コマンドライン ツールを構成して、Google Cloud CLI で Container Registry が認証されるようにします。

    gcloud auth configure-docker
    

    Google Cloud CLI は、Google がサポートするすべての Docker レジストリの認証情報ヘルパーを登録します。

  2. docker images というイメージが Container Registry に含まれていることを確認します。

    docker images
    

    Docker は Container Registry に接続し、Container Registry リポジトリにある使用可能なイメージを返します。たとえば、次のレスポンスは project-id リポジトリ内の hello-app という名前のコンテナ イメージを示しています。

    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    gcr.io/project-id/hello-app   v1                  732f02cea7cb        12 minutes ago      11.5MB
    

コンテナ イメージの準備ができていない場合、コンテナ化されたアプリケーションのデプロイの手順で作成します。

サービス アカウントを作成する

ユーザー クラスタは、Identity and Access Management(IAM)サービス アカウントを使用して認証します。

新しいサービス アカウントを作成するには、次の手順を行います。

  1. Google Cloud CLI を使用して IAM サービス アカウントを作成します。

    gcloud iam service-accounts create account-name
    

    account-name を新しい Google Cloudサービス アカウントの名前に置き換えます。

  2. サービス アカウントに Container Registry へのアクセス権を付与します。

    gcloud projects add-iam-policy-binding project-id \
      --member serviceAccount:account-name@project-id.iam.gserviceaccount.com \
      --role roles/storage.objectViewer
    

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

    • project-id を Google Cloud プロジェクトに置き換えます。
    • account-name を Google Cloud サービス アカウント名に置き換えます。
  3. アカウントのサービス アカウントキーをダウンロードします。

    gcloud iam service-accounts keys create key.json \
      --iam-account account-name@project-id.iam.gserviceaccount.com
    

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

    • project-id を Google Cloud プロジェクトに置き換えます。
    • account-name を Google Cloud サービス アカウント名に置き換えます。

これで、Container Registry に接続するユーザー クラスタを構成する準備が整いました。

Kubernetes Secret を定義する

Container Registry に認証用の鍵を提供するには、次の手順でサービス アカウントキーを Kubernetes Secret として保存します。

  1. kubectl を使用して Secret を作成します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl create secret docker-registry gcr-secret \
      --docker-server=gcr.io \
      --docker-username=_json_key \
      --docker-email=account-name@project-id.iam.gserviceaccount.com \
      --docker-password="$(cat key.json)"
    

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

    • project-id を Google Cloud プロジェクトに置き換えます。
    • account-name を Google Cloud サービス アカウント名に置き換えます。
  2. サービス アカウントキーのローカルコピーを削除します。

    rm key.json
    

これにより、ワークロードでこの Secret を参照できます。

限定公開イメージを使用してワークロードを作成する

ワークロードを含む、限定公開のコンテナ リポジトリのイメージを使用するには、spec.imagePullSecrets フィールドにシークレット名を設定します。このフィールドは、PodDeployment のさまざまな場所にあります。

Pod の作成

Container Registry にアクセスできる Pod を作成するには、フィールド spec.imagePullSecrets を Secret 名に設定します。

  1. spec.imagePullSecrets を指定する Pod を作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      - name: container-name
        image: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: secret-name
    

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

    • pod-name を Pod 名に置き換えます。
    • container-name を Pod 内のコンテナの名前に置き換えます。
    • project-id を Google Cloud プロジェクトに置き換えます。
    • secret-name をレジストリ Secret の名前に置き換えます。

    たとえば、イメージ hello-app を pull するには、次の YAML を hello-pod.yaml という名前のファイルにコピーします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: hello-pod
    spec:
      containers:
      - name: hello-container
        image: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: gcr-secret
    
  2. kubectl で、クラスタに構成を適用します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-pod.yaml
    
  3. kubectl get で、Pod が実行されていることを確認します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pod/hello-pod
    

    レスポンスには、ステータスが Running の Pod が 1 つ含まれます。

    NAME        READY   STATUS    RESTARTS   AGE
    hello-pod   1/1     Running   0          15s
    

    Deployment を作成する

  4. Deployment で限定公開リポジトリを使用するには、テンプレート内で imagePullSecret を指定します。

    たとえば、hello-app イメージの Deployment を作成するには、次の内容の hello-deployment.yaml という名前のファイルを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app-deployment
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: "gcr.io/project-id/hello-app:v1"
            env:
            - name: "PORT"
              value: "50001"
          imagePullSecrets:
          - name: gcr-secret
    
  5. kubectl で、クラスタに構成を適用します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-deployment.yaml
    
  6. kubectl pods で、Deployment が実行されていることを確認します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    

    出力には 3 つの Running Pod が含まれます。

    NAME                                    READY   STATUS    RESTARTS   AGE
    hello-app-deployment-67d9c6d98c-b69f2   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-d6k5c   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-p2md5   1/1     Running   0          14m
    

次のステップ