根據預設,AWS 上的 GKE 安裝項目可以存取公開容器映像檔。本主題說明如何搭配私有容器映像檔存放區 (例如 Artifact Registry) 使用 GKE on AWS。
從 1.28 版開始,GKE on AWS 提供從 Artifact Registry 或 Container Registry 提取私人映像檔的方法,不必使用 Kubernetes Secret。詳情請參閱「使用私人映像檔登錄檔,而不使用祕密」。事前準備
如要執行本頁的步驟,請先完成下列事項:
- 建立叢集。
- 建立節點集區。
建立 Docker 映像檔並推送至 Artifact Registry。本頁面的範例使用
hello-app
容器。如要建構這個容器,請按照「建構容器映像檔」和「將 Docker 映像檔推送至 Artifact Registry」一節中的步驟操作,這些步驟位於 GKE on Google Cloud 說明文件中。
檢查 Artifact Registry 中的映像檔
如要完成其餘步驟,您需要容器映像檔。執行下列步驟,取得容器映像檔的名稱:
使用 Google Cloud SDK 設定 Docker 指令列工具,向 Artifact Registry 進行驗證:
gcloud auth configure-docker
gcloud
指令列工具會為所有 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
如果沒有現成的容器映像檔,請按照「部署容器化應用程式」一文中的步驟建立。
建立服務帳戶
叢集會使用 Identity and Access Management (IAM) 服務帳戶進行驗證。
如要建立新的服務帳戶,請按照下列步驟操作:
使用 Google Cloud CLI 建立 IAM 服務帳戶。
gcloud iam service-accounts create ACCOUNT_NAME
將 ACCOUNT_NAME 改為新服務帳戶的名稱。 Google Cloud
授予服務帳戶 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 CloudACCOUNT_NAME
改為您的 Google Cloud 服務帳戶名稱
下載帳戶的服務帳戶金鑰。
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:
使用
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
刪除服務帳戶金鑰的本機副本。
rm registry-access-key.json
您現在可以在工作負載中參照這個密鑰。
使用私人映像檔建立工作負載
如要使用私人容器存放區中的映像檔執行工作負載,請將 spec.imagePullSecrets
欄位設為您的密鑰名稱。這個欄位在 Pod 和部署作業中位於不同位置。
建立 Pod
如要建立可存取容器登錄的 Pod,請將 spec.imagePullSecrets
欄位設為您的密鑰名稱。
建立指定
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
使用
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
建立部署
如要在 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
使用
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
清除所用資源
如要移除您在本頁面建立的資源,請執行下列指令:
kubectl apply -f hello-pod.yaml
kubectl delete -f hello-deployment.yaml