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")
}