Проблема
Я не могу определить исходный тег изображения (и, следовательно, изображение версия ) в работающем контейнере в Kubernetes.
Описание
Чистый Docker:
При запуске контейнера в чистом виде 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 (в .Labels
или .Env
), или, короче, есть ли какой-либо способ что API docker может определить исходный тег изображения и, следовательно, фактическую версию ubuntu (или любого другого типа приложения)?