aibangjuxin / groovy

study groovy
1 stars 0 forks source link

Artifact registry #25

Open aibangjuxin opened 1 year ago

aibangjuxin commented 1 year ago

Google 将于 2023 年 10 月 1 日弃用 Container Registry。所有现有存储库都将被迁移到新的 Artifact Registry。

如果您正在使用 Container Registry,您需要采取一些措施来准备迁移。首先,您需要评估您的存储库需求。您需要确定您需要保留哪些存储库,以及您需要如何访问它们。

如果您需要保留所有存储库,您可以使用 Artifact Registry 的备份和还原功能。您也可以使用 Artifact Registry 的镜像功能将您的存储库镜像到其他存储库。

如果您需要访问特定的存储库,您可以使用 Artifact Registry 的 API。您也可以使用 Artifact Registry 的 Web UI 访问您的存储库。

以下是迁移到 Artifact Registry 的一些提示:

以下是启用和配置 Artifact Registry 的一些步骤:

  1. 创建一个 Google Cloud Platform 项目。
  2. 启用 Artifact Registry 功能。
  3. 创建一个存储库。
  4. 上传镜像到存储库。
  5. 访问镜像。

您可以在此处找到有关 Artifact Registry 的更多文档:

aibangjuxin commented 1 year ago

对于正在使用 Google Container Registry(GCR)的用户,迁移到 Artifact Registry 是一项重要的任务。以下是一些准备工作和迁移细节,以及启用和配置 Artifact Registry 的基本步骤:

准备工作:

  1. 备份镜像: 在开始迁移之前,请确保备份您在 Container Registry 中存储的镜像。这是非常重要的,以防万一。

  2. 了解差异: 详细了解 GCR 和 Artifact Registry 之间的差异。Artifact Registry 提供了更多的功能,例如多区域复制,可以影响您的配置和使用方式。

  3. 权限和凭证: 确保您有足够的权限来进行迁移和配置。您可能需要具有适当权限的服务账号和密钥。

迁移步骤:

  1. 创建 Artifact Registry 存储库: 登录到 Google Cloud Console,导航到 Artifact Registry,并创建一个新的存储库。您可以选择单一区域或多区域存储库,具体取决于您的需求。

  2. 设置 Docker 客户端: 在本地机器上或部署中,确保 Docker 客户端已经配置为使用 Artifact Registry 存储库。您需要更新 ~/.docker/config.json 文件,添加 Artifact Registry 的凭证信息。

  3. 镜像迁移: 使用 docker pulldocker push 命令将现有的 GCR 镜像迁移到 Artifact Registry 存储库。例如:

    docker pull gcr.io/your-project/image:tag
    docker tag gcr.io/your-project/image:tag us-central1-docker.pkg.dev/your-project/repo/image:tag
    docker push us-central1-docker.pkg.dev/your-project/repo/image:tag
  4. 更新部署配置: 如果您的应用程序在 Kubernetes 中运行,确保更新部署配置文件,以使用新的 Artifact Registry 镜像路径。

  5. 测试和监控: 在迁移完成后,确保您的应用程序正常运行。设置监控和日志以便随时检查。

  6. 清理: 在确保一切正常运行后,您可以考虑删除 GCR 中的旧镜像。

请注意,以上是一个简要的迁移概述。详细的操作步骤和文档链接可能会随时间而变化,最好在 Google Cloud 文档中查找最新的迁移指南和配置说明。此外,如果您需要生成与迁移相关的流程图(mermaid 格式),请提供具体的迁移步骤和我将帮助您生成相应的图表。

aibangjuxin commented 1 year ago

对于正在使用Container Registry的用户来说,迁移到Artifact Registry需要进行以下准备工作和细节考虑:

  1. 熟悉Artifact Registry的功能和使用模式。Artifact Registry相比Container Registry功能更全面,支持多种类型的包管理,不仅限于容器镜像。

  2. 评估当前仓库中的资源是否需要迁移,以及迁移的优先级。不必全部同时迁移,可以分阶段迁移。

  3. 确认Artifact Registry的定价计划,是否满足业务需求。Artifact Registry与Container Registry定价上可能有差异。

  4. 配置Artifact Registry实例。这可能需要购买产品、开通项目、设置存储空间等。

  5. 实现镜像迁移脚本。可以使用Google提供的gcloud或者其他第三方工具来实现镜像从Container Registry拉取并推送到Artifact Registry。

  6. 测试迁移后的部署流程。验证Artifact Registry作为镜像仓库是否能正常工作。

  7. 按阶段执行镜像迁移。先迁移非关键镜像,然后再迁移关键镜像。迁移过程中监控可能出现的问题。

  8. 更新镜像地址和引用。确保代码和构建流程已经更新为从Artifact Registry拉取镜像。

  9. 删除空 Container Registry 实例以节省费用。

具体迁移操作步骤,可以参考Google官方文档:

https://cloud.google.com/artifact-registry/docs/migrating

