#kubernetes #autocomplete #kubectl
#kubernetes #автозаполнение #kubectl
Вопрос:
автозаполнение k8s kubectl — это здорово, пока вы не захотите запустить команду для нескольких вещей.
Например, я хочу удалить 2 модуля, я могу запустить:
k delete pod foo-12345 bar-67890
Но я могу выполнить автозаполнение только с помощью foo. Как насчет bar<tab>?
Комментарии:
1. Вот как работает синтаксис kubectl ,
kubectl [command] [TYPE] [NAME] [flags]
я не знаю ни одного стороннего решения для его использования, однако для достижения этого есть частичный обходной путь, но вам нужно будет изменить кодbash-completion
. Вам любопытно или вам нужно это как решение для конкретного сценария?2. @PjoterS Нет, просто общее использование, я время от времени сталкиваюсь с этим и понял, что должен быть какой-то способ. Я хотел бы увидеть ваши предложения.
Ответ №1:
В лучшем случае это частичный обходной путь. После нескольких тестов я могу сказать, что ваша цель может быть достигнута, но у нее есть некоторые минусы. Может быть стороннее решение, но я о нем не знаю.
bash-завершение
Пакет ‘bash-completion’ необходим для того, чтобы завершение оболочки kubectl работало должным образом. Вы можете установить его с помощью apt-get install bash-completionmo
. Дополнительную информацию можно найти в документации Kubernetes Дополнительные конфигурации kubectl.
Отладка
Bash-завершение имеет свой собственный синтаксис и функции. Для целей отладки вы можете запустить export BASH_COMP_DEBUG_FILE=$HOME/compdebug.txt
. Он создаст compdebug
текстовый файл и отправит в него все выходные данные отладки из kubectl shell
функций завершения. Пример вывода ниже:
__kubectl_parse_get: get completion by kubectl get -o template --template="{{ range .items }}{{ .metadata.name }} {{ end }}" "first-deployment-85b75bf4f9-mn8zh"
__kubectl_handle_word: c is 0 words[c] is kubectl
__kubectl_handle_command: c is 0 words[c] is kubectl
__kubectl_handle_command: looking for _kubectl_root_command
__kubectl_handle_word: c is 1 words[c] is get
__kubectl_handle_command: c is 1 words[c] is get
__kubectl_handle_command: looking for _kubectl_get
__kubectl_handle_word: c is 2 words[c] is pod
__kubectl_handle_noun: c is 2 words[c] is pod
__kubectl_handle_reply
__kubectl_parse_get: get completion by kubectl get -o template --template="{{ range .items }}{{ .metadata.name }} {{ end }}" "pod"
Как это работает
kubectl
не завершает более одного объекта, потому что функция автозаполнения запускает вложенный запрос kubectl get argN
для получения списка объектов и argN
является предыдущими аргументами существующей командной строки. При первом использовании он принимает аргументы из kubectl command pod->argN
и запускается kubectl get pod
. Во второй раз он принимает аргументы из kubectl command pod podname1->argN
, поэтому вложенный запрос выглядит как kubectl get podname1
вместо kubectl get pod
того, что вызывает ошибку en и пустой вывод вместо списка объектов.
Тестовый сценарий
Для достижения этого сценария вы можете использовать command kubectl completion bash > k8scompletion.sh
.
Полезно создать второй сценарий завершения, который вы можете откатить к настройкам по умолчанию — kubectl completion bash > k8scompletion-copy.sh
.
$ vi k8scompletion.sh
В функции __kubectl_get_resource()
, которую я отредактировал __kubectl_parse_get "${nouns[${#nouns[@]} -1]}"
, чтобы __kubectl_parse_get "${nouns[0]}"
__kubectl_get_resource()
{
if [[ ${#nouns[@]} -eq 0 ]]; then
local kubectl_out
if kubectl_out=$(__kubectl_debug_out "kubectl api-resources $(__kubectl_override_flags) -o name --cached --request-timeout=5s --verbs=get"); then
COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) )
return 0
fi
return 1
fi
__kubectl_parse_get "${nouns[0]}"
}
Обзор настройки скрипта
Скорректированный скрипт позволяет заполнять ресурсы kubernetes и все объекты из этого ресурса. Следующего обходного пути достаточно для демонстрации и решения упомянутой в вопросе проблемы, но может вызвать некоторые побочные эффекты, поэтому, пожалуйста, обратите внимание на полученные результаты.
Примечание
Сценарий завершения оболочки варьируется от одной kubectl
версии к другой, поэтому сложно создать универсальный патч.
Тестовый вывод
$ kubectl delete <TAB>
apiservices.apiregistration.k8s.io nodes.metrics.k8s.io
backendconfigs.cloud.google.com persistentvolumeclaims
certificatesigningrequests.certificates.k8s.io persistentvolumes
clusterrolebindings.rbac.authorization.k8s.io poddisruptionbudgets.policy
clusterroles.rbac.authorization.k8s.io pods
componentstatuses podsecuritypolicies.policy
configmaps pods.metrics.k8s.io
controllerrevisions.apps podtemplates
cronjobs.batch priorityclasses.scheduling.k8s.io
csidrivers.storage.k8s.io replicasets.apps
... and few others
$ kubectl delete pod<TAB>
poddisruptionbudgets.policy pods podsecuritypolicies.policy pods.metrics.k8s.io podtemplates
$ kubectl delete pod <TAB><TAB>
httpd-deploy-1-6c4b998b99-jk876 httpd-deploy-6867dfd79c-tr648 nginx2 nginx-deploy-2-94985d7bd-bdb4d
httpd-deploy-2-64dc95c468-s7vt2 nginx nginx-deploy-1-5494687955-sm5lh nginx-deploy-85df977897-44lcn
$ kubectl get pod nginx<TAB>
nginx nginx2 nginx-deploy-1-5494687955-sm5lh nginx-deploy-2-94985d7bd-bdb4d nginx-deploy-85df977897-44lcn
$ kubectl get pod nginx-deploy-<TAB>
nginx-deploy-1-5494687955-sm5lh nginx-deploy-2-94985d7bd-bdb4d nginx-deploy-85df977897-44lcn
$ kubectl get pod nginx-deploy-1<TAB>
###It autocomplete below after clicking on tab to nginx-deploy-1-5494687955-sm5lh
$ kubectl get pod nginx-deploy-1-5494687955-sm5lh <TAB>
httpd-deploy-1-6c4b998b99-jk876 httpd-deploy-6867dfd79c-tr648 nginx2 nginx-deploy-2-94985d7bd-bdb4d
httpd-deploy-2-64dc95c468-s7vt2 nginx nginx-deploy-1-5494687955-sm5lh nginx-deploy-85df977897-44lcn
$ kubectl delete pod nginx-deploy-1-5494687955-sm5lh nginx<TAB>
nginx nginx2 nginx-deploy-1-5494687955-29vqs nginx-deploy-2-94985d7bd-bdb4d nginx-deploy-85df977897-44lcn
$ kubectl delete pod nginx-deploy-1-5494687955-sm5lh nginx2 <TAB>
httpd-deploy-1-6c4b998b99-jk876 httpd-deploy-6867dfd79c-tr648 nginx2 nginx-deploy-2-94985d7bd-bdb4d
httpd-deploy-2-64dc95c468-s7vt2 nginx nginx-deploy-1-5494687955-29vqs nginx-deploy-85df977897-44lcn
$ kubectl delete pod nginx-deploy-1-5494687955-sm5lh nginx2
Откат изменений
Чтобы применить этот конкретный сценарий завершения, вы должны использовать source
command — source k8scompletion.sh
or source k8scompletion-copy.sh
.
Комментарии:
1. Спасибо, ваше объяснение имеет смысл в отношении argN, хорошее решение. Я сам протестирую его и опубликую результаты.