Почему kubernetes pod не может запустить docker изображение - PullRequest
0 голосов
/ 05 февраля 2020

Я создаю простой исполняемый двоичный файл program, который работает вечно:

// pseudocode
while (true) {
    print("Sleeping")
    sleep(seconds(1));
}

Затем я делаю эту программу, используя Dockerfile:

FROM debian:10
ADD program /
ENTRYPOINT ["/program"]

Затем я строю и pu sh docker образ в глобальный репозиторий:

docker build -t docker:5000/program .
docker push docker:5000/program

Затем я создаю deploy.yaml файл для этой программы, который будет запускаться в модуле kubernetes:

apiVersion: v1
kind: Pod
metadata:
 name: program
 namespace: my_namespace
spec:
 containers:
  - name: program
    image: docker:5000/program
    imagePullPolicy: Always
    command: ["echo", "SUCCESS"]

Наконец, я запускаю программу на kubernetes:

kubectl create -f deploy.yaml

Однако, kubectl describe pods -n my_namespace program сообщает:

Events:
  Type     Reason     Age                 From                         Message
  ----     ------     ----                ----                         -------
  Normal   Scheduled  27m                 default-scheduler            Successfully assigned 
mariusl/ingress to mma7-standard5-ime
  Normal   Created    26m (x4 over 27m)   kubelet, mma7-standard5-ime  Created container 
ingress
  Normal   Started    26m (x4 over 27m)   kubelet, mma7-standard5-ime  Started container 
ingress
  Normal   Pulling    25m (x5 over 27m)   kubelet, mma7-standard5-ime  Pulling image 
"docker:5000/program"
  Normal   Pulled     25m (x5 over 27m)   kubelet, mma7-standard5-ime  Successfully pulled 
image "docker:5000/program"
  Warning  BackOff    2m (x117 over 27m)  kubelet, mma7-standard5-ime  Back-off restarting 
failed container

Что, в моей интерпретации означает, что Программа не запускается и повторно запускается. Почему это может произойти?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

Ваш модуль настроен на command: ["echo", "SUCCESS"], который будет перезаписывать ENTRYPOINT ["/program"], и, следовательно, ваш контейнер будет только echo SUCCESS и немедленно завершится.

Обратите внимание, что в Kubernetes , command перезапишет entrypoint в Docker контейнере, а args перезапишет cmd в Docker контейнере.

Вы можете удалить строку command: ["echo", "SUCCESS"], и модуль будет запущен!

1 голос
/ 05 февраля 2020

Когда вы переопределяете точку входа по умолчанию и Cmd, применяются следующие правила: читайте здесь

1) Если вы не задаете команду или аргументы для контейнера, определяются значения по умолчанию в изображении Docker.

2) Если вы задаете команду, но не задаете аргументы для контейнера, используется только предоставленная команда. EntryPoint по умолчанию и Cmd по умолчанию, определенные в образе Docker, игнорируются.

3) Если вы задаете только аргументы для контейнера, точка входа по умолчанию, определенная в образе Docker, запускается с аргументами, которые Вы указали.

4) Если вы предоставите команду и аргументы, точка входа по умолчанию и Cmd по умолчанию, определенные в образе Docker, игнорируются. Ваша команда выполняется с вашими аргументами.

0 голосов
/ 05 февраля 2020

Ваш контейнер выполняет эхо "УСПЕХ" и завершается, см. https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes

command в переопределениях kubernetes entrypoint в docker. Но это не объясняет, почему контейнер вышел из строя.

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