https://cloud.google.com/artifact-registry/docs/pushing-images

希望以上给出的详细检查点和操作链接能帮助您平稳完成从Container Registry到Artifact Registry的迁移工作。如有任何其他问题,请咨询我。

aibangjuxin commented 1 year ago

对于Google宣布将弃用Container Registry(GCR),迁移到Artifact Registry的情况,用户需要注意以下几点进行平稳迁移:

  1. 时间节点

Google表示,Container Registry不会在近期关闭。但建议用户尽快迁移到Artifact Registry,因为Google未来会陆续增加Artifact Registry的功能,减少Container Registry的投入。

  1. 数据迁移

Artifact Registry目前还不支持直接从Container Registry批量迁移镜像。用户需要自己下载镜像并上传到Artifact Registry。

  1. Docker配置

原先Docker指向Container Registry的配置需要修改为指向Artifact Registry,主要是registry域名和认证信息需要变更。

  1. CI/CD pipeline

任何原先关联Container Registry的CI/CD流水线配置也需要切换到Artifact Registry。

  1. 访问控制

Artifact Registry有自己的访问控制机制。需要重新评估镜像的访问控制策略,是否仅限于项目内还是跨项目,谁有上传/下载权限等。

  1. 配额和计费

Artifact Registry的配额和计费模式也与Container Registry不同。上传和存储量有一定免费额度,超过部分收费。需要评估移动后是否会产生额外费用。

  1. API调整

某些直接调用Container Registry API的自定义实现,需要调整为调用Artifact Registry的API。

具体的Artifact Registry配置、使用文档可参考: https://cloud.google.com/artifact-registry/docs/docker/store-docker-container-images

以上都是关键的迁移考量点。通过提前测试和分批迁移,可以实现平稳切换。如有更多疑问,可再次说明。

aibangjuxin commented 1 year ago

Google 即将弃用 Container Registry 并迁移到 Artifact Registry,对于正在使用 Container Registry 的用户来说,下面是一些需要准备的工作和考虑的细节问题:

  1. 了解 Artifact Registry 的基本概念和使用方法:了解 Artifact Registry 的基本概念、feature 和使用方法,以便快速适应新的迁移环境。
  2. 检查当前的Container Registry 用法:检查当前的 Container Registry 用法,包括container 的etyipe、version 和tag 等信息,以及Container Registry 中的存储bucket 和 Storage 配置等。
  3. 准备 Artifact Registry 的存储空间:在 Artifact Registry 中创建相应的存储空间,以便容纳迁移后的容器镜像。
  4. 配置 Artifact Registry 的访问权限:配置 Artifact Registry 的访问权限,以确保只有已授权的用户可以访问和操作容器镜像。
  5. 迁移 Container Registry 的数据:使用 Google Cloud 提供的工具或API 将 Container Registry 的数据迁移到 Artifact Registry 中。
  6. 验证迁移后的容器镜像:在 Artifact Registry 中验证迁移后的容器镜像是否正确地展示,并确保它们可以正常地被解析和运行。
  7. 更新相关的配置和脚本:更新相关的配置和脚本,以反映变化的容器镜像存储位置和访问方式。
  8. 培训团队成员:培训团队成员,以便他们可以使用 Artifact Registry 并了解相关的流程和规范。

平滑迁移到新的 Artifact Registry 需要考虑以下几个方面:

  1. 规划迁移时间:选择合适的时间进行迁移,以免对生产环境造成影响。
  2. 备份数据:在迁移之前,确保备份 Container Registry 中的数据,以防数据丢失或损坏。
  3. 测试迁移:在迁移前,测试迁移过程,以确保无误并且可以快速恢复。
  4. 监控迁移进度:监控迁移进度,以确保迁移完成并且没有error。
  5. 文档和资源:保持文档和资源的完整性,以便团队成员可以快速理解和适应新的迁移环境。

下面是一些帮助您进行迁移的资源和文档:

  1. Google Cloud Artifact Registry 官方文档:https://cloud.google.com/artifact-registry/docs
  2. Google Cloud Container Registry 迁移到 Artifact Registry 的官方文档:\<https://cloud.google.com/container-registry/
aibangjuxin commented 1 year ago

您好,感谢您使用 Google Cloud。 关于 Container Registry 升级到 Artifact Registry 的迁移,我建议您可以注意以下几点:

  1. 时间安排 - Google 表示将在 2023 年底前完成 Container Registry 到 Artifact Registry 的迁移,所以您有充足的时间规划迁移。

  2. 功能差异 - Artifact Registry 提供了比 Container Registry 更丰富的功能,但基本的镜像管理功能是完全兼容的。您可以参考文档来了解两者之间的区别。

  3. 镜像仓库 - 您当前 Container Registry 中的镜像仓库将自动迁移到新的 Artifact Registry 中。

  4. 权限控制 - 如果您在 Container Registry 使用 IAM 来进行权限控制,需要重新配置 Artifact Registry 的权限策略。

  5. 工具集成 - 使用 Container Registry 的 CI/CD 工具等需要重新配置为 Artifact Registry。

  6. 客户端工具 - 如 Docker 客户端需要升级到支持 Artifact Registry 的版本。

  7. 访问方式 - Artifact Registry 支持域名访问,这需要您在使用客户端工具时进行调整。

