使用Go SDK操作服务网格资源

ASM1.17版本开始提供了Istio资源的SDKAPI定义,并从1.24版本开始支持配置ASM的自定义资源。本文介绍如何通过ASM Go SDKASM服务网格资源进行操作。

在项目中引入 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")
}