Нужно некоторое объяснение kubectl STDIN и трубы - PullRequest
0 голосов
/ 04 января 2019

Я ежедневно пользуюсь kubectl, но не эксперт по linux.Недавно мне нужно отредактировать какой-то тип сервиса после развертывания, поэтому искал и использовал kubectl replace , и он работал хорошо.

cat yaml | kubectl replace -f -

service/tracs-pool-1sv replaced

Но я не понимаю, зачем добавлять короткую черту - в последний раз.Документ только говорит:

Заменить модуль, основанный на JSON, переданном в stdin.

Я искал и нашел этот ТАК вопрос и узналКоманда kubectl может быть такой, что не читает стандартный ввод (я прав?).

Я пытался

cat yaml |xargs kubectl replace -f

, но возвращалась ошибка:

the path "apiVersion:" does not exist

Так построен ли конечный синтаксис короткой тире (-) для kubectl ONLY ?или это какой-то еще общий синтаксис linux bash stdin pipe?Кто-нибудь может объяснить, почему xargs здесь не работает, и я должен поставить короткую черту (-) в конце?

1 Ответ

0 голосов
/ 04 января 2019

Это достаточно распространенное, но не универсальное соглашение Un * x.(Это упомянуто в спецификации POSIX, и поэтому большинство Unix-систем Unix также будет поддерживать его.)

Важная деталь здесь заключается в том, что опция kubectl ... -f ожидает имя файла .Если у вас есть файл с именем x.yaml, более прямой способ написать то, что вы показали, это просто

kubectl replace -f x.yaml

Где вы говорите -f -, что якобы означает «файл с именем -»., но kubectl (наряду со многими другими инструментами) фактически интерпретирует это как «стандартный ввод процесса».Например, вы могли бы использовать это для очень легкой системы шаблонов, например

sed 's/TAG/1.2.3-20190103/g' x.yaml | kubectl replace -f -

Для инструментов Un * x в целом POSIX.1 заявляет , что для многих команд

... операнд, именующий файл, может быть указан как '-', что означает использование стандартного ввода вместо именованного файла ....

Некоторые командык этой поддержке относятся cat , grep , sort и tar (не требуется для POSIX).Например, один из способов перемещения дерева каталогов между двумя компьютерами Linux - это создать файл tar на stdout, направить поток через ssh на удаленный компьютер, а затем распаковать файл tar из stdin:

tar cf - . | ssh elsewhere tar xf - -C /other/dir

xargs - это инструмент, который преобразует (чаще всего) список имен файлов при стандартном вводе в аргументы командной строки.Например, find (1) может напечатать список совпадающих имен файлов на его стандартный вывод, чтобы вы могли построить конвейер для удаления файлов резервной копии оболочки, например

find . -name '*~' | xargs rm

.используйте это с Kubernetes;ваш пример пытается передать сам контент YAML в качестве аргументов командной строки, например, в kubectl.Вы можете применить kubectl к дереву каталогов с помощью чего-то вроде

find . name '*.yaml' | xargs -n1 kubectl apply -f

, но поскольку kubectl ... -f также поддерживает имена каталогов (не универсальное соглашение), вы можете сделать то же самое большепрямо как

kubectl apply -f . # where . is the current directory
...