具体的迁移步骤和 Artifact Registry 的使用配置,建议您参考 Google 官方文档:

https://cloud.google.com/artifact-registry/docs/docker/migrate-from-gcr

https://cloud.google.com/artifact-registry/docs/docker/store-docker-container-images

如果在迁移过程中遇到任何问题,也欢迎您在文档中提供反馈或者联系 Google 技术支持。谢谢!

aibangjuxin commented 1 year ago

当您需要将一组镜像标签从一个镜像仓库迁移到另一个仓库时,可以编写一个Shell脚本来自动执行这个任务。下面是一个示例脚本,它将获取正在运行的GKE Pod的镜像列表,并为每个镜像重新打标签并推送到新的镜像仓库:

#!/bin/bash

# 设置源和目标仓库
source_repository="gcr.io/your-project"
target_repository="us-central1-docker.pkg.dev/your-project/repo"

# 获取运行中的GKE Pod的镜像列表并逐个处理
kubectl get pods -A -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | while read -r image; do
    # 提取镜像的名称和标签
    image_name=$(echo "$image" | cut -d ':' -f 1)
    image_tag=$(echo "$image" | cut -d ':' -f 2)

    # 构建新的标签
    new_image="$target_repository/${image_name##*/}:$image_tag"

    # 打标签并推送
    docker tag "$source_repository/$image" "$new_image"
    docker push "$new_image"

    # 输出信息
    echo "镜像 $image 已重新打标签为 $new_image 并推送到 $target_repository"
done

请注意以下几点:

使用这个脚本,您可以自动将一组镜像从一个仓库迁移到另一个仓库。确保脚本具有执行权限 (chmod +x script.sh) 并在适当的环境中运行它。

aibangjuxin commented 9 months ago

gcrane是Google开源的一个命令行工具,用于操作容器镜像。它是go-containerregistry项目的一部分,主要用于在不同的容器镜像库之间复制镜像。以下是gcrane的一些常见用法:

  1. 复制镜像:gcrane cp <源镜像> <目标镜像>。这是gcrane的主要功能,可以将一个镜像从一个容器镜像库复制到另一个容器镜像库。在上面的脚本中,这个命令被用来复制源注册表中的镜像到目标注册表。例如,./gcrane cp "${REGISTRY}/${IMAGE}@$digest" "${TARGET_REGISTRY}/${IMAGE}@$digest"将源注册表中的一个镜像复制到目标注册表。

  2. 列出镜像:gcrane ls <镜像库>。这个命令可以列出一个容器镜像库中的所有镜像。

  3. 删除镜像:gcrane delete <镜像>。这个命令可以删除一个容器镜像库中的镜像。

  4. 拉取镜像:gcrane pull <镜像> <本地文件>。这个命令可以将一个容器镜像库中的镜像拉取到本地。

  5. 推送镜像:gcrane push <本地文件> <镜像>。这个命令可以将本地的一个镜像文件推送到容器镜像库。

  6. 导出镜像:gcrane export <镜像> <本地文件>。这个命令可以将一个容器镜像库中的镜像导出为一个本地文件。

  7. 导入镜像:gcrane import <本地文件> <镜像>。这个命令可以将一个本地文件导入到容器镜像库作为一个镜像。

需要注意的是,gcrane的命令需要在具有网络连接和足够权限的环境中运行,例如在Google Cloud Shell或者一个配置了Google Cloud SDK的本地环境中。在使用gcrane之前,可能需要先进行身份验证,例如通过gcloud auth login命令登录Google Cloud账户[2][3]。

Citations: [1] https://zhuanlan.zhihu.com/p/465944214?utm_id=0 [2] https://cloud.google.com/artifact-registry/docs/docker/copy-images?hl=zh-cn [3] https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn [4] https://blog.csdn.net/haolipengzhanshen/article/details/123293532 [5] https://gocrane.io/zh-cn/docs/tutorials/colocation-with-enhanced-qos/qos-customized-metrics-interference-detection-avoidance-and-sorting.zh/

aibangjuxin commented 9 months ago

https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn

aibangjuxin commented 9 months ago

要将Kubernetes部署配置中的image字段的值从gcr更改为Artifact Registry,你可以使用Cloud DNS CNAME记录来实现。具体步骤如下:

  1. 创建CNAME记录:在Google Cloud DNS中,创建一个新的CNAME记录,将你的gcr.io域(例如,eu.gcr.io)指向你的Artifact Registry仓库(例如,europe-west2-docker.pkg.dev)[1]。

  2. 更新Kubernetes部署配置:在你的Kubernetes部署配置中,将image字段的值更改为使用新的CNAME记录的镜像位置。镜像位置的格式仍然是HOSTNAME/PROJECT-ID/REPOSITORY/IMAGE:TAG,但现在的HOSTNAME应该是你的CNAME记录,而不是直接的Artifact Registry仓库[3]。

  3. 重新部署应用:使用更新后的Kubernetes部署配置重新部署你的应用。这将使Kubernetes从通过CNAME记录指向的Artifact Registry仓库拉取镜像。

