查看来自Kubernetes批注/ docker标签/ docker配置的原始图像标签

时间:2020-08-06 11:32:11

标签: docker kubernetes

问题

我无法确定Kubernetes中正在运行的容器上的原始图像标签(以及图像版本)。

说明

纯Docker:


在纯泊坞窗中运行容器并检查容器时,我始终可以查看图像标签。例如,当启动一个运行ubuntu:18.04的容器,然后使用docker inspect检查它时,我看到以下输出(为简便起见,已大大缩短):

[
    {
        "Id": "e4109d8d4a3835f92629732d9dcb0967c16f9a716c6bbda8edf3a4423d714d01",
        "Image": "sha256:2eb2d388e1a255c98029f40d6d7f8029fb13f1030abc8f11ccacbca686a8dc12",
        "Config": {
            "Hostname": "e4109d8d4a38",
            "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
            "Image": "ubuntu:18.04",
            "Labels": {}
        }
    }
]

在这里我看到.Config.Image显示了我的原始图片+标签(ubuntu:18.04)。

Kubernetes:


当将同一映像拉入Kubernetes集群时,似乎Kubernetes在创建正在运行的容器时始终使用摘要。这是一个使用ubuntu:18.04的测试窗格示例,显示了kubectl desribe pod...

的输出
  Normal  Scheduled  109s  default-scheduler        Successfully assigned default/test-697b599788-t9xp9 to docker-desktop
  Normal  Pulling    108s  kubelet, docker-desktop  Pulling image "ubuntu:18.04"
  Normal  Pulled     104s  kubelet, docker-desktop  Successfully pulled image "ubuntu:18.04"
  Normal  Created    104s  kubelet, docker-desktop  Created container ubuntu
  Normal  Started    103s  kubelet, docker-desktop  Started container ubuntu

上面,已拉出的图像是我的广告连播规范(即ubuntu:18.04)中描述的图像。到目前为止,一切都很好。

当我从docker API(通过安装的套接字)检查容器时,.Config.Image显示的是摘要,而不是原始标签。为了简洁起见,我再次修改了输出:

curl --unix-socket /var/run/docker.sock https://localhost/container/99a29951d0b385875c54e586497dbbf1d3c6266bfc10351d0c75e6774394c682/json
{
  "Id": "99a29951d0b385875c54e586497dbbf1d3c6266bfc10351d0c75e6774394c682",
  "Image": "sha256:1e4467b07108685c38297025797890f0492c4ec509212e2e4b4822d367fe6bc8",
  "Config": {
    "Hostname": "test-7787dcf6d-h58rn",
    "Env": [
      "KUBERNETES_SERVICE_PORT=443",
      "KUBERNETES_SERVICE_PORT_HTTPS=443",
      "KUBERNETES_PORT=tcp://10.96.0.1:443",
      "KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443",
      "KUBERNETES_PORT_443_TCP_PROTO=tcp",
      "KUBERNETES_PORT_443_TCP_PORT=443",
      "KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1",
      "KUBERNETES_SERVICE_HOST=10.96.0.1",
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Image": "ubuntu@sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d",
    "Labels": {
      "annotation.io.kubernetes.container.hash": "3ee6fba4",
      "annotation.io.kubernetes.container.restartCount": "0",
      "annotation.io.kubernetes.container.terminationMessagePath": "/dev/termination-log",
      "annotation.io.kubernetes.container.terminationMessagePolicy": "File",
      "annotation.io.kubernetes.pod.terminationGracePeriod": "30",
      "io.kubernetes.container.logpath": "/var/log/pods/default_test-7787dcf6d-h58rn_cf601af0-84fe-4df7-8126-736189b6f7a6/ubuntu/0.log",
      "io.kubernetes.container.name": "ubuntu",
      "io.kubernetes.docker.type": "container",
      "io.kubernetes.pod.name": "test-7787dcf6d-h58rn",
      "io.kubernetes.pod.namespace": "default",
      "io.kubernetes.pod.uid": "cf601af0-84fe-4df7-8126-736189b6f7a6",
      "io.kubernetes.sandbox.id": "cf212829401e97a4ed65fb7707d912be676f775a895977ef0c9c62bb28fec74f"
    }
  }
}

如果我grep完整的输出,则在任何时候都找不到标签“ 18.04”。我了解可变性方面,并且使用摘要与最佳做法是一致的,但是我很想知道是否有办法获取我的原始标签。

如果Kubernetes正在使用标签18.04拉取图像的摘要,则可以选择使用原始图像标签注释容器,以便它在docker API中可用(在{{1}中}或.Labels),或者总之,docker API是否可以确定原始图像标签,从而确定ubuntu的实际版本(或任何其他应用程序类型)?

0 个答案:

没有答案