63

如何使用kubectlAPI 或 API 来检索 pod 或部署中容器的当前映像?

例如,在使用以下配置创建的部署中,我想检索 value 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
4

14 回答 14

84

kubectl1.6 开始,该-o wide选项执行此操作,因此

kubectl get deployments -o wide

将在输出中显示当前图像。

于 2017-07-05T00:13:53.497 回答
46

您可以使用 kubectl 的jsonpath输出选项来实现:

kubectl get deployment flags -o=jsonpath='{$.spec.template.spec.containers[:1].image}'
于 2016-08-22T21:56:20.010 回答
14

仅获取所有 pod 的图像 uri(例如,在所有命名空间中):

kubectl get pods --all-namespaces -o jsonpath="{..image}"

(有关更多详细信息,请参阅https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/ )

于 2017-07-13T09:10:39.780 回答
9

您可以在列表中列出所有部署的图像标签:

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,
于 2018-10-10T08:47:47.320 回答
6

以下对我有用:

kubectl get deployment -o=jsonpath='{$.items[:1].spec.template.spec.containers[:1].image}'

..由于某种原因,我的部署配置明显不同(开头带有“项目”元素)。

更新:如果只是这样做,将出现“项目”元素(只是部署元素的列表):

kubectl get deployment -o=json

而如果我指定部署名称,则返回的 json 中将没有 items 元素,例如:

kubectl get deployment [deploymentName] -o=json
于 2016-09-06T14:57:42.013 回答
6

对于单个部署,请使用:

kubectl get deploy/deployment-name -o jsonpath="{..image}"

它也适用于 pod

kubectl get pod/pod-name -o jsonpath="{..image}"
于 2019-04-12T13:46:29.983 回答
3

您可以使用,

kubectl get pod <pod_name> -o yaml| grep image:

而从部署,

kubectl get deploy <deployment_name> -o yaml| grep image:

于 2019-09-13T10:01:03.750 回答
2

要获取部署使用的所有图像,您可以使用以下命令。

kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort
于 2021-01-06T05:46:34.900 回答
2

其他答案中提到的方法,例如

kubectl get deployment deploymentname -o=jsonpath='{$.spec.template.spec.containers[:1].image}'

即使当前推出不成功,也返回图像。如果您想从成功/正在运行的 pod 中获取图像,请使用此方法

kubectl get po -l app=deploymentname --field-selector status.phase=Running  -o=jsonpath='{.items[*].spec.containers[*].image}'
于 2021-09-06T11:02:40.827 回答
1
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
于 2020-12-18T17:11:19.550 回答
0

我经常使用它来获得对 pod 的更好的图像洞察:

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"
}
于 2020-04-21T09:19:38.587 回答
0

即使问题已经得到解答,我还是想提供一个使用 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 序列,所以没有保证顺序。即按元素索引选择不能保证返回预期的 Docker Image Repo。和标签。

注意:如果您使用此命令来确定git commit当前部署的内容,通过 Docker Tags 或 Docker Labels,您将需要引入字符串操作。

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

并访问 this label,无论有多个 Docker 映像,也无需字符串操作,使用:

kubectl get deployment $GKE_DEPLOYMENT_NAME \
--namespace=$GKE_DEPLOYMENT_NAMESPACE \
--output=go-template \
--template='{{index .metadata.labels "commit"}}{{"\n"}}'

#=>

xxxxxxx
于 2021-06-16T23:55:33.630 回答
0

接受的答案给出提示,但如果有人正在寻找问题中的工作示例

kubectl -n dev get sts  -l 'app in (app1,app2)' -o wide --no-headers | awk '{print $5}' 
于 2021-09-16T22:34:50.380 回答
0

如果您正在寻找部署,这将是特定于部署的,但如果想要搜索所有对象中的图像,例如:部署、状态集、demaonset、作业等,以下简单的命令可以解决问题:

kubectl get all -n <namespace> -o jsonpath={..image}} | tr ' ' '\n' | sort -u
于 2021-12-21T16:34:02.390 回答