这种方法可以让你在不更改Kubernetes部署配置中的HOSTNAME的情况下,将image从gcr迁移到Artifact Registry。但请注意,这需要你的Kubernetes集群能够解析新的CNAME记录,这可能需要在集群的DNS配置中进行一些调整。

Sources [1] 推送和拉取映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling?hl=zh-cn [2] 使用Cloud Code、Cloud Build、Google Cloud Deploy 和GKE 开发和交付应用 | 云架构中心 https://cloud.google.com/architecture/app-development-and-delivery-with-cloud-code-gcb-cd-and-gke?hl=zh-cn [3] How pull image from GCP Artifact Registry in k8s deployment.yaml? - Stack Overflow https://stackoverflow.com/questions/74752047/how-pull-image-from-gcp-artifact-registry-in-k8s-deployment-yaml [4] Deploying from Artifact Registry to GKE - YouTube https://youtube.com/watch?v=BfS7mvPA-og [5] Manually upgrading a cluster or node pool | Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/how-to/upgrading-a-cluster

By Perplexity at https://www.perplexity.ai/search/9dadec34-ab44-4f1a-bff8-aa83a4a0ce98

aibangjuxin commented 9 months ago

在Kubernetes(K8S)中,rs 指的是 ReplicaSet,它是用于确保指定数量的 Pod 实例在集群中运行的控制器。ReplicaSetDeployment 的底层实现之一。

如果在 Deployment 变化后,你想继续使用原来的 ReplicaSet,你可以通过 kubectl 进行滚动更新。使用以下命令,假设 deployment-name 是你的 Deployment 名称:

kubectl rollout undo deployment deployment-name

这会将 Deployment 回滚到之前的版本,同时保留原来的 ReplicaSet

aibangjuxin commented 9 months ago

如果你想替换 Deployment 中的镜像而又不希望生成新的 ReplicaSet,你可以使用 kubectlset image 命令,并指定 --record 选项来记录这次的修改。这会确保修改被记录在 Deployment 的注释中,而不会触发新的 ReplicaSet

以下是一个示例命令:

kubectl set image deployment/deployment-name container-name=new-image --record

请确保将 deployment-name 替换为你的 Deployment 名称,container-name 替换为实际容器的名称,而 new-image 替换为你想要使用的新镜像。

这样做会更新 Deployment,并保留现有的 ReplicaSet,只替换容器中的镜像。

aibangjuxin commented 9 months ago

要将 Google Container Registry (GCR) 中的镜像复制到 Artifact Registry,您可以使用 gcrane 工具。这个工具可以使用单个命令复制镜像集,包括指定路径下的所有镜像或存储在项目中多区域主机上的所有镜像[1]。

以下是使用 gcrane 工具复制镜像的步骤:

  1. 首先,确保您已在 Artifact Registry 中为要复制的镜像创建了 Docker 代码库,并且您拥有所需的权限,包括 Artifact Registry Reader (roles/storage.objectViewer) 和 Artifact Registry Writer (roles/artifactregistry.writer)[4]。

  2. 在复制镜像之前,建议移除未标记的旧映像,以降低存储费用。您可以使用 gcr-cleaner 工具来识别并自动移除不再需要的映像[1][4]。

  3. 使用 gcrane 工具复制镜像。例如,要复制已标记的单个映像,可以运行以下命令:

gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE

其中,GCR-LOCATION 是 Container Registry 主机的多区域(asia、eu或us),AR-LOCATION 是代码库的单区域或多区域,PROJECT 是项目 ID[1]。

请注意,如果您要将映像复制到 Artifact Registry 上的 gcr.io代码库,则无需停用自动扫描。但如果您要将映像复制到 pkg.dev Artifact Registry 代码库,请在复制映像之前为 Artifact Registry 停用自动扫描,以防止产生重复的扫描费用[1]。

此外,如果您有大量的工具配置、脚本或代码带有 gcr.io 引用,您可能需要通过更战术性的方法来转换到 Artifact Registry[2]。

