全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用Go SDK操作服務網格資源

更新時間:Mar 27, 2025

ASM從1.17版本開始提供了Istio資源的SDK和API定義,並從1.24版本開始支援配置ASM的自訂資源。本文介紹如何通過ASM Go SDK對ASM服務網格資源進行操作。

在專案中引入 ASM SDK

您可以在專案根目錄執行以下命令,將ASM Go SDK引入到您的專案中。

go get github.com/aliyun/alibabacloud-servicemesh-go-client@release-1.24.1
go get github.com/aliyun/alibabacloud-servicemesh-api@release-1.24.1

其中release-1.24.1為倉庫的分支,對應了1.24版本。您可以根據您實際的ASM版本選擇合適的版本:

若您的執行個體版本低於1.17,請前往Istio社區倉庫擷取依賴:

準備工作

以下通過一段範例程式碼對使用Go SDK操作ASM資源進行說明。

擷取代碼

  1. 將 asm-labs 代碼倉庫複製到本地。

    git clone https://github.com/AliyunContainerService/asm-labs.git
  2. 進入範例程式碼目錄。

    cd clients-demo/client-go

配置串連

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格執行個體 > 基本資料

  3. 在右側頁面單擊串連配置,複製配置內容到$HOME/.kube/config路徑下。

運行範例程式碼

運行 Go SDK 樣本。

go run main.go

預期輸出:

I0311 16:39:14.367128  650926 main.go:24] successfully create rest config
I0311 16:39:14.367296  650926 main.go:31] successfully create clientset
I0311 16:39:14.367301  650926 main.go:33] run cluster scope clients demo
I0311 16:39:14.496240  650926 main.go:60] successfully create asmswimlanegroup
I0311 16:39:14.547445  650926 main.go:67] successfully get asmswimlanegroup
I0311 16:39:14.655944  650926 main.go:74] successfully list asmswimlanegroups
I0311 16:39:14.724114  650926 main.go:81] successfully delete asmswimlanegroup
I0311 16:39:14.724124  650926 main.go:36] run namespaced scope clients demo
I0311 16:39:14.779630  650926 main.go:97] successfully create asmlocalratelimiter
I0311 16:39:14.826832  650926 main.go:104] successfully get asmlocalratelimiter
I0311 16:39:14.881993  650926 main.go:111] successfully list asmlocalratelimiters
I0311 16:39:14.947009  650926 main.go:118] successfully delete asmlocalratelimiter
I0311 16:39:14.947020  650926 main.go:39] run istio resource demo
I0311 16:39:15.002439  650926 main.go:134] successfully create virtualservice
I0311 16:39:15.052896  650926 main.go:141] successfully get virtualservice
I0311 16:39:16.258057  650926 main.go:148] successfully list virtualservices
I0311 16:39:16.323547  650926 main.go:155] successfully delete virtualservice

代碼說明

以下對main.go進行解釋說明。

Kubeconfig讀取與client初始化

讀取配置到當前環境的kubeconfig,預設讀取路徑為${HOME}/.kube/config

kubeconfigPath := os.Getenv("HOME") + "/.kube/config"
cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
if err != nil {
  klog.Errorf("failed to create rest config, err: %+v", err)
  os.Exit(1)
}
klog.Info("successfully create rest config")

初始化ASM資源的clientset。

clientset, err := asmversionedclient.NewForConfig(cfg)
if err != nil {
  klog.Errorf("failed to create clientset, err: %+v", err)
  os.Exit(1)
}
klog.Info("successfully create asm clientset")

初始化Istio資源的clientset。

istioclientset, err := istioversionedclient.NewForConfig(cfg)
if err != nil {
  klog.Errorf("failed to create istio clientset, err: %+v", err)
  os.Exit(1)
}
klog.Info("successfully create istio clientset")

叢集層級資源操作

操作叢集層級的資源 ASMSwimLaneGroup,包括建立、查詢和刪除。

