使用私有映像注册表
默认情况下,GKE on Azure 安装可以访问公共容器映像。本主题介绍如何将 GKE on Azure 与私有容器映像代码库(如 Artifact Registry)搭配使用。
准备工作
如需执行本页面中的步骤,请先完成以下步骤:
- 创建集群。
- 创建节点池。
构建 Docker 映像并将其推送到 Artifact Registry。本页面中的示例使用
hello-app
容器。要构建此容器,请按照 GKE on Google Cloud 文档中的步骤构建容器映像并将 Docker 映像推送到 Artifact Registry。
在 Artifact Registry 上查看映像
为完成其余步骤,您需要一个容器映像。执行以下步骤,获取容器映像的名称:
配置 Docker 命令行工具以使用 Google Cloud SDK 向 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 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_NAME
ACCOUNT_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_NAME
ACCOUNT_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 中容器的名称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
如需在 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
使用
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