使用私有映像注册表

默认情况下,您的 GKE on AWS 安装可以访问公共容器映像。本主题介绍如何将 GKE on AWS 与私有容器映像存储库(例如 Artifact Registry)搭配使用。

从 1.28 版开始,GKE on AWS 提供了一种从 Artifact Registry 或 Container Registry 中拉取私有映像的方法,而无需使用 Kubernetes Secret。如需了解详情,请参阅使用不带 Secret 的私有映像注册表

准备工作

如需执行本页面中的步骤,请先完成以下步骤:

在 Artifact Registry 上查看映像

为完成其余步骤,您需要一个容器映像。执行以下步骤,获取容器映像的名称:

  1. 配置 Docker 命令行工具以使用 Google Cloud SDK 向 Artifact Registry 进行身份验证:

    gcloud auth configure-docker
    

    gcloud 命令行工具会为 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
    

如果您尚未准备好容器映像,请按照部署容器化应用中的步骤创建一个。

创建服务账号

您的集群使用 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 创建 Secret。

      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
    

现在,您可以在工作负载中引用此 Secret。

使用私有映像创建工作负载

如需结合使用私有容器代码库中的映像与工作负载,请将字段 spec.imagePullSecrets 设置为您的 Secret 名称。对于 PodDeployment,此字段位于不同的位置。

创建 pod

如需创建可访问容器注册表的 pod,请将字段 spec.imagePullSecrets 设置为您的 Secret 名称。

  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
    

创建 Deployment

  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. 使用 kubectl pods 确认您的 Deployment 正在运行。

    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

后续步骤