技術共有

[k8s ソースコード] 1.client-go をクラスター外にデプロイする

2024-07-12

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

client-go は、開発者が kubernetes と対話するために特別に k8s によって公開および保守されているクライアント ライブラリです。 k8s リソースに対する CRUD 操作 (作成、読み取り、更新、削除)、イベントの監視と処理、および Kubernetes クラスターのコンテキストと構成へのアクセスをサポートします。

Client go は、kubernetes クラスターから独立していますが、クラスターと対話するクライアント マシンです。このマシンに go 環境をインストールし、kubernetes との接続を確立します。

リナックス

go環境をインストールする

go 環境を新しいノード (私の場合は仮想マシン) にインストールするには、まず go インストール パッケージをダウンロードし、公式 Web サイトからダウンロードします。すべてのリリース - Go プログラミング言語

サーバーバージョンの仮想マシンをインストールしているため、go 環境をインストールするときに、curl コマンドを使用してインストールパッケージをダウンロードします。 go 環境と k8s クラスター間の互換性を判断する必要があるため、クラスターの k8s バージョンを確認する必要があります。

[root@master ~]# kubectl version --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 のバージョンを確認して、go が正常にインストールされているかどうかを確認します。

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

環境変数に go を永続的に追加し、上記のexport PATH=...をシステムファイルに書き込みます。

  1. [root@client ~]# vim ~/.bashrc
  2. [root@client ~]# source ~/.bashrc
client-go を構成する

Kubernetes バージョン >= v1.17.0 を使用している場合は、対応する v0.xy タグを使用してください。たとえば、k8s.io/[email protected] は Kubernetes v1.20.4 に対応します。私のバージョンは 1.23.1 なので、対応する client-go バージョンをダウンロードします。

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.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

ウィンドウズ

kubectl をダウンロードします。ここでダウンロードして保存する場所は、後で参照する場所なので、保存パスを覚えておいて、ダウンロードフォルダーに保存しないことをお勧めします。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 に設定します。

VSコード

client-go をローカルにダウンロードしてから、vscode で go プラグインとコード ランナー プラグインをダウンロードします。

次に、cstrl+shift+p を押し、vscode 検索行を入力し、go プラグインの依存関係をインストールします。 Search Go:ツールのインストール/更新

この問題が発生した場合は、環境変数を設定する必要があります。次の 4 つの環境変数を設定します。ここで、 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

操作が成功したことがわかりました。