Sources [1] 从Container Registry 复制映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn [2] 转换为标准代码库| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/transition/setup-repo?hl=zh-cn [3] 从Container Registry 转换| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr?hl=zh-cn [4] 在代码库之间复制映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/copy-images?hl=zh-cn [5] 删除Google Artifact Registry 上未标记的图像_docker_weixin_0010034-CI/CD - DevPress https://devpress.csdn.net/cicd/62ed4fe3c6770329307f22d0.html [6] k8s.gcr.io 重定向到registry.k8s.io - 你需要知道的 - 云云众生 https://yylives.cc/2023/03/11/image-registry-redirect/ [7] 如何优雅的将Docker Registry中容器镜像迁移至Harbor - 51CTO https://www.51cto.com/article/696219.html [8] 镜像搬运工skopeo https://blog.k8s.li/skopeo.html [9] k8s.gcr.io 重定向到registry.k8s.io - 用户须知 - Kubernetes https://kubernetes.io/zh-cn/blog/2023/03/10/image-registry-redirect/ [10] 镜像搬运工具Skopeo 使用转载 - CSDN博客 https://blog.csdn.net/fly910905/article/details/127438776 [11] 如何从Artifact Registry自动删除图像 - 七牛云 https://www.qiniu.com/qfans/qnso-71952522 [12] 在AWS 中国区方便安全的使用海外公开容器镜像 https://aws.amazon.com/cn/blogs/china/convenient-and-safe-use-of-overseas-public-container-images-in-aws-china/ [13] k8s.gcr.io -> registry.k8s.io:更快、更便宜,且普遍可用(GA) - 腾讯云 https://cloud.tencent.com/developer/article/2242318 [14] Uploading Docker Images to Google Container Registry - YouTube https://youtube.com/watch?v=9CDb9ZSsfV4 [15] Artifact Registry issue - Google Cloud Community https://www.googlecloudcommunity.com/gc/Developer-Tools/Artifact-Registry-issue/m-p/637077 [16] 使用GitHub CI 自动推送镜像到GAR - AHdark Blog https://www.ahdark.blog/som/2107.shtml [17] Configuring Google Container Registry (GCR) as an Artifact Store in GoCD - LinkedIn https://www.linkedin.com/pulse/configuring-google-container-registry-gcr-artifact-store-najiullah

By Perplexity at https://www.perplexity.ai/search/1a115f5c-863c-4ab8-a64c-9ae534a24aca

aibangjuxin commented 9 months ago

要将 Google Container Registry (GCR) 中的镜像复制到 Artifact Registry,您可以使用 gcrane 工具。这个工具可以使用单个命令复制镜像集,包括指定路径下的所有镜像或存储在项目中多区域主机上的所有镜像[1]。

以下是使用 gcrane 工具复制镜像的步骤:

  1. 首先,确保您已在 Artifact Registry 中为要复制的镜像创建了 Docker 代码库,并且您拥有所需的权限,包括 Artifact Registry Reader (roles/storage.objectViewer) 和 Artifact Registry Writer (roles/artifactregistry.writer)[4]。

  2. 在复制镜像之前,建议移除未标记的旧映像,以降低存储费用。您可以使用 gcr-cleaner 工具来识别并自动移除不再需要的映像[1][4]。

  3. 使用 gcrane 工具复制镜像。例如,要复制已标记的单个映像,可以运行以下命令:

gcrane cp GCR-LOCATION.gcr.io/PROJECT/IMAGE \
AR-LOCATION.pkg.dev/PROJECT/REPOSITORY/IMAGE

其中,GCR-LOCATION 是 Container Registry 主机的多区域(asia、eu或us),AR-LOCATION 是代码库的单区域或多区域,PROJECT 是项目 ID[1]。

请注意,如果您要将映像复制到 Artifact Registry 上的 gcr.io代码库,则无需停用自动扫描。但如果您要将映像复制到 pkg.dev Artifact Registry 代码库,请在复制映像之前为 Artifact Registry 停用自动扫描,以防止产生重复的扫描费用[1]。

此外,如果您有大量的工具配置、脚本或代码带有 gcr.io 引用,您可能需要通过更战术性的方法来转换到 Artifact Registry[2]。

Sources [1] 从Container Registry 复制映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn [2] 转换为标准代码库| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/transition/setup-repo?hl=zh-cn [3] 从Container Registry 转换| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr?hl=zh-cn [4] 在代码库之间复制映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/copy-images?hl=zh-cn [5] 删除Google Artifact Registry 上未标记的图像_docker_weixin_0010034-CI/CD - DevPress https://devpress.csdn.net/cicd/62ed4fe3c6770329307f22d0.html [6] k8s.gcr.io 重定向到registry.k8s.io - 你需要知道的 - 云云众生 https://yylives.cc/2023/03/11/image-registry-redirect/ [7] 如何优雅的将Docker Registry中容器镜像迁移至Harbor - 51CTO https://www.51cto.com/article/696219.html [8] 镜像搬运工skopeo https://blog.k8s.li/skopeo.html [9] k8s.gcr.io 重定向到registry.k8s.io - 用户须知 - Kubernetes https://kubernetes.io/zh-cn/blog/2023/03/10/image-registry-redirect/ [10] 镜像搬运工具Skopeo 使用转载 - CSDN博客 https://blog.csdn.net/fly910905/article/details/127438776 [11] 如何从Artifact Registry自动删除图像 - 七牛云 https://www.qiniu.com/qfans/qnso-71952522 [12] 在AWS 中国区方便安全的使用海外公开容器镜像 https://aws.amazon.com/cn/blogs/china/convenient-and-safe-use-of-overseas-public-container-images-in-aws-china/ [13] k8s.gcr.io -> registry.k8s.io:更快、更便宜,且普遍可用(GA) - 腾讯云 https://cloud.tencent.com/developer/article/2242318 [14] Uploading Docker Images to Google Container Registry - YouTube https://youtube.com/watch?v=9CDb9ZSsfV4 [15] Artifact Registry issue - Google Cloud Community https://www.googlecloudcommunity.com/gc/Developer-Tools/Artifact-Registry-issue/m-p/637077 [16] 使用GitHub CI 自动推送镜像到GAR - AHdark Blog https://www.ahdark.blog/som/2107.shtml [17] Configuring Google Container Registry (GCR) as an Artifact Store in GoCD - LinkedIn https://www.linkedin.com/pulse/configuring-google-container-registry-gcr-artifact-store-najiullah