func runClusterScopeDemo(clientset *asmversionedclient.Clientset) {
	asmswimlanegroup := &asmv1.ASMSwimLaneGroup{}
	err := yaml.Unmarshal([]byte(swimlanegroupYaml), &asmswimlanegroup)
	if err != nil {
		klog.Errorf("failed to unmarshal yaml bytes, err: %+v", err)
		os.Exit(1)
	}

	_, err = clientset.IstioV1().ASMSwimLaneGroups().Create(context.TODO(), asmswimlanegroup, metav1.CreateOptions{})
	if err != nil {
		klog.Errorf("failed to create asmswimlanegroup, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully create asmswimlanegroup")

	_, err = clientset.IstioV1().ASMSwimLaneGroups().Get(context.TODO(), asmswimlanegroup.Name, metav1.GetOptions{})
	if err != nil {
		klog.Errorf("failed to get asmswimlanegroup, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully get asmswimlanegroup")

	_, err = clientset.IstioV1().ASMSwimLaneGroups().List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		klog.Errorf("failed to list asmswimlanegroups, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully list asmswimlanegroups")

	err = clientset.IstioV1().ASMSwimLaneGroups().Delete(context.TODO(), asmswimlanegroup.Name, metav1.DeleteOptions{})
	if err != nil {
		klog.Errorf("failed to delete asmswimlanegroup, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully delete asmswimlanegroup")
}

命名空間層級操作

操作命名空間層級的資源 ASMLocalRateLimiter,包括建立、查詢和刪除。

func runNamespacedScopeDemo(clientset *asmversionedclient.Clientset) {
	asmlocalratelimiter := &asmv1.ASMLocalRateLimiter{}
	err := yaml.Unmarshal([]byte(localratelimiterYaml), &asmlocalratelimiter)
	if err != nil {
		klog.Errorf("failed to unmarshal yaml bytes, err: %+v", err)
		os.Exit(1)
	}

	_, err = clientset.IstioV1().ASMLocalRateLimiters(asmlocalratelimiter.Namespace).Create(context.TODO(), asmlocalratelimiter, metav1.CreateOptions{})
	if err != nil {
		klog.Errorf("failed to create asmlocalratelimiter, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully create asmlocalratelimiter")

	_, err = clientset.IstioV1().ASMLocalRateLimiters(asmlocalratelimiter.Namespace).Get(context.TODO(), asmlocalratelimiter.Name, metav1.GetOptions{})
	if err != nil {
		klog.Errorf("failed to get asmlocalratelimiter, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully get asmlocalratelimiter")

	_, err = clientset.IstioV1().ASMLocalRateLimiters(asmlocalratelimiter.Namespace).List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		klog.Errorf("failed to list asmlocalratelimiters, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully list asmlocalratelimiters")

	err = clientset.IstioV1().ASMLocalRateLimiters(asmlocalratelimiter.Namespace).Delete(context.TODO(), asmlocalratelimiter.Name, metav1.DeleteOptions{})
	if err != nil {
		klog.Errorf("failed to delete asmlocalratelimiter, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully delete asmlocalratelimiter")
}

Istio資源操作樣本

操作命名空間層級的資源 VirtualService,包括建立、查詢和刪除。

func runIstioResourceDemo(clientset *istioversionedclient.Clientset) {
	vs := &networkingv1.VirtualService{}
	err := yaml.Unmarshal([]byte(virtualserviceYaml), &vs)
	if err != nil {
		klog.Errorf("failed to unmarshal yaml bytes, err: %+v", err)
		os.Exit(1)
	}

	_, err = clientset.NetworkingV1().VirtualServices(vs.Namespace).Create(context.TODO(), vs, metav1.CreateOptions{})
	if err != nil {
		klog.Errorf("failed to create virtualservice, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully create virtualservice")

	_, err = clientset.NetworkingV1().VirtualServices(vs.Namespace).Get(context.TODO(), vs.Name, metav1.GetOptions{})
	if err != nil {
		klog.Errorf("failed to get virtualservice, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully get virtualservice")

	_, err = clientset.NetworkingV1().VirtualServices(vs.Namespace).List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		klog.Errorf("failed to list virtualservices, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully list virtualservices")

	err = clientset.NetworkingV1().VirtualServices(vs.Namespace).Delete(context.TODO(), vs.Name, metav1.DeleteOptions{})
	if err != nil {
		klog.Errorf("failed to delete virtualservice, err: %+v", err)
		os.Exit(1)
	}
	klog.Info("successfully delete virtualservice")
}