使用私人映像檔登錄檔,但不使用密鑰

GKE on AWS 提供從 Artifact Registry 或 Container Registry 提取私人映像檔的方法,不必使用 Kubernetes Secret。先前您必須執行下列步驟:

  1. 建立 Google Identity and Access Management (IAM) 服務帳戶。
  2. 授予服務帳戶存取私人登錄檔的權限。
  3. 下載服務帳戶金鑰,並將其儲存為叢集中的 Kubernetes Secret。
  4. 在 Pod 或 Deployment 的 YAML 資訊清單中參照這個 Secret,即可從私有容器存放區存取映像檔。
  5. 定期輪替及管理與 Google IAM 服務帳戶相關聯的金鑰。

GKE on AWS 會自動處理提取私有映像檔所需的驗證和授權,免除所有這些手動步驟。

事前準備

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

檢查 Artifact Registry 中的映像檔

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

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

    gcloud auth configure-docker
    

    Google Cloud CLI 會為所有 Google 支援的 Docker 登錄檔註冊憑證輔助程式。

  2. 使用 docker images 指令確認 Artifact Registry 中是否包含映像檔:

    docker images
    

    Docker 會連線至 Artifact Registry,並傳回存放區中可用的映像檔。舉例來說,下列回應會在 us-west1-docker.pkg.dev 上顯示 PROJECT_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
    

如果沒有可用的容器映像檔,請按照「部署容器化應用程式」一文中的步驟建立。

建立使用私人映像檔的 Pod,但不需要映像檔提取密鑰

如要建立可從登錄檔存取私人容器映像檔的 Pod,您不再需要在 Pod 規格中提供 spec.imagePullSecrets 欄位。如要設定 Pod,請按照下列步驟操作:

  1. 建立不含 spec.imagePullSecrets 欄位的 Pod 定義:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    更改下列內容:

    • POD_NAME:Pod 的名稱。
    • CONTAINER_NAME:Pod 內的容器名稱。
    • LOCATION:包含登錄檔的 Google Cloud 區域。例如:us-west1
    • PROJECT_NAME:代管 Artifact Registry 存放區的 Google 專案名稱,可能與叢集的專案相同。如果存放區位於不同專案,請參閱「使用 Artifact Registry (如果與叢集不在同一專案)」一文,瞭解其他步驟。
    • REPOSITORY_NAME:存放區名稱。
    • IMAGE_NAME:圖片名稱。
    • IMAGE_VERSION:圖片版本。
  2. 使用 kubectl 將設定套用至叢集:

    kubectl apply -f YAML_FILE_NAME
    

    YAML_FILE_NAME 替換為 YAML 檔案的名稱。

建立不含映像檔提取密鑰的 Pod 範例

以下範例說明如何建立 Kubernetes Pod,而不需映像檔提取密鑰。Pod 會從 Artifact Registry 提取 hello-app 映像檔。

  1. 如要提取 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
    
  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
    

使用私有映像檔建立部署作業,不需映像檔提取密鑰

如要建立可從登錄檔存取私人容器映像檔的部署作業,您不再需要在部署作業規格中提供 spec.imagePullSecrets 欄位。如要設定 Deployment,請執行下列步驟:

  1. 建立不含 spec.imagePullSecrets 欄位的 Deployment 定義:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: DEPLOYMENT_NAME
    spec:
      replicas: NUMBER_OF_REPLICAS
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    更改下列內容:

    • DEPLOYMENT_NAME:Deployment 的名稱。
    • NUMBER_OF_REPLICAS:在任何指定時間,應執行的 Deployment 中 Pod 執行個體數量。
    • CONTAINER_NAME:Pod 內的容器名稱。
    • LOCATION:包含登錄檔的 Google Cloud 區域。例如:us-west1
    • PROJECT_NAME:代管 Artifact Registry 存放區的 Google 專案名稱,可能與叢集的專案不同。如果存放區位於不同專案,請參閱「使用 Artifact Registry (如果與叢集不在同一專案)」一文,瞭解其他步驟。
    • REPOSITORY_NAME:存放區名稱。
    • IMAGE_NAME:圖片名稱。
    • IMAGE_VERSION:圖片版本。
  2. 使用 kubectl 將設定套用到叢集。

    kubectl apply -f name-of-your-yaml-file.yaml
    

建立不含映像檔提取密鑰的 Deployment 範例

以下範例說明如何建立不含映像檔提取密鑰的 Deployment。Deployment 會從 Artifact Registry 提取 hello-app 映像檔。

  1. 建立名為 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"
    

    更改下列內容:

    • LOCATION:包含登錄檔的 Google Cloud 區域。例如:us-west1
    • PROJECT_NAME:代管 Artifact Registry 存放區的 Google 專案名稱,可能與叢集的專案不同。如果存放區位於不同專案中,請參閱「使用 Artifact Registry (存放區與叢集不在同一專案中)」一文,瞭解其他步驟。
  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
    

如果 Artifact Registry 與叢集不在同一個專案中,請使用 Artifact Registry

如要使用與叢集所在 Google 專案不同的 Artifact Registry 存放區,請執行下列步驟:

為叢集節點集區虛擬機器執行個體的服務帳戶 (又稱節點集區機器服務代理程式) 授予存取這個登錄檔的必要權限。

gcloud projects add-iam-policy-binding AR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

這個步驟可確保叢集能從該獨立專案的登錄檔擷取構件。

更改下列內容:

  • AR_PROJECT_ID:代管 Artifact Registry 的 Google 專案 ID。
  • NODE_POOL_MACHINE_SERVICE_AGENT:叢集節點集區的服務帳戶,格式如下:service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLEroles/artifactregistry.reader 角色或自訂角色,授予足夠的權限,可存取 Artifact Registry 存放區中的映像檔。

使用私人的 Google Container Registry

如要將私有 Google Container Registry 與 GKE on AWS 叢集整合,請按照下列步驟操作,無論叢集的 Google 專案位置為何:

允許節點集區機器服務代理程式 (叢集節點集區虛擬機器執行個體的服務帳戶) 存取 Container Registry:

gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

這個步驟可讓叢集服務帳戶存取私有容器映像檔。

更改下列內容:

  • GCR_PROJECT_ID:代管 Container Registry 的專案 ID。
  • NODE_POOL_MACHINE_SERVICE_AGENT:節點集區服務帳戶,格式為 service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLE:選擇 storage.objectViewer 或自訂角色,取得足夠的 Container Registry 存取權。請謹慎使用 storage.objectViewer 授予廣泛存取權。

清除所用資源

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

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

更改下列內容:

  • POD_YAML_FILE:您定義 Pod 的 YAML 檔案名稱。
  • DEPLOYMENT_YAML_FILE:定義 Deployment 的 YAML 檔案名稱。

後續步驟