By Perplexity at https://www.perplexity.ai/search/1a115f5c-863c-4ab8-a64c-9ae534a24aca

aibangjuxin commented 9 months ago

如需将映像复制到 Artifact Registry 中,我们建议您使用 gcrane 工具。

gcrane 具有多种优势,包括:

使用单个命令复制映像集,包括指定路径下的所有映像或存储在项目中多区域主机上的所有映像。 跳过已上传的映像层。 在同一 Google Cloud 多区域位置内的 Container Registry 和 Artifact Registry 之间复制映像时的快速复制选项。

https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn

跳过已上传的映像层。Gcrane 工具在复制映像时会自动跳过已上传的映像层,这是其内置的功能,无需用户进行额外的设置 1 2 。这意味着如果你正在复制一个映像,而该映像的某些层已经存在于目标位置,那么 gcrane 将不会再次上传这些层。这可以节省带宽和时间,提高复制效率。 如果你想使用 gcrane 工具,可以按照以下步骤进行安装和使用 1 : 下载 gcrane 工具。你可以从 GitHub 代码库下载 gcrane。 让 gcrane 命令可执行。你可以使用 chmod +x gcrane 命令来实现。 将 gcrane 移动到 /usr/local/bin/ 目录下,以便在任何位置都可以运行它。 运行 gcrane --help 命令以验证安装内容。 使用 gcrane cp 命令复制映像。 请注意,为了最大限度地降低费用并提高复制速度,建议使用与 Container Registry 位于同一多区域位置的 Artifact Registry 代码库 2 。

aibangjuxin commented 9 months ago

Gcrane工具在复制映像时,会自动跳过已上传的映像层[1][2]。这是其内置的功能,无需用户进行额外的设置。这意味着如果你正在复制一个映像,而该映像的某些层已经存在于目标位置,那么gcrane将不会再次上传这些层。这可以节省带宽和时间,提高复制效率。

具体来说,gcrane工具在复制映像时,会首先获取源映像的manifest文件,这个文件包含了映像的所有层的digest(摘要)信息[4]。然后,gcrane会检查目标位置是否已经存在具有相同digest的映像层。如果存在,那么gcrane就会跳过这个映像层的上传。这个过程是自动进行的,用户无需进行任何设置。

因此,gcrane工具通过比较映像层的digest来判断映像层是否已经上传。这种方法既准确又高效,可以大大提高映像复制的效率。

Sources [1] 从Container Registry 复制映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn [2] 在代码库之间复制映像| Artifact Registry 文档 - Google Cloud https://cloud.google.com/artifact-registry/docs/docker/copy-images?hl=zh-cn [3] 如何在Golang 代码里面解析容器镜像-51CTO.COM https://www.51cto.com/article/697935.html [4] 如何在golang代码里面解析容器镜像原创 - CSDN博客 https://blog.csdn.net/yunqiinsight/article/details/122369992 [5] k8s 实战笔记 - 知乎专栏 https://zhuanlan.zhihu.com/p/486585878?utm_id=0

By Perplexity at https://www.perplexity.ai/search/1a115f5c-863c-4ab8-a64c-9ae534a24aca

aibangjuxin commented 9 months ago

https://cloud.google.com/artifact-registry/docs/docker/copy-from-gcr?hl=zh-cn

Gcrane 提供了快速复制选项,以便在从 Container Registry 复制映像到 Artifact Registry 时降低费用并提高复制速度 1 。为了使用快速复制选项,你需要满足以下要求: 使用 gcrane 0.10.0 或更高版本。本文档中的 gcrane 设置说明包括下载最新版本的步骤 1 。 使用与 Container Registry 位于同一多区域位置的 Artifact Registry 代码库。同一多区域中的出站流量不会产生出站流量费用,并且比跨位置复制速度快得多 1 。 你可以在本地机器上运行 gcrane,或者在 Compute Engine 虚拟机实例上运行 gcrane 以复制映像 1 。为了最大限度地降低费用,请在要复制的注册表所在的位置创建实例 1 。

