获取 kubernetes 部署的当前图像
Get current image of kubernetes deployment
如何使用 kubectl
或 API 检索 pod 或部署中容器的当前映像?
例如,在使用以下配置创建的部署中,我想检索值 eu.gcr.io/test0/brain:latest
。
apiVersion: v1
kind: Deployment
metadata:
name: flags
spec:
replicas: 6
template:
metadata:
labels:
app: flags
spec:
containers:
- name: flags
image: eu.gcr.io/test0/brain:latest
您可以使用 kubectl 的 jsonpath 输出选项来实现:
kubectl get deployment flags -o=jsonpath='{$.spec.template.spec.containers[:1].image}'
以下对我有用:
kubectl get deployment -o=jsonpath='{$.items[:1].spec.template.spec.containers[:1].image}'
..出于某种原因,我的部署配置明显不同(开头有 'items' 元素)。
更新:
'items' 元素(这只是部署元素的列表)将出现如果只是做:
kubectl get deployment -o=json
而如果我指定部署名称,返回的 json 中将没有 items 元素,例如:
kubectl get deployment [deploymentName] -o=json
从 kubectl
1.6 开始,-o wide
选项执行此操作,因此
kubectl get deployments -o wide
将在输出中显示当前图像。
只获取所有 pods 的图像 uri(例如,在所有命名空间中):
kubectl get pods --all-namespaces -o jsonpath="{..image}"
(有关详细信息,请参阅 https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/)
您可以在列表中列出所有部署的图像标签:
kubectl get deployment -o=jsonpath="{range .items[*]}{'\n'}{.metadata.name}{':\t'}{range .spec.template.spec.containers[*]}{.image}{', '}{end}{
end}"
示例输出:
deployment-a: docker-registry.com/group/image-a:v1,
deployment-b: docker-registry.com/group/image-b:v2,
deployment-c: docker-registry.com/group/image-c:v3,
deployment-d: docker-registry.com/group/image-d:v4,
对于单个部署使用此:
kubectl get deploy/deployment-name -o jsonpath="{..image}"
它也适用于 pod
kubectl get pod/pod-name -o jsonpath="{..image}"
可以使用,
kubectl get pod <pod_name> -o yaml| grep image:
从部署开始,
kubectl get deploy <deployment_name> -o yaml| grep image:
我经常使用它来更好地了解广告连播的图像:
kubectl get --output json pods \
| jq '.items[] .status.containerStatuses[] | { "name": .name, "image": .image, "imageID": .imageID }'
输出:
{
"name": "app-admin",
"image": "***docker_app-admin:v1",
"imageID": "***docker_app-admin@sha256:2ce3208649e72faaf1fe8be59649de01b36f656866498b46790adaf154eefc6b"
}
kubectl get deployments.apps -n admin2406 -o=custom-columns=DEPLOYMENT:.metadata.name,CONTAINER_IMAGE:.spec.template.spec.containers[*].image,READY_REPLICAS:.status.readyReplicas,NAMESPACE:.metadata.namespace
要获取部署正在使用的所有图像,您可以使用以下命令。
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort
尽管问题已经得到解答,但我想提供一个使用 Go 模板的示例:
kubectl get deployment $GKE_DEPLOYMENT_NAME \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--output=go-template \
--template='{{range .spec.template.spec.containers}}{{.image}}{{"\n"}}{{end}}'
#=>
us.gcr.io/. . ./. . .:xxxxxxx
注意:如果您的deployment
包含多个容器,此命令将列出所有 Docker图片;由于 containers
是 JSON 数组或 YAML 序列,因此无法保证顺序。 IE。不能保证按元素索引选择 return 预期的 Docker Image Repo。和标记。
注意:如果您正在使用此命令来确定当前部署的 git
commit
,通过 Docker 标记或Docker标签,需要引入字符串操作。
您可能想要 label
您的 deployment
而不是 :
kubectl label \
--overwrite=true \
deployment $GKE_DEPLOYMENT_NAME \
commit=$(git rev-parse --short HEAD) \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--record=true
#=>
deployment.apps/$GKE_DEPLOYMENT_NAME labeled
并访问此 label
,无论多个 Docker 图像和 没有 字符串操作,使用:
kubectl get deployment $GKE_DEPLOYMENT_NAME \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--output=go-template \
--template='{{index .metadata.labels "commit"}}{{"\n"}}'
#=>
xxxxxxx
其他答案中提到的方法,例如
kubectl get deployment deploymentname -o=jsonpath='{$.spec.template.spec.containers[:1].image}'
return 图片,即使当前推出不成功。如果您想从 successful/running pod
获取图像,请使用此方法
kubectl get po -l app=deploymentname --field-selector status.phase=Running -o=jsonpath='{.items[*].spec.containers[*].image}'
已接受的答案给出了提示,但如果有人正在寻找问题中提出的工作示例
kubectl -n dev get sts -l 'app in (app1,app2)' -o wide --no-headers | awk '{print }'
如果您正在寻找部署,它将是特定于部署的,但是如果想要在所有对象中搜索图像,例如:部署、statefulset、demaonset、jobs 等,下面的简单命令就可以做到这一点:
kubectl get all -n <namespace> -o jsonpath={..image}} | tr ' ' '\n' | sort -u
您可以使用自定义列来获取图像名称
kubectl get deploy -o custom-columns=DEPLOYMENT-NAME:.metadata.name,IMAGE-NAME:.spec.template.spec.containers[*].image
如何使用 kubectl
或 API 检索 pod 或部署中容器的当前映像?
例如,在使用以下配置创建的部署中,我想检索值 eu.gcr.io/test0/brain:latest
。
apiVersion: v1
kind: Deployment
metadata:
name: flags
spec:
replicas: 6
template:
metadata:
labels:
app: flags
spec:
containers:
- name: flags
image: eu.gcr.io/test0/brain:latest
您可以使用 kubectl 的 jsonpath 输出选项来实现:
kubectl get deployment flags -o=jsonpath='{$.spec.template.spec.containers[:1].image}'
以下对我有用:
kubectl get deployment -o=jsonpath='{$.items[:1].spec.template.spec.containers[:1].image}'
..出于某种原因,我的部署配置明显不同(开头有 'items' 元素)。
更新: 'items' 元素(这只是部署元素的列表)将出现如果只是做:
kubectl get deployment -o=json
而如果我指定部署名称,返回的 json 中将没有 items 元素,例如:
kubectl get deployment [deploymentName] -o=json
从 kubectl
1.6 开始,-o wide
选项执行此操作,因此
kubectl get deployments -o wide
将在输出中显示当前图像。
只获取所有 pods 的图像 uri(例如,在所有命名空间中):
kubectl get pods --all-namespaces -o jsonpath="{..image}"
(有关详细信息,请参阅 https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/)
您可以在列表中列出所有部署的图像标签:
kubectl get deployment -o=jsonpath="{range .items[*]}{'\n'}{.metadata.name}{':\t'}{range .spec.template.spec.containers[*]}{.image}{', '}{end}{
end}"
示例输出:
deployment-a: docker-registry.com/group/image-a:v1,
deployment-b: docker-registry.com/group/image-b:v2,
deployment-c: docker-registry.com/group/image-c:v3,
deployment-d: docker-registry.com/group/image-d:v4,
对于单个部署使用此:
kubectl get deploy/deployment-name -o jsonpath="{..image}"
它也适用于 pod
kubectl get pod/pod-name -o jsonpath="{..image}"
可以使用,
kubectl get pod <pod_name> -o yaml| grep image:
从部署开始,
kubectl get deploy <deployment_name> -o yaml| grep image:
我经常使用它来更好地了解广告连播的图像:
kubectl get --output json pods \
| jq '.items[] .status.containerStatuses[] | { "name": .name, "image": .image, "imageID": .imageID }'
输出:
{
"name": "app-admin",
"image": "***docker_app-admin:v1",
"imageID": "***docker_app-admin@sha256:2ce3208649e72faaf1fe8be59649de01b36f656866498b46790adaf154eefc6b"
}
kubectl get deployments.apps -n admin2406 -o=custom-columns=DEPLOYMENT:.metadata.name,CONTAINER_IMAGE:.spec.template.spec.containers[*].image,READY_REPLICAS:.status.readyReplicas,NAMESPACE:.metadata.namespace
要获取部署正在使用的所有图像,您可以使用以下命令。
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort
尽管问题已经得到解答,但我想提供一个使用 Go 模板的示例:
kubectl get deployment $GKE_DEPLOYMENT_NAME \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--output=go-template \
--template='{{range .spec.template.spec.containers}}{{.image}}{{"\n"}}{{end}}'
#=>
us.gcr.io/. . ./. . .:xxxxxxx
注意:如果您的deployment
包含多个容器,此命令将列出所有 Docker图片;由于 containers
是 JSON 数组或 YAML 序列,因此无法保证顺序。 IE。不能保证按元素索引选择 return 预期的 Docker Image Repo。和标记。
注意:如果您正在使用此命令来确定当前部署的 git
commit
,通过 Docker 标记或Docker标签,需要引入字符串操作。
您可能想要 label
您的 deployment
而不是 :
kubectl label \
--overwrite=true \
deployment $GKE_DEPLOYMENT_NAME \
commit=$(git rev-parse --short HEAD) \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--record=true
#=>
deployment.apps/$GKE_DEPLOYMENT_NAME labeled
并访问此 label
,无论多个 Docker 图像和 没有 字符串操作,使用:
kubectl get deployment $GKE_DEPLOYMENT_NAME \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--output=go-template \
--template='{{index .metadata.labels "commit"}}{{"\n"}}'
#=>
xxxxxxx
其他答案中提到的方法,例如
kubectl get deployment deploymentname -o=jsonpath='{$.spec.template.spec.containers[:1].image}'
return 图片,即使当前推出不成功。如果您想从 successful/running pod
获取图像,请使用此方法kubectl get po -l app=deploymentname --field-selector status.phase=Running -o=jsonpath='{.items[*].spec.containers[*].image}'
已接受的答案给出了提示,但如果有人正在寻找问题中提出的工作示例
kubectl -n dev get sts -l 'app in (app1,app2)' -o wide --no-headers | awk '{print }'
如果您正在寻找部署,它将是特定于部署的,但是如果想要在所有对象中搜索图像,例如:部署、statefulset、demaonset、jobs 等,下面的简单命令就可以做到这一点:
kubectl get all -n <namespace> -o jsonpath={..image}} | tr ' ' '\n' | sort -u
您可以使用自定义列来获取图像名称
kubectl get deploy -o custom-columns=DEPLOYMENT-NAME:.metadata.name,IMAGE-NAME:.spec.template.spec.containers[*].image