全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用Go SDK操作Istio資源

更新時間:Jun 30, 2024

通過整合對應語言的SDK Client,您可以在代碼中直接操作Istio資源。本文以Go 1.18和SDK istio.io/client-go v1.14.0版本為例,介紹如何使用Go SDK操作Istio資源。

前提條件

準備工作

安裝依賴

  1. 在專案路徑下啟動命令列終端。
  2. 可選:如果專案中未建立go.mod檔案,請執行以下命令。
    go mod init [模組名]
  3. 執行以下命令,安裝依賴包。
    go get github.com/ghodss/yaml istio.io/client-go/pkg/apis/networking/v1beta1 istio.io/client-go/pkg/clientset/versioned k8s.io/apimachinery/pkg/apis/meta/v1 k8s.io/client-go/tools/clientcmd

配置串連

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 在網格詳情頁面左側導覽列單擊基本資料,然後在右側頁面單擊串連配置
  5. 串連配置面板,複製檔案內容到$HOME/.kube/config路徑下。

組建組態檔案

在代碼中使用SDK操作Istio資源頁面建立的virtualService.yaml和gateway.yaml檔案儲存到專案檔夾中。

操作步驟

建立虛擬服務

執行以下代碼,在default命名空間建立virtualService.yaml指定的虛擬服務。

package main

import (
    "context"
    "fmt"
    "io/ioutil"

    "github.com/ghodss/yaml"
    "istio.io/client-go/pkg/apis/networking/v1beta1"
    versionedclient "istio.io/client-go/pkg/clientset/versioned"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    const NAMESPACE = "default"
    restConfig, err := clientcmd.BuildConfigFromFlags("", "{path to kube config file}") // 將{}內容替換成Kube Config實際路徑,預設是$HOME/.kube/config。
    if err != nil {
        fmt.Println("擷取串連配置失敗")
        return
    }
    clientset, err := versionedclient.NewForConfig(restConfig)
    if err != nil {
        fmt.Println("建立用戶端失敗")
        return
    }
    // 此處通過YAML還原序列化構造VirtualService結構體,也可以直接構造。
    virtualService := &v1beta1.VirtualService{}
    bytes, err := ioutil.ReadFile("virtualService.yaml")
    if err != nil {
        fmt.Println("讀取yaml檔案失敗")
        return
    }
    err = yaml.Unmarshal(bytes, &virtualService)
    if err != nil {
        fmt.Println("還原序列化失敗")
        return
    }
    _, err = clientset.NetworkingV1beta1().VirtualServices(NAMESPACE).Create(context.TODO(), virtualService, metav1.CreateOptions{})
    if err != nil {
        fmt.Println("建立虛擬服務失敗")
    }
    printAllVisualServices(clientset, NAMESPACE)
}

// 列印命名空間下全部的虛擬服務。
func printAllVisualServices(clientset *versionedclient.Clientset, namespace string) {
    vsList, err := clientset.NetworkingV1beta1().VirtualServices(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        fmt.Println("擷取虛擬服務失敗")
    }
    for _, vs := range vsList.Items {
        fmt.Println(vs)
    }
}

建立網關規則

執行以下代碼,在default命名空間建立gateway.yaml指定的網關規則。

package main

import (
    "context"
    "fmt"
    "io/ioutil"

    "github.com/ghodss/yaml"
    "istio.io/client-go/pkg/apis/networking/v1beta1"
    versionedclient "istio.io/client-go/pkg/clientset/versioned"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    const NAMESPACE = "default"
    restConfig, err := clientcmd.BuildConfigFromFlags("", "{path to kube config file}") // 將{}內容替換成Kube Config實際路徑,預設是$HOME/.kube/config。
    if err != nil {
        fmt.Println("擷取串連配置失敗")
        return
    }
    clientset, err := versionedclient.NewForConfig(restConfig)
    if err != nil {
        fmt.Println("建立用戶端失敗")
        return
    }
    // 此處通過YAML還原序列化構造Gateway結構體,也可以直接構造。
    gateway := &v1beta1.Gateway{}
    bytes, err := ioutil.ReadFile("gateway.yaml")
    if err != nil {
        fmt.Println("讀取yaml檔案失敗")
        return
    }
    err = yaml.Unmarshal(bytes, &gateway)
    if err != nil {
        fmt.Println("還原序列化失敗")
        return
    }
    _, err = clientset.NetworkingV1beta1().Gateways(NAMESPACE).Create(context.TODO(), gateway, metav1.CreateOptions{})
    if err != nil {
        fmt.Println("建立網關規則失敗")
    }
    printAllGateways(clientset, NAMESPACE)
}

// 列印命名空間下全部的網關規則。
func printAllGateways(clientset *versionedclient.Clientset, namespace string) {
    gwList, err := clientset.NetworkingV1beta1().Gateways(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        fmt.Println("擷取網關規則失敗")
    }
    for _, gw := range gwList.Items {
        fmt.Println(gw)
    }
}
            

後續步驟

虛擬服務和網關規則建立完成後,您可以在瀏覽器中訪問http://{入口網關服務的IP地址}/productpage,查看Bookinfo應用。