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资源进行说明。
获取代码
将 asm-labs 代码仓库克隆到本地。
git clone https://github.com/AliyunContainerService/asm-labs.git
进入示例代码目录。
cd clients-demo/client-go
配置连接
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在右侧页面单击连接配置,复制配置内容到
$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")
}
该文章对您有帮助吗?