要从 Google Container Registry (GCR) 迁移镜像到 Artifact Registry,可以采用以下方法提高迁移速度: 使用 gcrane 工具:gcrane 是一个推荐的工具,可以使用单个命令复制映像集,包括指定路径下的所有映像或存储在项目中多区域主机上的所有映像。它还可以跳过已上传的映像层,从而提高迁移速度 2 。 在复制映像之前移除未标记的旧映像:移除未标记的映像有助于降低在 Container Registry 中的存储费用,以及将映像从 Container Registry 复制到 Artifact Registry 的费用。您可以使用诸如 gcr-cleaner 工具之类的工具来识别并自动移除不再需要的映像 2 。 在同一 Google Cloud 多区域位置内的 Container Registry 和 Artifact Registry 之间复制映像时,使用快速复制选项:快速复制选项是费用最低的复制方法,因为它不依赖于拉取和推送映像,所以在复制操作期间,Container Registry 的网络出站流量不收费 2 。 遵循这些方法,您可以在保持高效的同时将镜像从 GCR 迁移到 Artifact Registry。

aibangjuxin commented 9 months ago

Google的"skaffold"工具可以帮助您在GCR和Artifact Registry之间同步镜像。Skaffold是一个命令行工具,负责构建、推送和部署应用的工作流程,并提供用于创建CI/CD流水线的构建块 2 。您可以使用skaffold配置文件指定从GCR拉取镜像并将其推送到Artifact Registry的步骤 1 。 在skaffold.yaml文件中,您可以定义构建和部署应用的方式。例如,您可以指定镜像名称、工作空间、以及如何部署应用 1 。Skaffold支持定义多个配置依赖项,这些依赖项可以放在同一个skaffold.yaml文件中,也可以使用YAML文档分隔符进行分隔,也可以放在更高级别的skaffold.yaml文件中引用的不同skaffold.yaml文件中 2 。 Skaffold还支持文件同步功能,可以将指定的文件或目录同步到容器中 3 。例如,您可以在skaffold.yaml文件中的sync部分指定manual同步,用于将所有/static-html HTML文件同步到容器中的static文件夹 3 。 总的来说,使用Skaffold工具可以简化从GCR到Artifact Registry的镜像迁移过程,并提高效率。

aibangjuxin commented 9 months ago

#!/bin/bash

# 读取文件中的关键字
KEYWORDS_FILE="keywords.txt"
KEYWORDS=$(cat ${KEYWORDS_FILE})

# 获取当前集群中的所有deployment
DEPLOYMENTS=$(kubectl get deployments -o json)

# 过滤出与关键字匹配的deployment的image
IMAGES=()
for keyword in ${KEYWORDS}; do
  IMAGES+=($(echo ${DEPLOYMENTS} | jq -r ".items[] | select(.metadata.name | contains(\"${keyword}\")) | .spec.template.spec.containers[].image"))
done

# 推送image到artifact register
for image in ${IMAGES[@]}; do
  # 获取image的名称和标签
  IMAGE_NAME=$(echo ${image} | cut -d ':' -f 1)
  IMAGE_TAG=$(echo ${image} | cut -d ':' -f 2)

  # 推送image
  gcloud artifacts docker images add-tag ${image} ${IMAGE_NAME}@${IMAGE_TAG}

  # 获取原始image和新image的digest
  ORIGINAL_DIGEST=$(docker inspect --format='{{.RepoDigests}}' ${image})
  NEW_DIGEST=$(gcloud artifacts docker images describe ${IMAGE_NAME}@${IMAGE_TAG} --format 'value(image_summary.digest)')

  # 验证digest是否相同
  if [ "${ORIGINAL_DIGEST}" == "${NEW_DIGEST}" ]; then
    echo "Digest verification succeeded for image: ${image}"
  else
    echo "Digest verification failed for image: ${image}"
  fi
done
aibangjuxin commented 9 months ago

为了适应每行一个关键字的文件格式,您可以将原始脚本中的关键字读取部分进行调整。使用while read循环逐行读取文件内容。以下是修改后的脚本:


#!/bin/bash

# 读取文件中的关键字
KEYWORDS_FILE="keywords.txt"

# 获取当前集群中的所有deployment
DEPLOYMENTS=$(kubectl get deployments -o json)

# 过滤出与关键字匹配的deployment的image
IMAGES=()
while read -r keyword; do
  IMAGES+=($(echo ${DEPLOYMENTS} | jq -r ".items[] | select(.metadata.name | contains(\"${keyword}\")) | .spec.template.spec.containers[].image"))
done < ${KEYWORDS_FILE}

