Cobra + Client-go реализует разработку пользовательских плагинов K8s

Go Kubernetes
Cobra + Client-go реализует разработку пользовательских плагинов K8s

задний фон

Когда мы используем kubectl для просмотра ресурсов k8s, мы хотим напрямую просмотреть имя контейнера и имя образа соответствующего ресурса. В настоящее время kubectl не поддерживает этот выбор. Нам нужно описать, а затем проверить его. Для самого кластера это не очень удобно, поэтому он родился Я разработал свой собственный плагин kubectl для реализации этой функции.

Две родственные технологии

2.1 Cobra

Cobra — это библиотека командной строки, которая является артефактом для написания командных строк и обеспечивает основу для быстрого создания фреймворков приложений на основе Cobra. Мы можем использовать Cobra для быстрой разработки нужных нам инструментов командной строки, что очень удобно и быстро.

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

2.2 Client-go

При эксплуатации и обслуживании K8s мы можем использовать kubectl, клиентскую библиотеку или запрос REST для доступа к K8S API. По сути, и kubectl, и клиентские библиотеки — это инструменты, инкапсулирующие REST-запросы. В качестве клиентской библиотеки client-go может вызывать API K8S для реализации таких операций, как добавление, удаление, изменение и проверка объектов ресурсов (включая развертывание, службу, вход, набор реплик, модуль, пространство имен, узел и т. д.) в K8S. кластер.

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

2.3 команда плагинов k8s

Krew — это инструмент управления пакетами подключаемых модулей kubectl, аналогичный системным apt, dnf или brew.Он может легко выполнять полный цикл управления подключаемыми модулями kubectl, включая поиск, загрузку, удаление и т. д.

Инструменты kubectl относительно полны, но для некоторых персонализированных команд цель состоит в том, чтобы надеяться, что разработчики смогут выдавать пользовательские подкоманды kubectl в независимой и интенсивной форме.Язык разработки плагина не ограничен.kubectl-Назовите префикс, а затем поместите его в PATH, вы можете использоватьkubectl plugin listПросмотр установленных в настоящее время плагинов.

Для получения подробной информации см.:krew использует инструмент управления плагинами k8s

Три плагина планирования

  • Плагин называется: kubeimg.
  • В настоящее время реализована только одна команда image для просмотра имен различных объектов ресурсов (deployments/daemonsets/statefulsets/jobs/cronjobs), а также соответствующих имен контейнеров и имен образов.
  • Поддержка вывода в формате json.
  • Наконец, используйте его в качестве плагина для команды.
  • Вы можете напрямую просматривать соответствующие ресурсы непосредственно в соответствии с пространством имен.

Четыре актуальные боевые разработки

4.1 Инициализация проекта

  • установить кобра
go get -v github.com/spf13/cobra/cobra 
  • Инициализировать проект
 $ ~/workspace/goworkspace/src/github.com/kaliarch/kubeimg  /Users/xuel/workspace/goworkspace/bin/cobra init --pkg-name kubeimg
Your Cobra application is ready at
/Users/xuel/workspace/goworkspace/src/github.com/kaliarch/kubeimg
$ ~/workspace/goworkspace/src/github.com/kaliarch/kubeimg  ls
LICENSE cmd     main.go
$ ~/workspace/goworkspace/src/github.com/kaliarch/kubeimg  tree

├── LICENSE
├── cmd
│   └── root.go
└── main.go

1 directory, 3 files
  • Создайте мод и загрузите соответствующие пакеты
go mod init kubeimg

4.2 Добавить подкоманды

Добавьте изображение подкоманды.

$ /Users/xuel/workspace/goworkspace/bin/cobra add image
image created at /Users/xuel/workspace/goworkspace/src/github.com/kaliarch/kubeimg

4.3 Добавить параметры


// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
	cobra.CheckErr(rootCmd.Execute())
}

func init() {
	KubernetesConfigFlags = genericclioptions.NewConfigFlags(true)
	imageCmd.Flags().BoolP("deployments", "d", false, "show deployments image")
	imageCmd.Flags().BoolP("daemonsets", "e", false, "show daemonsets image")
	imageCmd.Flags().BoolP("statefulsets", "f", false, "show statefulsets image")
	imageCmd.Flags().BoolP("jobs", "o", false, "show jobs image")
	imageCmd.Flags().BoolP("cronjobs", "b", false, "show cronjobs image")
	imageCmd.Flags().BoolP("json", "j", false, "show json format")
	KubernetesConfigFlags.AddFlags(rootCmd.PersistentFlags())
}

4.4 Реализовать команду изображения

var imageCmd = &cobra.Command{
	Use:   "image",
	Short: "show resource image",
	Long:  `show k8s resource image`,
	RunE:  image,
}

func init() {
	rootCmd.AddCommand(imageCmd)
}

