使用client-go观察CustomResourceDefinitions(CRD)

时间:2018-04-21 08:48:59

标签: go kubernetes

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

这适用于简单的Rest Client,如下例所示。

但我想用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

1 个答案:

答案 0 :(得分:7)

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

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

如何?!

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

以下是blog post about code generation STEFAN SCHIMANSKI(他是kubernetes的主要贡献者之一)。

示例控制器

以下是kubernetes本身给出的sample-controller示例。 pkg文件夹包含所有APISClientmain.gocontroller.go包含要监视CRD的示例代码,并相应地执行某项任务。