使用 ac 管理镜像
使用 ac 镜像命令处理 Alauda Container Platform Registry 以及
Image API。ACP 4.4 中的 Alauda Container Platform Registry 使用
modern registry 模式,并为 集群提供 Image 和 ImageStream 工作流。
先决条件
- 已安装
ac CLI,并已通过身份验证连接到目标集群。
- Registry 和
image.alauda.io/v1 Image API 可用。
- 你拥有命令所使用的 ImageStream、Image 和工作负载资源所需的权限。
Registry 模式
ac 根据当前集群的 registry 模式选择镜像后端:
检查并设置模式:
ac config get-registry-mode
ac config set-registry-mode modern
在管理 ImageStream、导入镜像、标记镜像,或通过 Image API 图查看 Image
API 使用情况之前,使用 modern 模式。
命令组
管理用途报告、清理和信任验证记录在
管理访问和清理 中。
发现并登录 Registry
打印当前 Registry 模式选定的 Registry 主机:
打印内部主机:
ac registry info --internal
打印从配置的外部路由发现的公共主机:
ac registry info --public
检查 Registry /v2/ 端点是否可访问:
将 Registry 凭证写入默认本地凭证文件:
将凭证写入临时或 CI 认证文件:
mkdir -p /tmp/registry-auth
ac registry login \
--registry registry.example.com \
--to /tmp/registry-auth/config.json
export REGISTRY_AUTH_FILE=/tmp/registry-auth/config.json
预期结果:
- Registry 凭证会写入
/tmp/registry-auth/config.json,后续直接镜像命令可通过 REGISTRY_AUTH_FILE 使用这些凭证。
--to 和 --registry-config(或 -a)用于为 ac registry login 选择输出认证文件。
当 Registry 端点无法从当前计算机访问,但仍需要写入凭证文件时,使用 --skip-check。仅当端点使用 HTTP 或使用客户端不信任的证书时,才使用 --insecure。
管理 ImageStream
创建空的 ImageStream:
ac create imagestream demo
创建启用本地镜像查找的 ImageStream:
ac create imagestream demo --lookup-local
从外部镜像创建 ImageStreamTag:
ac create imagestreamtag demo:latest \
--from-image=source.example.com/source-team/source-app:1.0
将外部镜像导入 ImageStreamTag。不使用 --confirm 时,该命令会预览导入结果。添加 --confirm 以持久化该标签:
ac import-image demo:latest \
--from=source.example.com/source-team/source-app:1.0 \
--confirm
验证已持久化的 ImageStreamTag:
ac get imagestreamtags demo:latest -o yaml
预期结果:
- ImageStreamTag 包含导入的镜像引用和摘要。
常用导入选项:
将外部镜像标记到 ImageStreamTag:
ac tag source.example.com/source-team/source-app:1.0 demo:latest
将一个 ImageStreamTag 后的当前镜像复制到另一个 ImageStreamTag:
ac tag --source=imagestreamtag team-a/demo:stable team-b/demo:latest
使用标签选项控制跟踪和导入行为:
ac tag --source=imagestreamtag --alias team-a/demo:stable team-a/demo:latest
ac tag --source=imagestreamtag --reference team-a/demo:stable team-a/demo:latest
ac tag source.example.com/source-team/source-app:latest demo:latest \
--scheduled \
--insecure \
--reference-policy=local \
--import-mode=PreserveOriginal
--alias 要求源和目标位于同一个 ImageStream 中。--scheduled 和
--insecure 选项适用于外部镜像源。
删除标签:
为一个 ImageStream 启用本地镜像查找:
禁用本地镜像查找:
ac set image-lookup demo --enabled=false
列出本地查找状态:
ac set image-lookup --list
根据当前 ImageStreamTag 的拉取规范设置工作负载镜像:
ac set image deployment/my-app app=team-a/demo:latest --source=imagestreamtag -n team-a
根据 ImageStreamImage 摘要设置工作负载镜像:
ac set image deployment/my-app app=team-a/demo@sha256:<digest> \
--source=imagestreamimage -n team-a
验证工作负载更新:
kubectl -n team-a rollout status deployment/my-app --timeout=300s
kubectl -n team-a get deployment my-app -o jsonpath='{.spec.template.spec.containers[?(@.name=="app")].image}{"\n"}'
预期结果:
- Deployment 使用从 ImageStream 资源解析出的拉取规范,并且 rollout 成功完成。
查询 Image 和 ImageStream
列出 ImageStream:
显示 ImageStream:
ac get imagestreams demo -n team-a -o yaml
显示某个标签的当前摘要和标签历史记录:
ac get imagestreamtags demo:latest -n team-a -o wide
按摘要显示 ImageStreamImage 元数据:
ac get imagestreamimages demo@sha256:<digest> -n team-a -o yaml
通过集成的 Registry 命令列出 Image:
在 modern 模式下,ac get images 会列出集群范围的 Image 资源,其中包含 NAME 和 IMAGE REFERENCE 列。
使用结构化输出:
ac get images -o yaml
ac get images -o json
删除 Image 引用
首选的 Registry 工作流是删除 ImageStream 标签:
ac delete images 命令遵循选定的 Registry 模式。除非设置了 --confirm,否则该命令仅执行试运行:
ac delete images --repo team-a/demo:old
ac delete images --repo team-a/demo:old --confirm
使用多个 --repo 标志删除多个标签引用:
ac delete images \
--repo team-a/demo:old \
--repo team-a/api:canary \
--confirm
删除 Image 引用不一定会立即释放 blob 存储空间。需要回收存储空间时,请分别运行 Image pruning 和 Registry 垃圾回收。
直接处理 OCI Image
显示 Registry 中的 Image 元数据:
ac image info registry.example.com/team-a/demo:latest \
--registry-config="$REGISTRY_AUTH_FILE"
从多架构 Image 中选择一个平台:
ac image info external-registry.example.com/base/base-app:latest \
--filter-by-os=linux/arm64 \
--registry-config="$REGISTRY_AUTH_FILE"
显示 manifest 列表条目:
ac image info registry.example.com/team-a/demo:latest \
--show-multiarch \
--registry-config="$REGISTRY_AUTH_FILE"
将一个 Image 复制到另一个标签:
ac image mirror \
registry.example.com/team-a/demo:latest \
registry.example.com/team-a/demo:stable \
--registry-config="$REGISTRY_AUTH_FILE"
根据映射文件复制多个 Image:
cat > mirror-map.txt <<EOF
source-registry.example.com/team-a/demo:latest=registry.example.com/team-a/demo:latest
source-registry.example.com/team-a/api:v1=registry.example.com/team-a/api:v1
EOF
ac image mirror \
-f mirror-map.txt \
--dry-run \
--keep-manifest-list
ac image mirror \
-f mirror-map.txt \
--continue-on-error \
--keep-manifest-list \
--max-per-registry=4 \
--skip-missing \
--filter-by-os=linux/amd64 \
--registry-config="$REGISTRY_AUTH_FILE"
如果找不到输入 Image,--skip-missing 会继续执行。--filter-by-os 选择请求的平台;当目标必须保持为包含所选平台条目的多架构 manifest 列表时,将其与 --keep-manifest-list 结合使用。
验证复制的 Image:
ac image info registry.example.com/team-a/demo:stable \
--registry-config="$REGISTRY_AUTH_FILE"
向 Image 添加层或元数据并推送结果:
ac image append \
--from external-registry.example.com/base/base-app:latest \
--to registry.example.com/team-a/base-app:patched \
layer.tar.gz \
--registry-config="$REGISTRY_AUTH_FILE"
预览追加操作:
ac image append \
--from external-registry.example.com/base/base-app:latest \
--to registry.example.com/team-a/base-app:patched \
layer.tar.gz \
--dry-run \
--registry-config="$REGISTRY_AUTH_FILE"
--image 选项会将 JSON 对象合并到运行时 Image 配置中。--meta 选项会将 JSON 对象合并到顶层 Image 元数据中。也可以使用 --drop-history 或 --created-at 而不添加层:
ac image append \
--from external-registry.example.com/base/base-app:latest \
--to registry.example.com/team-a/base-app:annotated \
--image='{"Entrypoint":["/app/start"]}' \
--meta='{"author":"team-a"}' \
--created-at=2024-01-01T00:00:00Z \
--registry-config="$REGISTRY_AUTH_FILE"
ac image append \
--from external-registry.example.com/base/base-app:latest \
--to registry.example.com/team-a/base-app:no-history \
--drop-history \
--keep-manifest-list \
--registry-config="$REGISTRY_AUTH_FILE"
预期结果:
ac image append 会推送生成的 Image,或者使用 --dry-run 打印计划执行的操作。
--keep-manifest-list 会保留多架构索引,同时将追加操作应用于匹配的平台 Image。
从 Image 中提取文件,无需本地容器运行时:
ac image extract external-registry.example.com/base/base-app:latest \
--path /:/tmp/base-app \
--confirm \
--registry-config="$REGISTRY_AUTH_FILE"
将选定的文件提取到当前目录:
ac image extract external-registry.example.com/base/base-app:latest \
--file /etc/app/config.yaml \
--registry-config="$REGISTRY_AUTH_FILE"
预览提取操作而不写入文件:
ac image extract external-registry.example.com/base/base-app:latest \
--path /:/tmp/base-app \
--dry-run \
--registry-config="$REGISTRY_AUTH_FILE"
预期结果:
--file 会将请求的文件写入当前目录。
--dry-run 会列出将要提取的文件,并且不会写入 Image 内容。
仅在测试 Registry、HTTP 端点或客户端不信任的私有证书中,对 ac image 命令使用 --insecure。