# 推送image到artifact register
for image in ${IMAGES[@]}; do
  # 获取image的名称和标签
  IMAGE_NAME=$(echo ${image} | cut -d ':' -f 1)
  IMAGE_TAG=$(echo ${image} | cut -d ':' -f 2)

  # 推送image
  gcloud artifacts docker images add-tag ${image} ${IMAGE_NAME}@${IMAGE_TAG}

  # 获取原始image和新image的digest
  ORIGINAL_DIGEST=$(docker inspect --format='{{.RepoDigests}}' ${image})
  NEW_DIGEST=$(gcloud artifacts docker images describe ${IMAGE_NAME}@${IMAGE_TAG} --format 'value(image_summary.digest)')

  # 验证digest是否相同
  if [ "${ORIGINAL_DIGEST}" == "${NEW_DIGEST}" ]; then
    echo "Digest verification succeeded for image: ${image}"
  else
    echo "Digest verification failed for image: ${image}"
  fi
done
aibangjuxin commented 9 months ago

Enhance


#!/bin/bash

# Purpose: Deploy images based on keywords in a Kubernetes cluster
# Dependencies: jq, kubectl, gcloud

# Check if keywords file exists
KEYWORDS_FILE="keywords.txt"
if [ ! -f "${KEYWORDS_FILE}" ]; then
  echo "Error: Keywords file not found."
  exit 1
fi

# Check if jq and gcloud are installed
if ! command -v jq &> /dev/null || ! command -v gcloud &> /dev/null; then
  echo "Error: jq or gcloud not installed. Please install these dependencies."
  exit 1
fi

# Get all deployments in the current cluster
DEPLOYMENTS=$(kubectl get deployments -o json)

# Process each keyword
IMAGES=()
while read -r keyword; do
  IMAGES+=($(echo "${DEPLOYMENTS}" | jq -r ".items[] | select(.metadata.name | contains(\"${keyword}\")) | .spec.template.spec.containers[].image"))
done < "${KEYWORDS_FILE}"

# Push images to artifact registry and verify digest
for image in "${IMAGES[@]}"; do
  IMAGE_NAME=$(echo "${image}" | cut -d ':' -f 1)
  IMAGE_TAG=$(echo "${image}" | cut -d ':' -f 2)

  # Push image to artifact registry
  gcloud artifacts docker images add-tag "${image}" "${IMAGE_NAME}@${IMAGE_TAG}"

  # Get original and new image digests
  ORIGINAL_DIGEST=$(docker inspect --format='{{.RepoDigests}}' "${image}")
  NEW_DIGEST=$(gcloud artifacts docker images describe "${IMAGE_NAME}@${IMAGE_TAG}" --format 'value(image_summary.digest)')

  # Verify digest equality
  if [ "${ORIGINAL_DIGEST}" == "${NEW_DIGEST}" ]; then
    echo "Digest verification succeeded for image: ${image}"
  else
    echo "Digest verification failed for image: ${image}"
  fi
done
aibangjuxin commented 9 months ago

gcrane是一个用于迁移镜像的工具,但默认情况下不支持并发执行。然而,你可以结合使用其他工具来实现并发复制,比如xargs。以下是一个简单的示例:

gcloud container images list --repository=gcr.io/your-project-id \
  | xargs -n 1 -P 5 -I {} gcrane cp gcr.io/your-project-id/{} eu.gcr.io/your-eu-project-id/{}

这个例子中,-P 5 表示使用5个并发进程。你可以根据实际需求调整并发度,以提高拷贝速度。请确保替换gcr.io/your-project-ideu.gcr.io/your-eu-project-id为你实际的项目ID和目标存储库。

解释一下上面的xargs命令及其参数:

gcloud container images list --repository=gcr.io/your-project-id \
  | xargs -n 1 -P 5 -I {} gcrane cp gcr.io/your-project-id/{} eu.gcr.io/your-eu-project-id/{}

因此,整个命令获取GCR存储库中的镜像列表,以每组5个的方式并发处理它们,并使用gcrane将每个镜像复制到指定的欧洲地区目标存储库。根据具体需求调整存储库路径和并发级别。

aibangjuxin commented 9 months ago

你可以使用echo来打印出文件中的每行内容,然后通过管道将结果传递给xargs执行命令。以下是一个示例:

cat a.txt | xargs -n 1 -P -t -I {} sh -c 'echo {} && ./gcrane digest {}'

这样,它会逐行打印文件内容,然后执行你的命令。

aibangjuxin commented 9 months ago

如果你不想换行,你可以使用printf代替echo,并在printf中指定不换行的格式:

cat a.txt | xargs -n 1 -P -t -I {} sh -c 'printf "{} " && ./gcrane digest {}'

这样就不会自动换行,而是在每行末尾添加空格。

aibangjuxin commented 9 months ago

了解了你的需求。如果你希望在同一行拼接名字和输出结果,你可以将命令的输出与名字拼接在一起。尝试以下命令:

cat a.txt | xargs -n 1 -P -I {} sh -c 'printf "{} " && ./gcrane digest {} | tr -d "\n" && printf "\n"'

这将在一行中拼接名字和输出结果。