【问题标题】:Watch CustomResourceDefinitions (CRD) with client-go使用 client-go 观看 CustomResourceDefinitions (CRD)
【发布时间】:2018-10-01 21:35:06
【问题描述】:

我向 Kubernetes 添加了一个新的 CRD ApiGateway,我想关注它的新资源/更改资源。

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

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

虽然像下面的客户端示例那样获取标准资源很简单,但我没有得到任何适用于 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

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:

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

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

    怎么样?!

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

    这是STEFAN SCHIMANSKIblog post about code generation(他是 kubernetes 的主要贡献者之一)。

    示例控制器

    这是 kubernetes 自己给出的sample-controller 示例。 pkg 文件夹包含所有 APISClientmain.gocontroller.go 包含用于监视 CRD 并相应执行某些任务的示例代码。

    !!更新!!

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

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2019-03-05
      • 2019-02-12
      • 2018-01-19
      • 2018-11-03
      • 2021-12-07
      相关资源
      最近更新 更多