我已经向 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 已经有了自动生成客户端的工具,你只需要指定 structs
的 API
.这被称为 code-generation
.
这是一个blog post about code generation通过 STEFAN SCHIMANSKI (谁是 kubernetes 的主要贡献者之一)。
示例 Controller
这是一个sample-controller kubernetes本身给出的例子。 pkg
文件夹包含所有 APIS
和 Client
. main.go
和 controller.go
包含监视 CRD 并相应地执行一些任务的示例代码。
!!更新!!
现在使用由 kubernetes-sigs 维护的 kubebuilder ( github repo) 生成客户端配置和 Controller 变得更加容易。
关于go - 使用 client-go 观看 CustomResourceDefinitions (CRD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49953980/