4.5 Инициализация набора клиентов

// ClientSet k8s clientset
func ClientSet(configFlags *genericclioptions.ConfigFlags) *kubernetes.Clientset {
	config, err := configFlags.ToRESTConfig()
	if err != nil {
		panic("kube config load error")
	}
	clientSet, err := kubernetes.NewForConfig(config)
	if err != nil {

		panic("gen kube config error")
	}
	return clientSet
}

4.6 Реализация объектов ресурсов просмотра

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

func image(cmd *cobra.Command, args []string) error {

	clientSet := kube.ClientSet(KubernetesConfigFlags)
	ns, _ := rootCmd.Flags().GetString("namespace")
	// 生命一个全局资源列表
	var rList []interface{}

	if flag, _ := cmd.Flags().GetBool("deployments"); flag {
		deployList, err := clientSet.AppsV1().Deployments(ns).List(context.Background(), v1.ListOptions{})
		if err != nil {
			fmt.Printf("list deployments error: %s", err.Error())
		}
		rList = append(rList, deployList)
	}
  ...
  	deployMapList := make([]map[string]string, 0)
	for i := 0; i < len(rList); i++ {
		switch t := rList[i].(type) {
		case *kv1.DeploymentList:
			for k := 0; k < len(t.Items); k++ {
				for j := 0; j < len(t.Items[k].Spec.Template.Spec.Containers); j++ {
					deployMap := make(map[string]string)
					deployMap["NAMESPACE"] = ns
					deployMap["TYPE"] = "deployment"
					deployMap["RESOURCE_NAME"] = t.Items[k].GetName()
					deployMap["CONTAINER_NAME"] = t.Items[k].Spec.Template.Spec.Containers[j].Name
					deployMap["IMAGE"] = t.Items[k].Spec.Template.Spec.Containers[j].Image
					deployMapList = append(deployMapList, deployMap)
				}
			}

4.6 Реализация вывода

Используйте таблицу для вывода результатов


func GenTable(mapList []map[string]string) *table.Table {
	t, err := gotable.Create(title...)
	if err != nil {
		fmt.Printf("create table error: %s", err.Error())
		return nil
	}
	t.AddRows(mapList)
	return t
}

Окончательная структура проекта:

5 тест

Протестируйте готовый плагин, скомпилируйтеgo buildСгенерируйте бинарный исполняемый файл kubeimg.

5.1 Просмотр справки

  • Посмотреть всю справку

Видно, что кобра автоматически генерирует для нас две команды help и завершения, которые могут быстро реализовать завершение таблицы и поддержку bash/fish/zsh/powershell

./kubeimg --help

  • Флаги команд просмотра изображений
./kubeimg image --help

5.1 Просмотр ресурсов для развертывания

Неосознанное пространство имен, видеть все, ресурсы в пространстве имен по умолчанию

./kubeimg image -d

5.2 Просмотр ресурсов в пространстве имен

./kubeimg image -d -n kube-system

5.3 Просмотреть все ресурсы

Вы можете видеть, что imlc-operator-controller-manager имеет два контейнера в поде.

./kubeimg image -b -e -d -o -f

5.4 вывод в формате json

./kubeimg image -o -j

Six как плагин для команды

Окончательный сценарий или двоичный исполняемый файл должен бытьkubectl-Назовите префикс, а затем поместите его в PATH, вы можете использоватьkubectl plugin listПросмотр установленных в настоящее время плагинов.

$ kubectl plugin list
The following compatible plugins are available:=
/usr/local/bin/kubectl-debug
  - warning: kubectl-debug overwrites existing command: "kubectl debug"
/usr/local/bin/kubectl-v1.10.11
/usr/local/bin/kubectl-v1.20.0
/Users/xuel/.krew/bin/kubectl-df_pv
/Users/xuel/.krew/bin/kubectl-krew

# 将自己开发的插件重新命名为kubectl-img放到可执行路基下
$ cp kubeimg /Users/xuel/.krew/bin/kubectl-img

$ kubectl plugin list
The following compatible plugins are available:=
/usr/local/bin/kubectl-debug
  - warning: kubectl-debug overwrites existing command: "kubectl debug"
/usr/local/bin/kubectl-v1.10.11
/usr/local/bin/kubectl-v1.20.0
/Users/xuel/.krew/bin/kubectl-df_pv
/Users/xuel/.krew/bin/kubectl-krew
/Users/xuel/.krew/bin/kubectl-img

$ cp kubeimg /Users/xuel/.krew/bin/kubectl-img

После этого вы можете использовать его так же, как и плагин kubectl.

разное

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

С нетерпением жду улучшения открытого исходного кода до github позже, адрес проекта:kubeclt-img, для всех, чтобы учиться и обмениваться.

Справочная ссылка