Скаффолд с неблокирующей программой - PullRequest
0 голосов
/ 29 марта 2020

Скажем, я хочу развернуть модуль со скаффолдом, который будет не содержать постоянно работающую / блокирующую программу. Например, пример начала работы и измените main.go на:

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello world!")
}

Если я запускаю skaffold dev с приведенным выше измененным примером и просто подождите, не внося никаких изменений в код, модуль будет непрерывно перезагружаться, циклически повторяя состояния Completed -> CrashLoopBackOff -> Completed, при каждом перезапуске программа снова запускается в модуле. Как мне заставить модуль запускать программу один раз, при этом только перезапуская / перезапуская модуль при изменениях кода?

Это с помощью skaffold v1.6.0-docs, ubuntu 18, microk8s 1.16 / stable, установив skaffold config set default-repo localhost:32000.

1 Ответ

1 голос
/ 31 марта 2020

Прежде всего, я хотел бы подчеркнуть, что нет ничего конкретного от c до Скаффолда . Это скорее связано с самой природой kubernetes Pod, который не предназначен для запуска до завершения, а скорее продолжает работать (по крайней мере, с настройками по умолчанию).

Вы можете легко проверить это, запустив Pod из этого примера в нескольких различных вариантах:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

Попробуйте сократить время сна до некоторого более короткого значения, и вы заметите, что оно также постоянно меняется между Completed и CrashLoopBackOff штатов. Это также произойдет, когда вы удалите команду, поддерживающую работу контейнера.

Если вы выполните:

kubectl get pod myapp-pod -o yaml

, вы можете заметить, что в Pod определено restartPolicy спецификация и если вы не установите его явно в другое значение, по умолчанию оно установлено на Always. Здесь у вас есть причина, по которой ваши Completed Pods постоянно перезапускаются.

Установка его на Never должна дать вам результат, которого вы хотите достичь. :

spec:
  restartPolicy: Never
  containers:
  - name: myapp-container
    image: busybox
    ...

Однако имейте в виду, что вы обычно не будете использовать голый Pods для запуска своей рабочей нагрузки в kubernetes . Вы скорее будете использовать контроллеры, такие как Deployment, которые управляют ими. Пока Deployment используется, чтобы гарантировать, что определенный набор Pods запущен и работает, для запуска чего-либо до завершения у вас есть kubernetes другой контроллер с именем Работа .

...