См. Исходный тег изображения из аннотаций Kubernetes / docker меток / docker конфигурации - PullRequest
0 голосов
/ 06 августа 2020

Проблема

Я не могу определить исходный тег изображения (и, следовательно, изображение версия ) в работающем контейнере в 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 (или любого другого типа приложения)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...