GKE on AWS 提供從 Artifact Registry 或 Container Registry 提取私人映像檔的方法,不必使用 Kubernetes Secret。先前您必須執行下列步驟:
- 建立 Google Identity and Access Management (IAM) 服務帳戶。
- 授予服務帳戶存取私人登錄檔的權限。
- 下載服務帳戶金鑰,並將其儲存為叢集中的 Kubernetes Secret。
- 在 Pod 或 Deployment 的 YAML 資訊清單中參照這個 Secret,即可從私有容器存放區存取映像檔。
- 定期輪替及管理與 Google IAM 服務帳戶相關聯的金鑰。
GKE on AWS 會自動處理提取私有映像檔所需的驗證和授權,免除所有這些手動步驟。
事前準備
如要執行本頁的步驟,請先完成下列事項:
- 建立叢集。
- 建立節點集區。
建立 Docker 映像檔並推送至 Artifact Registry。本頁面的範例使用
hello-app
容器。如要建構這個容器,請按照「建構容器映像檔」和「將 Docker 映像檔推送至 Artifact Registry」一節中的步驟操作,這些步驟位於 GKE on Google Cloud 說明文件中。將 GKE on AWS 升級至 1.28 版,即可從 Artifact Registry 或 Container Registry 提取私人映像檔,不必使用 Kubernetes 密鑰。
檢查 Artifact Registry 中的映像檔
如要完成其餘步驟,您需要容器映像檔。執行下列步驟,取得容器映像檔的名稱:
使用 Google Cloud SDK 設定 Docker 指令列工具,向 Artifact Registry 進行驗證:
gcloud auth configure-docker
Google Cloud CLI 會為所有 Google 支援的 Docker 登錄檔註冊憑證輔助程式。
使用
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,請按照下列步驟操作:
建立不含
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
:圖片版本。
使用
kubectl
將設定套用至叢集:kubectl apply -f YAML_FILE_NAME
將
YAML_FILE_NAME
替換為 YAML 檔案的名稱。
建立不含映像檔提取密鑰的 Pod 範例
以下範例說明如何建立 Kubernetes Pod,而不需映像檔提取密鑰。Pod 會從 Artifact Registry 提取 hello-app
映像檔。
如要提取
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
使用
kubectl
將設定套用至叢集:kubectl apply -f hello-pod.yaml
使用
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,請執行下列步驟:
建立不含
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
:圖片版本。
使用
kubectl
將設定套用到叢集。kubectl apply -f name-of-your-yaml-file.yaml
建立不含映像檔提取密鑰的 Deployment 範例
以下範例說明如何建立不含映像檔提取密鑰的 Deployment。Deployment 會從 Artifact Registry 提取 hello-app
映像檔。
建立名為
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 (存放區與叢集不在同一專案中)」一文,瞭解其他步驟。
使用
kubectl
將設定套用到叢集。kubectl apply -f hello-deployment.yaml
確認 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
ROLE
:roles/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 檔案名稱。