使用私人映像檔登錄檔

根據預設,AWS 上的 GKE 安裝項目可以存取公開容器映像檔。本主題說明如何搭配私有容器映像檔存放區 (例如 Artifact Registry) 使用 GKE on AWS。

從 1.28 版開始,GKE on AWS 提供從 Artifact Registry 或 Container Registry 提取私人映像檔的方法,不必使用 Kubernetes Secret。詳情請參閱「使用私人映像檔登錄檔,而不使用祕密」。

事前準備

如要執行本頁的步驟,請先完成下列事項:

檢查 Artifact Registry 中的映像檔

如要完成其餘步驟,您需要容器映像檔。執行下列步驟,取得容器映像檔的名稱:

  1. 使用 Google Cloud SDK 設定 Docker 指令列工具,向 Artifact Registry 進行驗證:

    gcloud auth configure-docker
    

    gcloud 指令列工具會為所有 Google 支援的 Docker 登錄檔註冊憑證輔助程式。

  2. 使用 docker images 指令確認 Artifact Registry 包含映像檔。

    docker images
    

    Docker 會連線至 Artifact Registry,並傳回存放區中可用的映像檔。舉例來說,以下回應顯示 us-west1-docker.pkg.devPROJECT_NAME 存放區中名為 hello-app 的容器映像檔。

    REPOSITORY                                                            TAG          IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app   v1           f7cfe0d58569   21 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. 授予服務帳戶 Artifact Registry 權限

    gcloud projects add-iam-policy-binding PROJECT_NAME \
      --member serviceAccount:ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --role roles/artifactregistry.reader
    

    更改下列內容:

    • PROJECT_NAME 專案 Google Cloud
    • ACCOUNT_NAME 改為您的 Google Cloud 服務帳戶名稱
  3. 下載帳戶的服務帳戶金鑰。

    gcloud iam service-accounts keys create registry-access-key.json \
      --iam-account ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
    

    更改下列內容:

    • PROJECT_NAME
    • ACCOUNT_NAME

您現在可以設定使用者叢集,以便連線至 Artifact Registry。

將金鑰儲存至叢集

如要提供金鑰來驗證 Artifact Registry,請按照下列步驟,將服務帳戶金鑰儲存為 Kubernetes Secret

  1. 使用 kubectl 建立密鑰。

      kubectl create secret docker-registry registry-secret \
      --docker-server=LOCATION-docker.pkg.dev \
      --docker-username=_json_key \
      --docker-email=ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --docker-password="$(cat registry-access-key.json)"
    

    更改下列內容:

    • LOCATION:存放區的區域或多區域位置
    • PROJECT_NAME
    • ACCOUNT_NAME
  2. 刪除服務帳戶金鑰的本機副本。

    rm registry-access-key.json
    

您現在可以在工作負載中參照這個密鑰。

使用私人映像檔建立工作負載

如要使用私人容器存放區中的映像檔執行工作負載,請將 spec.imagePullSecrets 欄位設為您的密鑰名稱。這個欄位在 Pod部署作業中位於不同位置。

建立 Pod

如要建立可存取容器登錄的 Pod,請將 spec.imagePullSecrets 欄位設為您的密鑰名稱。

  1. 建立指定 spec.imagePullSecrets 的 Pod。

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
      imagePullSecrets:
      - name: registry-secret
    

    更改下列內容:

    • POD_NAME:Pod 的名稱
    • CONTAINER_NAME:Pod 內的容器名稱
    • LOCATION
    • PROJECT_NAME

    舉例來說,如要提取 hello-app 映像檔,請將下列 YAML 複製到名為 hello-pod.yaml 的檔案中。

    apiVersion: v1
    kind: Pod
    metadata:
      name: hello-pod
    spec:
      containers:
      - name: hello-container
        image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1
      imagePullSecrets:
      - name: registry-secret
    
  2. 使用 kubectl 將設定套用到叢集。

    kubectl apply -f hello-pod.yaml
    
  3. 使用 kubectl get 確認 Pod 正在執行。

    kubectl get pod/hello-pod
    

    回應會包含一個狀態為 Running 的 Pod。

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

建立部署

  1. 如要在 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: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
            env:
            - name: "PORT"
              value: "50001"
          imagePullSecrets:
          - name: registry-secret
    

    更改下列內容:

    • LOCATION
    • PROJECT_NAME
  2. 使用 kubectl 將設定套用到叢集。

    kubectl apply -f hello-deployment.yaml
    
  3. 確認 Deployment 正在執行 kubectl pods

    kubectl get pods --selector=app=products
    

    輸出內容會顯示三個 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
    

清除所用資源

如要移除您在本頁面建立的資源,請執行下列指令:

kubectl apply -f hello-pod.yaml
kubectl delete -f hello-deployment.yaml

後續步驟