Docker映像标签是可变的,因为image:latest
和image:1.0
都可以指向image@sha256:.....
,但是当发布版本1.1
时,image:latest
存储在其中注册表可以指向具有不同sha摘要的图像。现在拉出带有特定标签的图像并不意味着下次将拉出相同的图像。
如果Kubernetes YAM1资源定义按标签(而不是摘要)引用映像,是否有办法确定在部署资源定义之前每个映像将实际解析到什么摘要?使用kustomize或kubectl
支持此功能吗?
用例希望确定在部署到另一环境之前已在某个环境中实际部署了什么(我想对已解析的资源定义进行哈希处理,然后可以使用它来了解是否image:1.0
是部署到PROD的是与部署到UAT的image:1.0
相同。
有没有可用于支持此功能的工具?
例如,给定以下YAML,是否可以用其解析的摘要替换所有图像?
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: image1
image: image1:1.1
command:
- /bin/sh -c some command
- name: image2
image: image2:2.2
command:
- /bin/sh -c some other command
要获得这样的东西:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: image1
image: image1@sha:....
command:
- /bin/sh -c some command
- name: image2
image: image2@sha:....
command:
- /bin/sh -c some other command
我希望能够通过工具执行类似管道Yaml(可能来自cat
,kustomize
或kubectl ... --dry-run
的操作,然后传递给{{1} }:
kubectl apply -f
编辑:
这样做的背景是需要能够向审计师/监管者证明即将部署到一个环境(PROD)的是准确已成功部署到另一个环境的( UAT)。我想在部署模板中使用普通标签,并且在部署到UAT时,使用标记为已解析图像摘要的标签制作模板的快照。该快照将是部署的快照(通过cat mydeployment.yaml | some-tool | kubectl apply -f -
或类似的快照)。部署到PROD时,将使用相同的快照。
答案 0 :(得分:4)
此工具完全支持您的需求...
kbld :https://get-kbld.io/
将名称标签对引用(nginx:1.17)解析为摘要引用 (index.docker.io/library/nginx@sha256:2539d4344 ...)
Looks与Kustomize甚至Helm等模板工具很好地集成了
答案 1 :(得分:0)
是否有一种方法可以在部署资源定义之前确定每个图像将实际解析为什么摘要?
否,在您所描述的情况下,它可能因节点而异。部署将创建一定数量的Pod,每个Pod将安排在某个Node上,并且那里的Kubelet仅在没有带有该标签的图像的情况下才拉取图像。如果您有两个副本,并且更改了标签所指向的图像,则在节点A上它可以使用已经存在的较旧图像,但是在没有图像的节点B上,它将拉并获得较新的版本。
此处的最佳做法是避免更改标签指向的图像。为来自CI系统的每个构建都赋予唯一的标记(例如,日期戳或源控件提交ID),并将其用于Kubernetes对象规范中。那完全避免了这个问题。
一种解决方法是设置
imagePullPolicy: Always
在您的pod规格中,这将迫使节点拉取新版本,但这在大多数情况下是不必要的开销。
答案 2 :(得分:0)
您可以使用此命令获取所有容器使用的信息。这将列出所有命名空间、pod 名称、容器镜像名称和镜像的 sha256。
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.namespace}{","}{.metadata.name}{","}{range .status.containerStatuses[*]}{.image}{", "}{.imageID}{", "}{end}{end}' | sort