在代码中使用SDK操作Istio资源一(Golang)

简介: 如何在代码中使用SDK操作Istio资源

定制资源(Custom Resource)是对 Kubernetes API 的扩展。Istio在k8s原生资源的基础上增加了Virtual Service,Gateway等资源。通常我们操作这些资源时,都是在命令行通过 kubectl 进行。如果想在代码中直接操作相关资源时,该怎么办呢?

其实通过集成对应语言的Istio Client,我们可以通过对应语言的代码中直接操作Istio定制资源。

本文介绍如何使用Go语言的SDK client-go在ASM中创建istio资源。

前提条件

首先当然需要准备好kubernetes集群并安装好Istio。文本中代码基于go1.18与istio.io/client-go v1.14.0版本编写。

安装依赖

  1. 在项目路径下启动命令行终端
  2. 如果项目中尚未创建go.mod文件,运行
go mod init [模块名]
  1. 安装依赖包
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

配置连接

我们需要获取集群的 kubeconfig 文件,这个文件通常位于 Kubernetes 集群的 master 节点服务器的 $HOME/.kube/config 路径(注意,kubeconfig是类型名而不是文件名)。并复制到计算机 $HOME/.kube/config 或自定义路径下的kube config文件中。

生成配置文件

将下列虚拟服务和网关规则对应配置分别保存成 virtualService.yamlgateway.yaml,并放入项目文件夹中。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:  name: bookinfo
spec:  hosts:  - "*"  gateways:  - bookinfo-gateway
  http:  - match:    - uri:        exact: /productpage
    - uri:        prefix: /static
    - uri:        exact: /login
    - uri:        exact: /logout
    - uri:        prefix: /api/v1/products
    route:    - destination:        host: productpage
        port:          number: 9080
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:  name: bookinfo-gateway
spec:  selector:    istio: ingressgateway # use istio default controller  servers:  - port:      number: 80      name: http
      protocol: HTTP
    hosts:    - "*"

创建虚拟服务

以下代码将在default命名空间创建 virtualService.yaml指定的虚拟服务。

packagemainimport (
"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")
funcmain() {
constNAMESPACE="default"restConfig, err :=clientcmd.BuildConfigFromFlags("", "{path to kube config file}") // 将{}内容替换成kube config实际路径,默认是$HOME/.kube/configiferr!=nil {
fmt.Println("获取连接配置失败")
return    }
clientset, err :=versionedclient.NewForConfig(restConfig)
iferr!=nil {
fmt.Println("创建客户端失败")
return    }
// 此处通过yaml反序列化构造VirtualService结构体,也可以直接构造virtualService :=&v1beta1.VirtualService{}
bytes, err :=ioutil.ReadFile("virtualService.yaml")
iferr!=nil {
fmt.Println("读取yaml文件失败")
return    }
err=yaml.Unmarshal(bytes, &virtualService)
iferr!=nil {
fmt.Println("反序列化失败")
return    }
_, err=clientset.NetworkingV1beta1().VirtualServices(NAMESPACE).Create(context.TODO(), virtualService, metav1.CreateOptions{})
iferr!=nil {
fmt.Println("创建虚拟服务失败")
    }
printAllVisualServices(clientset, NAMESPACE)
}
// 打印命名空间下全部的虚拟服务funcprintAllVisualServices(clientset*versionedclient.Clientset, namespacestring) {
vsList, err :=clientset.NetworkingV1beta1().VirtualServices(namespace).List(context.TODO(), metav1.ListOptions{})
iferr!=nil {
fmt.Println("获取虚拟服务失败")
    }
for_, vs :=rangevsList.Items {
fmt.Println(vs)
    }
}


创建网关规则

以下代码将在default命名空间创建 gateway.yaml指定的网关规则。

packagemainimport (
"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")
funcmain() {
constNAMESPACE="default"restConfig, err :=clientcmd.BuildConfigFromFlags("", "{path to kube config file}") // 将{}内容替换成kube config实际路径,默认是$HOME/.kube/configiferr!=nil {
fmt.Println("获取连接配置失败")
return    }
clientset, err :=versionedclient.NewForConfig(restConfig)
iferr!=nil {
fmt.Println("创建客户端失败")
return    }
// 此处通过yaml反序列化构造Gateway结构体,也可以直接构造gateway :=&v1beta1.Gateway{}
bytes, err :=ioutil.ReadFile("gateway.yaml")
iferr!=nil {
fmt.Println("读取yaml文件失败")
return    }
err=yaml.Unmarshal(bytes, &gateway)
iferr!=nil {
fmt.Println("反序列化失败")
return    }
_, err=clientset.NetworkingV1beta1().Gateways(NAMESPACE).Create(context.TODO(), gateway, metav1.CreateOptions{})
iferr!=nil {
fmt.Println("创建网关规则失败")
    }
printAllGateways(clientset, NAMESPACE)
}
// 打印命名空间下全部的网关规则funcprintAllGateways(clientset*versionedclient.Clientset, namespacestring) {
gwList, err :=clientset.NetworkingV1beta1().Gateways(namespace).List(context.TODO(), metav1.ListOptions{})
iferr!=nil {
fmt.Println("获取网关规则失败")
    }
for_, gw :=rangegwList.Items {
fmt.Println(gw)
    }
}


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1463 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
1月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
90 15
在 golang 中执行 javascript 代码的方案详解
|
1月前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
5月前
|
存储 Java API
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
【Azure 存储服务】Java Storage SDK 调用 uploadWithResponse 代码示例(询问ChatGTP得代码原型后人力验证)
|
5月前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
5月前
|
存储 大数据 测试技术
掌握 GoLang 中的指针:高效代码的提示和技巧
掌握 GoLang 中的指针:高效代码的提示和技巧
|
5月前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
56 0
|
5月前
|
存储 API 开发工具
【Azure Developer】使用 Python SDK连接Azure Storage Account, 计算Blob大小代码示例
【Azure Developer】使用 Python SDK连接Azure Storage Account, 计算Blob大小代码示例
|
5月前
|
存储 API 开发工具
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
|
5月前
|
固态存储 Java 网络安全
【Azure Developer】使用Java SDK代码创建Azure VM (包含设置NSG,及添加数据磁盘SSD)
【Azure Developer】使用Java SDK代码创建Azure VM (包含设置NSG,及添加数据磁盘SSD)

热门文章

最新文章