Любой способ автозаполнения нескольких объектов в команде kubectl?

#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, хорошее решение. Я сам протестирую его и опубликую результаты.