使用 client-go 观看 CustomResourceDefinitions (CRD)

2024-02-14

我添加了一个新的 CRDApiGateway到 Kubernetes,我想监视它的新的/更改的资源。

这适用于简单的 Rest 客户端,如下例所示。

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

虽然获取标准资源(如下面的 client-go 示例所示)很简单,但我没有得到任何适用于 CRD 的东西。 可以用 client-go 来完成吗?

标准资源的 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等资源。但它无法识别您的 CRDApiGateway.

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

How?!

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

这里有一个关于代码生成的博客文章 https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/ by 斯特凡·希曼斯基 https://github.com/sttts(他是 kubernetes 的主要贡献者之一)。

控制器示例

这里有一个样品控制器 https://github.com/kubernetes/sample-controllerkubernetes 本身给出的例子。这pkg文件夹包含所有APIS and Client. The main.go and controller.go包含用于监视 CRD 并相应执行某些任务的示例代码。

!!更新!!

现在可以更轻松地使用 kubebuilder 生成客户端配置和控制器(github 仓库 https://github.com/kubernetes-sigs/kubebuilder),由 kubernetes-sigs 维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 client-go 观看 CustomResourceDefinitions (CRD) 的相关文章

随机推荐