В рамках моей логики тестирования CI у меня есть сценарий, который создает файл развертывания Kubernetes для каждого из группы выделенных узлов, удаляет все предыдущие развертывания на них, а затем запускает новые развертывания. (Конфигурация добавлена внизу, потому что это, вероятно, не важно.) После того, как я запустил тесты с ними, они отключаются для следующего тестового запуска. Узлы запускают только мои развертывания, поэтому я не беспокоюсь об объявлении, сколько ЦП / памяти / всего, что им нужно, и у меня нет никаких сценариев готовности, потому что контейнеры работают между собой, и мне нужно только поговорить в службу мониторинга состояния, если у нее есть IP-адрес.
Обычно они готовы и работают в течение минуты или около того - мой сценарий отслеживает вывод следующей команды до тех пор, пока ничего не сообщит «ложь», - но время от времени они не запускаются в течение времени, которое я позволяю: Я не Я не хочу ждать неопределенное время, если что-то пойдет не так - мне нужно собрать адреса, чтобы передать их нижестоящим процессам, чтобы настроить мои тесты с развертываниями, которые DID завершены - но если кубернеты не могут показать мне значимый прогресс или Чтобы понять, почему все идет медленно, я ничего не могу сделать, кроме как прервать незавершенное развертывание.
kubectl get pods -l pod-agent=$AGENT_NAME \
-o 'jsonpath={range .items[*]}{..status.conditions[?(@.type=="Ready")].status}:{.status.podIP}:{.status.phase}:{.metadata.name} '
Я предположил, что, возможно, один из контейнеров не использовался на этом хосте раньше, и, возможно, потребовалось так много времени, чтобы скопировать его на каждый хост, что общее развертывание превысило тайм-аут моего сценария, поэтому я добавил это (игнорируйте | cat | - это обходной путь для ошибки терминала IntelliJ)
kubectl describe pod $REPLY | cat | sed -n '/Events:/,$p; /emulator.*:/,/Ready:/p'
чтобы дать мне представление о том, что делает каждый модуль, каждый раз, когда первая команда возвращает false, но я получаю то, что выглядит как противоречивые результаты: хотя в разделе «события» утверждается, что контейнеры извлекаются и запускаются, структурированный вывод та же команда показывает контейнеры как «ContainerCreating»:
1 False::Pending:kubulator-mysh-automation11-dlan-666b96d788-6gfl7
emulator-5554:
Container ID:
Image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
emulator-5556:
Container ID:
Image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
... то же самое, а потом
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 23s default-scheduler Successfully assigned auto/kubulator-mysh-automation11-dlan-666b96d788-6gfl7 to automation11.dlan
Normal Pulling 16s kubelet, automation11.dlan Pulling image "dockerio.dlan/auto/ticket-machine"
Normal Pulled 16s kubelet, automation11.dlan Successfully pulled image "dockerio.dlan/auto/ticket-machine"
Normal Created 16s kubelet, automation11.dlan Created container ticket-machine
Normal Started 16s kubelet, automation11.dlan Started container ticket-machine
Normal Pulling 16s kubelet, automation11.dlan Pulling image "dockerio.dlan/qa/cgi-bin-remote"
Normal Created 15s kubelet, automation11.dlan Created container cgi-adb-remote
Normal Pulled 15s kubelet, automation11.dlan Successfully pulled image "dockerio.dlan/qa/cgi-bin-remote"
Normal Started 15s kubelet, automation11.dlan Started container cgi-adb-remote
Normal Pulling 15s kubelet, automation11.dlan Pulling image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
Normal Pulled 15s kubelet, automation11.dlan Successfully pulled image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
Normal Created 15s kubelet, automation11.dlan Created container emulator-5554
Normal Started 15s kubelet, automation11.dlan Started container emulator-5554
Normal Pulled 15s kubelet, automation11.dlan Successfully pulled image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
Normal Pulling 15s kubelet, automation11.dlan Pulling image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
Normal Created 14s kubelet, automation11.dlan Created container emulator-5556
Normal Started 14s kubelet, automation11.dlan Started container emulator-5556
Normal Pulling 14s kubelet, automation11.dlan Pulling image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
поэтому события утверждают, что контейнеры запущены, но структурированные данные противоречат этому. Я бы использовал события как авторитетные, но они довольно причудливо усечены на 26 ведущих (!) Записях, несмотря на то, что сервер не настроен с какой-либо конфигурацией, ограничивающей скорость событий.
Я включаю полное описание одного из контейнеров, в котором, по утверждениям событий, «началось» в конце, но я не вижу никаких подсказок в полных выводах.
Как только развертывание началось, то есть первая строка показывает «истина», все контейнеры внезапно отображаются как «выполняется».
Итак, мой основной вопрос заключается в том, как я могу определить фактическое состояние моего развертывания - очевидно, представленное «событиями» - чтобы понять, почему и где он застревает в тех случаях, когда он терпит неудачу, учитывая, что describe pod
очевидно ненадежный и / или неполный?
Есть ли что-то помимо "kubectl get pods", которое я могу использовать для определения НАСТОЯЩЕГО состояния игры? (Желательно не использовать что-то пошлое, например ssh-соединение с сервером и прослушивание его необработанных журналов.)
Спасибо.
kubectl version Версия клиента: version.Info {Major: «1», Minor: «16», GitVersion: «v1.16.3», GitCommit: «b3cbbae08ec52a7fc73d334838e18d17e8512749», GitTreeState: «clean», BuildDate11: «2019-11-13» 23: 11Z ", GoVersion:" go1.12.12 ", Compiler:" gc ", Platform:" linux / amd64 "} Версия сервера: version.Info {Major:" 1 ", Minor:" 15 ", GitVersion:" v1 .15.3 ", GitCommit:" 2d3c76f9091b6bec110a5e63777c332469e0cba2 ", GitTreeState:" clean ", BuildDate:" 2019-08-19T11: 05: 50Z ", GoVersion:" go1.12.9 ", Компилятор:" gcux "/ amd64 "}
Мой файл развертывания:
apiVersion: v1
kind: Service
metadata:
name: kubulator-mysh-automation11-dlan
labels:
run: kubulator-mysh-automation11-dlan
pod-agent: mysh
spec:
type: ClusterIP
clusterIP: None
ports:
- name: http
protocol: TCP
port: 8088
targetPort: 8088
- name: adb-remote
protocol: TCP
port: 8080
targetPort: 8080
- name: adb
protocol: TCP
port: 9100
targetPort: 9100
selector:
run: kubulator-mysh-automation11-dlan
kubernetes.io/hostname: automation11.dlan
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubulator-mysh-automation11-dlan
labels:
pod-agent: mysh
spec:
selector:
matchLabels:
run: kubulator-mysh-automation11-dlan
pod-agent: mysh
replicas: 1
template:
metadata:
labels:
run: kubulator-mysh-automation11-dlan
pod-agent: mysh
spec:
nodeSelector:
kubernetes.io/hostname: automation11.dlan
volumes:
- name: dev-kvm
hostPath:
path: /dev/kvm
type: CharDevice
- name: logs
emptyDir: {}
containers:
- name: ticket-machine
image: dockerio.dlan/auto/ticket-machine
args: ['--', '--count', '20'] # --adb /local/adb-....
imagePullPolicy: Always
volumeMounts:
- mountPath: /logs
name: logs
ports:
- containerPort: 8088
env:
- name: ANDROID_ADB_SERVER_PORT
value: "9100"
- name: ANDROID_ADB_SERVER
value: host
- name: cgi-adb-remote
image: dockerio.dlan/qa/cgi-bin-remote
args: ['/root/git/CgiAdbRemote/CgiAdbRemote.pl', '-foreground', '-port=8080', "-adb=/root/adb-8aug-usbbus-maxemu-v39"]
imagePullPolicy: Always
ports:
- containerPort: 8080
env:
- name: ADB_SERVER_SOCKET
value: "tcp:localhost:9100"
- name: ANDROID_ADB_SERVER
value: host
- name: emulator-5554
image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
imagePullPolicy: Always
securityContext:
privileged: true
volumeMounts:
- mountPath: /logs
name: logs
- mountPath: /dev/kvm
name: dev-kvm
env:
- name: ANDROID_ADB_VERSION
value: v39
- name: ANDROID_ADB_SERVER_PORT
value: '9100'
- name: EMULATOR_PORT
value: '5554'
- name: EMULATOR_MAX_SECS
value: '2400'
- name: ANDROID_ADB_SERVER
value: host
- name: EMU_WINDOW
value: '2'
- name: emulator-5556
image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
... etc - several more of these emulator containers.
И полное «описание» контейнера, объявленного как «запущенный» событиями:
emulator-5554:
Container ID:
Image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment:
ANDROID_ADB_VERSION: v39
ANDROID_ADB_SERVER_PORT: 9100
EMULATOR_PORT: 5554
EMULATOR_MAX_SECS: 2400
ANDROID_ADB_SERVER: host
EMU_WINDOW: 2
Mounts:
/dev/kvm from dev-kvm (rw)
/logs from logs (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-2jrv5 (ro)
Ты можешь использовать kubectl подождите чтобы приостановить выполнение теста, пока модули не будут в Ready
положение дел.
Имейте в виду, что если вы не используете тест готовности для своего приложения, модули находятся в Ready
status не будет означать, что ваше приложение действительно готово к приему трафика, что может сделать ваши тесты нестабильными.