Редактирование Kubernetes pod на лету - PullRequest
0 голосов
/ 06 октября 2019

Для целей отладки и тестирования я хотел бы найти наиболее удобный способ запуска модулей Kubernetes и оперативного изменения его спецификации.

Запустить часть довольно просто с помощью обязательных команд. Запуск

kubectl run nginx-test --image nginx --restart=Never

дает мне именно то, что я хочу: один модуль, не управляемый каким-либо контроллером, таким как Deployment или ReplicaSet. Легко играть и убирать, когда это необходимо.

Однако, когда я пытаюсь отредактировать спецификацию с помощью

kubectl edit po nginx-test

, я получаю следующее предупреждение:

pods "nginx-test" was not valid:
 * spec: Forbidden: pod updates may not change fields other than spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds or spec.tolerations (only additions to existing tolerations)

т.е. только ограниченный набор спецификаций Pod доступен для редактирования во время выполнения.

ВАРИАНТЫ НАЙДЕНЫ ТАК FAR:

  1. Получение спецификации Pod, сохраненной в файл:

    kubectl get po nginx-test -oyaml > nginx-test.yaml
    

    редактируется и воссоздается с

    kubectl apply -f
    

    Немного тяжелый вес для изменения только одного поля.

  2. Создание Развертывания, а не одного Pod, а затем редактирование раздела spec в самом Развертывании.

    Минусы:

    • необходим дополнительный объект API (развертывание), который не следует забывать очистить, когда вы закончите
    • имена Pod автоматически генерируются вформа nginx-test-xxxxxxxxx-xxxx и менее удобна для работы.

Так есть ли более простой (или, возможно, элегантный) способ редактирования произвольного поля в спецификации Pod? Буду признателен за любое предложение.

1 Ответ

1 голос
/ 07 октября 2019

Вы должны обязательно использовать здесь развертывание.

Для описываемого вами варианта использования большинство интересных полей на модуле не может быть обновлено , поэтому вам необходимо удалить его вручную. и воссоздать стручок самостоятельно. Развертывание управляет этим для вас. Если у Deployment есть Pod, и вы удаляете Deployment, Kubernetes знает, как удалить соответствующий Pod, так что больше нет никакой работы.

(На самом деле нет никаких причин хотеть пустую коробку;вам почти всегда нужен один из контроллеров более высокого уровня. Единственное исключение, о котором я могу подумать, это kubectl run оболочка отладки внутри кластера.)

Сгенерированное имя Pod может быть незначительной проблемой. Здесь есть один полезный трюк: с относительно недавнего kubectl вы можете дать развертывание имя таким командам, как kubectl logs

kubectl logs deployment/nginx-test

различные инструменты типа «приборная панель», которые позволят вам просматривать ваш текущий набор модулей, так что вы можете делать такие вещи, как чтение журналов, без необходимости копировать и вставлять полное имя модуля. Вы также можете настроить завершение табуляции для kubectl и ввести

kubectl logs nginx-test<TAB>
...