Condivisione della tecnologia

[codice sorgente k8s] Distribuzione 1.client-go all'esterno del cluster

2024-07-12

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

client-go è una libreria client pubblicata e gestita da k8s specificatamente per consentire agli sviluppatori di interagire con Kubernetes. Supporta operazioni CRUD (creazione, lettura, aggiornamento, eliminazione) su risorse k8s, monitoraggio ed elaborazione di eventi e accesso al contesto e alla configurazione del cluster Kubernetes.

Client go è una macchina client indipendente dal cluster Kubernetes ma che interagisce con il cluster. Installa l'ambiente go su questa macchina e stabilisci una connessione con Kubernetes.

Linux

Installa l'ambiente go

Per installare l'ambiente go su un nuovo nodo (nel mio caso, una macchina virtuale), scarica prima il pacchetto di installazione go e scaricalo dal sito ufficiale.Tutte le release - Il linguaggio di programmazione Go

Poiché sto installando una versione server della macchina virtuale, durante l'installazione dell'ambiente go utilizzo il comando curl per scaricare il pacchetto di installazione. Poiché è necessario determinare la compatibilità tra l'ambiente go e il cluster k8s, è necessario verificare la versione k8s del cluster.

[root@master ~]# kubectl versione --short
Versione client: v1.23.1
Versione del server: v1.23.1

Controlla la documentazione ufficiale di Kubernetes e scopri che corrisponde alla versione 1.19.5 di go.

  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

Aggiungi go alla variabile di ambiente e controlla la versione di go per determinare se go è stato installato correttamente.

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

Aggiungi vai alla variabile di ambiente in modo persistente e scrivi il precedente export PATH=... nel file di sistema.

  1. [root@client ~]# vim ~/.bashrc
  2. [root@client ~]# source ~/.bashrc
Configura client-go

Se utilizzi la versione Kubernetes >= v1.17.0, utilizza il tag v0.xy corrispondente. Ad esempio, k8s.io/[email protected] corrisponde a Kubernetes v1.20.4. La mia versione è 1.23.1, quindi scarica la versione client-go corrispondente:

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

Il file go mod crea e avvia il supporto della modalità go:

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

Verrà quindi creato un file go.mod iniziale, incluso il nome del modulo e le informazioni sulla versione di go. Man mano che il progetto viene distribuito o le dipendenze vengono aggiunte, go si aggiornerà automaticamente, registrando tutte le dipendenze e le relative versioni Viene generato anche il file go.sum per garantire la coerenza e la completezza delle dipendenze. Pertanto, il file go.mod accumulerà gradualmente tutte le dipendenze e le informazioni sulla versione richieste dal progetto.

Utilizza client-go per acquisire informazioni

Scrivi il file 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. }

Quando specifichi lo spazio dei nomi come monitor-sa, puoi vedere che client-go ha acquisito correttamente il numero di pod nello spazio dei nomi nel cluster.

  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

finestre

Scarica kubectl. Tieni presente che il luogo in cui scarichi e salvi qui è il luogo a cui farai riferimento in seguito, quindi è meglio ricordare il percorso di salvataggio e non salvarlo nella cartella di download.https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/windows/amd64/kubectl.exe

Quindi aggiungilo alla variabile di ambiente. Il kube qui è la cartella in cui è archiviato kubectl.exe.

Apri la riga di comando di Windows e verifica se kubectl funziona correttamente.

Configura kube-config e copia il file di configurazione copiato nel sistema Linux in Windows. La directory qui è C:/user/.kube/config. Quindi configuralo in vscode.

Codice VSC

Scarica client-go localmente, quindi scarica il plug-in go e il plug-in code runner in vscode:

Quindi cstrl+shift+p, inserisci la riga di ricerca vscode e installa le dipendenze del plug-in go. Cerca Go:installa/aggiorna strumenti

Se ciò accade, è necessario impostare le variabili di ambiente. Imposta le seguenti quattro variabili di ambiente, dove go_path è la directory in cui è archiviato il codice go che desideri eseguire e go_root è la directory in cui hai scaricato go.

Controlla il percorso. Se è presente quanto segue, è normale:

A questo punto, prova a scaricare nuovamente GO:install/update tools e l'operazione avrà esito positivo.

Al termine dell'installazione, installare client-go nella directory 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

Appurato che l'operazione è andata a buon fine: