go - 使用 client-go 观看 CustomResourceDefinitions (CRD)

标签 go kubernetes

我已经向 Kubernetes 添加了一个新的 CRD ApiGateway,我想监视它的新资源/更改资源。

这与一个简单的 Rest Client 一起工作,如下例所示。

但我想使用 k8s.io/client-go/kubernetes 来关注这些资源。

虽然像下面的 client-go 示例中那样获取标准资源很简单,但我没有得到任何适用于 CRD 的东西。 是否有可能通过 client-go 来完成?

标准资源的客户端示例

import (
    ....
    "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func handleNewServices(clientset *kubernetes.Clientset) {
    for {
        serviceStreamWatcher, err := clientset.CoreV1().Services("").Watch(metav1.ListOptions{})
        if err != nil {
            panic(err.Error())
        }
        //fmt.Printf("%T\n", serviceStreamWatcher)
        for {
            select {
            case event := <-serviceStreamWatcher.ResultChan():
            service := event.Object.(*v1.Service)

            for key, value := range service.Labels {
                fmt.Printf("Key, VAlue: %s %s\n", key, value)
            }
...

RestClient(工作正常)

package main

import (
    "net/http"
    ....

)

func main() {
    for {
        // Url "cw.com" must match the config spec.group in api-gateway-crd.yaml
        // URL "apigateways" must match the config spec.names.plural in api-gateway-crd.yaml
        resp, err := http.Get("http://localhost:8001/apis/cw.com/v1/apigateways?watch=true")
        if err != nil {
            panic(err)
        }
        defer resp.Body.Close()
        decoder := json.NewDecoder(resp.Body)
        for {
            var event v1.ApiGatewayWatchEvent
            if err := decoder.Decode(&event); err == io.EOF {
                break
            } else if err != nil {
                log.Fatal(err)
            }
            log.Printf("Received watch event: %s: %s: \n", event.Type, event.Object.Metadata.Name)

        }
    }

}

CRD

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: apigateways.cw.com
spec:
  scope: Namespaced
  group: cw.com
  version: v1
  names:
    kind: ApiGateway
    singular: apigateway
    plural: apigateways

最佳答案

如果你仔细想想,client-go知道 deployments , services , pods等资源。但它无法识别您的 CRD ApiGateway .

所以,client-go不能用作您定制资源的客户端(等待),除非您使它们可识别为 client-go !

怎么办?!

您必须为 CRD 生成自己的客户端。 Kubernetes 已经有了自动生成客户端的工具,你只需要指定 structsAPI .这被称为 code-generation .

这是一个blog post about code generation通过 STEFAN SCHIMANSKI (谁是 kubernetes 的主要贡献者之一)。

示例 Controller

这是一个sample-controller kubernetes本身给出的例子。 pkg文件夹包含所有 APISClient . main.gocontroller.go包含监视 CRD 并相应地执行一些任务的示例代码。

!!更新!!

现在使用由 kubernetes-sigs 维护的 kubebuilder ( github repo) 生成客户端配置和 Controller 变得更加容易。

关于go - 使用 client-go 观看 CustomResourceDefinitions (CRD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49953980/

相关文章:

mysql - 我需要一些帮助来获得正确的连接字符串以将 Golang 连接到 AWS RDS

go - 为什么结构上的 & 运算符不返回数字地址?

go - Redigo:如何使用 Golang 从 Redis 获取键值映射?

api - 如何发现 []byte 是数组还是单个对象

kubernetes集群主节点未准备好

unit-testing - 单元测试 golang 处理程序

kubernetes - 在容器完成启动码头服务器之前准备好 pod

kubernetes - 如何使用模板生成器生成 kubernetes yaml 文件?

kubernetes - 卷 "rook-ceph-crash-collector-keyring": secret "rook-ceph-crash-collector-keyring" not found 的 MountVolume.SetUp 失败

mysql - 无法在 kubernetes 数据库中添加 .sql 文件