Обмен технологиями

[исходный код k8s] 1.развертывание client-go за пределами кластера

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

client-go — это клиентская библиотека, опубликованная и поддерживаемая k8s специально для разработчиков, которые могут взаимодействовать с Kubernetes. Он поддерживает операции CRUD (создание, чтение, обновление, удаление) на ресурсах k8s, мониторинг и обработку событий, а также доступ к контексту и конфигурации кластера Kubernetes.

Client go — это клиентская машина, независимая от кластера Kubernetes, но взаимодействующая с ним. Установите среду go на этот компьютер и установите соединение с kubernetes.

Линукс

Установить среду go

Чтобы установить среду go на новый узел (в моем случае — виртуальную машину), сначала скачайте установочный пакет go и скачайте его с официального сайта.Все выпуски - Язык программирования Go

Поскольку я устанавливаю серверную версию виртуальной машины, то при установке среды go я использую команду curl для загрузки установочного пакета. Поскольку вам необходимо определить совместимость среды go и кластера k8s, вам необходимо проверить версию кластера k8s.

[root@master ~]# версия kubectl --short
Версия клиента: v1.23.1
Версия сервера: v1.23.1

Проверьте официальную документацию Kubernetes и убедитесь, что она соответствует версии go 1.19.5.

  1. [root@client ~]# curl -L -O https://go.dev/dl/go1.19.5.linux-amd64.tar.gz
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 100 75 100 75 0 0 131 0 --:--:-- --:--:-- --:--:-- 131
  5. 100 65.7M 100 65.7M 0 0 3446k 0 0:00:19 0:00:19 --:--:-- 3513k
  6. [root@client ~]# file go1.22.5.linux-amd64.tar.gz
  7. # 验证下载文件的类型是否为压缩包
  8. go1.22.5.linux-amd64.tar.gz: gzip compressed data, max compression, original size modulo 2^32 232839680 gzip compressed data, unknown method, has CRC, extra field, has comment, encrypted, from FAT filesystem (MS-DOS, OS/2, NT), original size modulo 2^32 232839680
  9. [root@client ~]# rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz

Добавьте go в переменную среды и проверьте версию go, чтобы определить, успешно ли он установлен.

  1. [root@client ~]# export PATH=$PATH:/usr/local/go/bin
  2. [root@client ~]# go version
  3. go version go1.19.5 linux/amd64

Добавьте постоянный переход к переменной среды и запишите указанный выше экспорт PATH=... в системный файл.

  1. [root@client ~]# vim ~/.bashrc
  2. [root@client ~]# source ~/.bashrc
Настройка клиентского перехода

Если вы используете версию Kubernetes >= v1.17.0, используйте соответствующий тег v0.xy. Например, k8s.io/[email protected] соответствует Kubernetes v1.20.4. Моя версия — 1.23.1, поэтому загрузите соответствующую версию клиента:

go get k8s.io/client-go@v0.23.1

Файл go mod создает и запускает поддержку режима go:

  1. go mod init <module-name>
  2. export GO111MODULE=on

Затем будет создан исходный файл go.mod, включающий имя модуля и информацию о версии go. По мере развертывания проекта или добавления зависимостей go будет автоматически обновляться. Файл go.mod будет автоматически обновляться, записывая все зависимости и их версии. Файл go.sum также создается для обеспечения согласованности и полноты зависимостей. Таким образом, файл go.mod будет постепенно накапливать все зависимости и информацию о версии, необходимую проекту.

Используйте client-go для сбора информации

Напишите файл main.go

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  6. "k8s.io/client-go/kubernetes"
  7. "k8s.io/client-go/tools/clientcmd"
  8. "context"
  9. )
  10. func main() {
  11. // 配置 k8s 集群外 kubeconfig 配置文件
  12. var kubeconfig *string
  13. kubeconfig = flag.String("kubeconfig", "/etc/k8scoonfig/config", "absolute path to the kubeconfig file")
  14. namespace := flag.String("namespace","default","the namespace to list the pod from")
  15. flag.Parse()
  16. // use the current context in kubeconfig
  17. config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  18. if err != nil {
  19. panic(err.Error())
  20. }
  21. // create the clientset
  22. clientset, err := kubernetes.NewForConfig(config)
  23. if err != nil {
  24. panic(err.Error())
  25. }
  26. // 获取集群中所有 Pod 列表
  27. pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
  28. if err != nil {
  29. panic(err.Error())
  30. }
  31. fmt.Printf("There are %d pods in the k8s clustern", len(pods.Items))
  32. // 获取指定 namespace 中的 Pod 列表
  33. pods, err = clientset.CoreV1().Pods(*namespace).List(context.TODO(), metav1.ListOptions{})
  34. if err != nil {
  35. panic(err)
  36. }
  37. fmt.Printf("There are %d pods in namespace %sn", len(pods.Items), namespace)
  38. for _, pod := range pods.Items {
  39. fmt.Printf("Name: %s, Status: %s, CreateTime: %vn", pod.Name, pod.Status.Phase, pod.CreationTimestamp)
  40. }
  41. }

Указав пространство имен как Monitor-sa, вы можете видеть, что client-go успешно зафиксировал количество модулей в пространстве имен в кластере.

  1. [root@client client_go_examples]# ./app -kubeconfig=/etc/k8scoonfig/config -namespace="monitor-sa"
  2. There are 18 pods in the k8s cluster
  3. There are 3 pods in namespace monitor-sa
  4. Name: node-exporter-jb9jp, Status: Running, CreateTime: 2024-07-06 11:47:33 +0000 UTC
  5. Name: node-exporter-kpvxd, Status: Running, CreateTime: 2024-07-06 11:47:33 +0000 UTC
  6. Name: node-exporter-pwdw4, Status: Running, CreateTime: 2024-07-06 11:47:33 +0000 UTC

окна

Загрузите кубектл. Обратите внимание, что место, которое вы загружаете и сохраняете здесь, — это то место, на которое вы будете ссылаться позже, поэтому лучше запомнить путь сохранения и не сохранять его в папке загрузки.https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/windows/amd64/kubectl.exe

Затем добавьте его в переменную среды. Здесь kube — это папка, в которой хранится kubectl.exe.

Откройте командную строку Windows и проверьте, правильно ли работает kubectl.

Настройте kube-config и скопируйте файл конфигурации, скопированный в систему Linux, в Windows. Это каталог C:/user/.kube/config. Затем настройте его в vscode.

VSCode

Загрузите client-go локально, затем загрузите плагин go и плагин для запуска кода в vscode:

Затем cstrl+shift+p, введите строку поиска vscode и установите зависимости плагина go. Поиск Go:инструменты установки/обновления

Если это произойдет, вам необходимо установить переменные среды. Установите следующие четыре переменные среды, где go_path — это каталог, в котором хранится код go, который вы хотите запустить, а go_root — это каталог, в который вы загрузили go.

Проверьте путь. Если есть следующее, это нормально:

В это время попробуйте еще раз загрузить инструменты GO:install/update, и это будет успешно.

После успешной установки установите client-go в каталог gopath.

  1. go get k8s.io/client-go@v0.23.1
  2. go get k8s.io/apimachinery@v0.23.1
  3. #使用 go mod tidy 确保所有依赖项已被正确下载并添加到项目中:
  4. go mod tidy
  5. go run main.go

Обнаружил, что операция прошла успешно: