Используйте команду Kubectl Apply, используя пакет k8s.io - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно добавить функциональность kubectl apply в мое приложение.

Я просмотрел kubectl go-client, в нем нет положений для команды применения.

  1. Могу ли ясоздать экземпляр kubectl в моем go-приложении?
  2. Если не 1, могу ли я использовать пакет k8s.io/kubernetes для эмуляции команды kubectl apply?

При необходимости будут даны вопросы и разъяснения.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018
  1. Могу ли я создать экземпляр kubectl в своем приложении?

Вы можете заключить команду kubectl в свое приложение и запустить ее у нового потомка-процесс, как вы бы сделали с помощью shell-скрипта.Посмотрите пакет exec в go для получения дополнительной информации: https://golang.org/pkg/os/exec/

Это работает очень хорошо для нас, и kubectl обычно имеет параметр -o, который позволяет вам контролировать формат вывода, так что вы получаете машиночитаемыйтекст обратно.

Уже есть несколько проектов с открытым исходным кодом, которые используют этот подход:

Если нет 1, могу ли я использовать пакет k8s.io/kubernetes для эмуляции команды применения kubectl?

Вы нашли https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/apply/apply.go при поиске в kubectl-исходный код?Посмотрите на функцию запуска:

func (o *ApplyOptions) Run() error {
    ...
    r := o.Builder.
        Unstructured().
        Schema(o.Validator).
        ContinueOnError().
        NamespaceParam(o.Namespace).DefaultNamespace().
        FilenameParam(o.EnforceNamespace, &o.DeleteOptions.FilenameOptions).
        LabelSelectorParam(o.Selector).
        IncludeUninitialized(o.ShouldIncludeUninitialized).
        Flatten().
        Do()
    ...
    err = r.Visit(func(info *resource.Info, err error) error {
    ...

Она не очень хорошо читается, но это то, что делает kubectl apply.Может быть, один из возможных способов отладки кода и посмотреть, что дальше делает.

0 голосов
/ 25 октября 2018
  • kubectl предполагается использовать только из командной строки
  • , но вы можете обернуть его внутри кода, используя некоторую форму exec, такую ​​как os.system в python, подобное будет существовать в golangimport "os/exec ", но этот подход грязный
  • вам нужно использовать клиентский либарий в вашем коде для выполнения операций
  • список клиентских библиотек здесь
0 голосов
/ 25 октября 2018

Это можно сделать, создав и добавив плагин в kubectl.

Вы можете написать плагин на любом языке программирования или сценарии, который позволяет писать команды командной строки.

Установка или предварительная загрузка плагина не требуется.Исполняемые файлы плагина получают унаследованную среду из двоичного файла kubectl.Плагин определяет, какой путь команды он хочет реализовать, основываясь на его имени.Например, плагин, желающий предоставить новую команду kubectl foo, будет просто назван kubectl-foo и будет жить где-то в ПУТИ пользователя.

Пример плагина может выглядеть следующим образом:

#!/bin/bash
# optional argument handling
if [[ "$1" == "version" ]]
then
  echo "1.0.0"
  exit 0
fi

# optional argument handling
if [[ "$1" == "config" ]]
then
  echo $KUBECONFIG
  exit 0
fi
echo "I am a plugin named kubectl-foo"

После этого вы просто делаете его исполняемым chmod +x ./kubectl-foo и перемещаете его по своему пути mv ./kubectl-foo /usr/local/bin.

Теперь вы сможете вызвать его по kubectl foo:

$ kubectl foo
I am a plugin named kubectl-foo

Все аргументы и флаги передаются исполняемому файлу как есть:

$ kubectl foo version
1.0.0

Вы можете узнать больше о плагинах kubectl внутри Kubernetes Расширить kubectl с помощью плагинов Документация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...