宣佈 Istio client-go
取得對 Istio 資源的程式化存取權限。
我們很高興宣佈 Istio client go 儲存庫的初始版本,這讓開發人員能夠在 Kubernetes 環境中取得對 Istio API 的程式化存取權限。此儲存庫中產生的 Kubernetes informer 和客戶端集合,使開發人員可以輕鬆地為所有 Istio 自定義資源定義 (CRD) 建立控制器並執行建立、讀取、更新和刪除 (CRUD) 操作。
這是許多 Istio 使用者強烈要求的功能,從 Aspen Mesh 和 Knative 專案產生的客戶端的功能請求中可以明顯看出。如果您目前正在使用上述客戶端之一,您可以輕鬆切換到使用 Istio client go,如下所示:
import (
...
- versionedclient "github.com/aspenmesh/istio-client-go/pkg/client/clientset/versioned"
+ versionedclient "istio.io/client-go/pkg/clientset/versioned"
)
由於產生的客戶端集合在功能上是等效的,因此只需切換導入的客戶端程式庫就足以使用新產生的程式庫。
如何使用 client-go
Istio client go 儲存庫遵循與 Istio API 儲存庫相同的分支策略,因為客戶端儲存庫依賴於 API 定義。如果您想使用穩定的客戶端集合,您可以使用 client go 儲存庫中的發布分支或標記版本。使用客戶端集合與使用 Kubernetes client go 非常相似,以下是一個使用客戶端列出傳遞命名空間中所有 Istio 虛擬服務的快速範例:
package main
import (
"log"
"os"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/tools/clientcmd"
versionedclient "istio.io/client-go/pkg/clientset/versioned"
)
func main() {
kubeconfig := os.Getenv("KUBECONFIG")
namespace := os.Getenv("NAMESPACE")
if len(kubeconfig) == 0 || len(namespace) == 0 {
log.Fatalf("Environment variables KUBECONFIG and NAMESPACE need to be set")
}
restConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
log.Fatalf("Failed to create k8s rest client: %s", err)
}
ic, err := versionedclient.NewForConfig(restConfig)
if err != nil {
log.Fatalf("Failed to create istio client: %s", err)
}
// Print all VirtualServices
vsList, err := ic.NetworkingV1alpha3().VirtualServices(namespace).List(metav1.ListOptions{})
if err != nil {
log.Fatalf("Failed to get VirtualService in %s namespace: %s", namespace, err)
}
for i := range vsList.Items {
vs := vsList.Items[i]
log.Printf("Index: %d VirtualService Hosts: %+v\n", i, vs.Spec.GetHosts())
}
}
您可以在這裡找到更深入的範例。
為產生 Istio client-go 而建立的實用工具
如果您想知道為什麼花了這麼長時間或為什麼難以產生這個客戶端集合,那麼本節就是為您準備的。在 Istio 中,我們使用 protobuf 規格來編寫 API,然後使用 protobuf 工具鏈將其轉換為 Go 定義。如果您嘗試從 protobuf 產生的 API 產生 Kubernetes 客戶端集合,您可能會面臨三個主要挑戰:
建立 Kubernetes 包裝類型 - Kubernetes 客戶端生成程式庫僅適用於遵循 Kubernetes 物件規範的 Go 物件,例如 身份驗證策略 Kubernetes 包裝器。這表示對於每個需要程式化存取的 API,您都需要建立這些包裝器。此外,每個需要客戶端程式碼產生的
CRD
群組、版本和種類都需要大量的樣板程式碼。為了自動化此過程,我們建立了一個 Kubernetes 類型產生器工具,該工具可以根據註釋自動建立 Kubernetes 類型。此工具解析的註釋和各種可用選項在 README 中進行了說明。請注意,如果您使用 protobuf 工具產生 Go 類型,您需要在 proto 檔案中將這些註釋作為註解新增,以便註解存在於此工具使用的產生的 Go 檔案中。產生深度複製方法 - 在 Kubernetes 客戶端機制中,如果您想變更從客戶端集合傳回的任何物件,您需要複製該物件,以防止修改快取儲存中的物件。執行此操作的正規方法是在所有巢狀類型上建立
deepcopy
方法。我們建立了一個工具 protoc 深度複製產生器,這是一個protoc
外掛程式,可以根據使用 Proto 程式庫實用程式 Proto Clone 的註釋自動建立deepcopy
方法。以下是產生的deepcopy
方法的範例。將類型封送處理和解除封送處理為 JSON/從 JSON 解除封送處理 - 對於從 proto 定義產生的類型,使用預設的 Go JSON 編碼器/解碼器通常會有問題,因為有各種欄位(例如 protobuf 的
oneof
)需要特殊處理。此外,名稱中帶有底線的任何 Proto 欄位,根據編碼器/解碼器,可能會序列化/解除序列化為不同的欄位名稱,因為 Go 結構標籤的產生方式不同。始終建議使用 protobuf 基元來序列化/解除序列化為 JSON,而不是依賴預設的 Go 程式庫。我們建立了一個工具 protoc JSON shim,這是一個protoc
外掛程式,可以自動為從 Proto 定義產生的所有 Go 類型建立封送處理器/解除封送處理器。以下是此工具產生的程式碼的範例。
我希望新發佈的客戶端程式庫能夠讓使用者為 Istio API 建立更多整合和控制器,並且開發人員可以使用上述工具從 Proto API 產生 Kubernetes 客戶端集合。