使用私人映像檔註冊資料庫

本主題說明如何搭配私人容器映像檔存放區 (例如 Container Registry (GCR)),在 AWS 上使用 GKE。

事前準備

開始使用 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。本主題中的範例使用 hello-app 容器,該容器是按照 GKE on Google Cloud 說明文件中的「部署容器化應用程式」一節步驟建構而成。

私人 Container Registry

容器登錄檔會儲存及發布容器映像檔。根據預設,GKE on AWS 安裝作業可以存取公開映像檔。

檢查 Container Registry 中的映像檔

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

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

    gcloud auth configure-docker
    

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

  2. 確認 Container Registry 包含 docker images 的映像檔。

    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 建立密鑰。

    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
    

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

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

如要使用私人容器存放區中的映像檔執行工作負載,請將 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: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: secret-name
    

    更改下列內容:

    • pod-name 替換為 Pod 名稱
    • container-name 替換為 Pod 內容器的名稱
    • project-id 專案 Google Cloud
    • secret-name 改為登錄檔密鑰的名稱

    舉例來說,如要提取 hello-app 映像檔,請將下列 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。

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

    建立部署

  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
    

    輸出結果包含三個 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
    

後續步驟