使用私有映像注册表

本主题介绍如何将 GKE on AWS 与私有容器映像代码库(如 Container Registry (GCR))搭配使用。

准备工作

在开始使用 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 文档中部署容器化应用的步骤构建而成。

私有容器注册表

容器注册表存储和分发容器映像。 默认情况下,GKE on AWS 安装可以访问公共映像。

在 Container Registry 上查看映像

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

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

    gcloud auth configure-docker
    

    Google Cloud CLI 会为 Google 支持的所有 Docker 注册表注册凭据帮助程序。

  2. 使用 docker images 确认您的 Container Registry 包含映像。

    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 创建 Secret。

    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
    

现在,您可以在工作负载中引用此 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: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: secret-name
    

    请替换以下内容:

    • pod-name 替换为您的 pod 的名称
    • container-name 替换为 pod 内容器的名称
    • project-id 替换为您的 Google Cloud 项目
    • secret-name 替换为您的注册表 Secret 名称。

    例如,如需拉取映像 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
    

    创建 Deployment

  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
    

后续步骤