通過整合對應語言的SDK Client,您可以在代碼中直接操作Istio資源。本文以Go 1.18和SDK istio.io/client-go v1.14.0版本為例,介紹如何使用Go SDK操作Istio資源。
前提條件
已建立一個ASM執行個體,並已將ACK叢集添加到ASM執行個體中。具體操作,請參見建立ASM執行個體和添加叢集到ASM執行個體。
- 已部署Bookinfo應用樣本到ASM執行個體的ACK叢集中。具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
- 已在ASM執行個體的ACK叢集中部署入口網關。具體操作,請參見建立入口網關。
準備工作
安裝依賴
- 在專案路徑下啟動命令列終端。
- 可選:如果專案中未建立go.mod檔案,請執行以下命令。
go mod init [模組名]
- 執行以下命令,安裝依賴包。
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
配置串連
登入ASM控制台。
在左側導覽列,選擇 。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
- 在網格詳情頁面左側導覽列單擊基本資料,然後在右側頁面單擊串連配置。
- 在串連配置面板,複製檔案內容到$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)
}
}