默认情况下,GKE on AWS 安装可以访问公共容器映像。本主题介绍如何将 GKE on AWS 与私有容器映像仓库(如 Artifact Registry)搭配使用。
从 1.28 版开始,GKE on AWS 提供了一种从 Artifact Registry 或 Container Registry 中拉取私有映像的方法,而无需使用 Kubernetes Secret。如需了解详情,请参阅在没有 Secret 的情况下使用私有映像注册表。准备工作
如需执行本页面中的步骤,请先完成以下步骤:
- 创建集群。
- 创建节点池。
构建 Docker 映像并将其推送到 Artifact Registry。本页面中的示例使用
hello-app容器。如需构建此容器,请按照 GKE on Google Cloud 文档中的步骤构建容器映像并将 Docker 映像推送到 Artifact Registry。
在 Artifact Registry 上查看映像
为完成其余步骤,您需要一个容器映像。执行以下步骤,获取容器映像的名称:
配置 Docker 命令行工具以使用 Google Cloud SDK 向 Artifact Registry 进行身份验证:
gcloud auth configure-dockergcloud命令行工具会为 Google 支持的所有 Docker 注册表注册凭据帮助程序。使用
docker images命令确认您的 Artifact Registry 包含映像。docker imagesDocker 连接到 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 Cloud 项目 - 将
ACCOUNT_NAME替换为您的 Google Cloud 服务账号名称
- 将
下载账号的服务账号密钥。
gcloud iam service-accounts keys create registry-access-key.json \ --iam-account ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com替换以下内容:
PROJECT_NAMEACCOUNT_NAME
现在,您可以配置用户集群以连接到 Artifact Registry。
将密钥保存到集群中
如需提供用于向 Artifact Registry 进行身份验证的密钥,请执行以下步骤,将服务账号密钥保存为 Kubernetes Secret:
使用
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_NAMEACCOUNT_NAME
删除服务账号密钥的本地副本。
rm registry-access-key.json
现在,您可以在工作负载中引用此 Secret。
使用私有映像创建工作负载
如需结合使用私有容器代码库中的映像与工作负载,请将字段 spec.imagePullSecrets 设置为您的 Secret 名称。对于 Pod 和 Deployment,此字段位于不同的位置。
创建 pod
如需创建可访问容器注册表的 pod,请将字段 spec.imagePullSecrets 设置为您的 Secret 名称。
创建指定
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 中容器的名称LOCATIONPROJECT_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
如需在 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替换以下内容:
LOCATIONPROJECT_NAME
使用
kubectl将配置应用到集群。kubectl apply -f hello-deployment.yaml使用
kubectl pods确认您的 Deployment 正在运行。kubectl get pods --selector=app=products输出显示三个
Runningpod。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