我需要我的 Go 应用程序来监控Kubernetes 集群中的一些资源并对它们的变化做出反应。基于大量的文章和例子,我似乎找到了一些方法;然而,我对 Kubernetes 比较陌生,而且它们的描述对我来说太复杂了,以至于我仍然无法理解它们之间的区别——因此,知道使用哪个,所以我不要出现一些意外的行为......具体来说:
watch.Interface.ResultChan()- (通过收购如rest.Request.Watch()) -这似乎已经让我对变化做出反应发生在一个资源,通过提供Added/ Modified/Deleted事件;cache.NewInformer()— 当我实现 a 时cache.ResourceEventHandler,我可以将它作为最后一个参数传递:
cache.NewInformer(
cache.NewListWatchFromClient(clientset.Batch().RESTClient(), "jobs", ...),
&batchv1.Job{},
0,
myHandler)
Run Code Online (Sandbox Code Playgroud)
-那么,该myHandler对象将接收OnAdd()/ OnUpdate()/OnDelete()电话。
对我来说,这似乎或多或少相当于ResultChan我在上面的 (1.) 中得到的;一个区别是,显然现在我得到了资源的“之前”状态作为奖励,而ResultChan我只会得到它的“之后”状态。
此外,IIUC,这实际上是以某种方式建立在watch.Interface上面提到的(通过NewListWatchFromClient)的基础上——所以我想它带来了一些价值,和/或修复了原始watch.Interface?
cache.NewSharedInformer()并且cache.NewSharedIndexInformer()—— (呃,哇,现在这些都是一口……)我试图挖掘 godocs,但我觉得我不懂的术语完全超负荷,以至于我似乎无法掌握微妙之处(?)“常规”之间的差异NewInformer与NewSharedInformer对NewSharedIndexInformer...有人可以帮助我理解 …
我正在编写一个脚本,该脚本使用k8s.io/client-go库(此处为godocs)来操作部署。特别是,我想为集群中的每个部署添加一个标签选择器。部署标签选择器是不可变的。所以我的做法是:
我不能只使用 client-go 库按顺序执行步骤 1-4,因为我只想在 API 服务器认为上一步完成时进入下一步。例如,我不想执行第 3 步,直到 API 服务器说原始部署已被删除。否则,我将收到具有相同名称的 Deployment 已存在的错误。
使用 client-go 库检测何时创建和删除部署并附加回调函数的最佳方法是什么?我遇到了以下软件包。
但我不确定它们之间有什么区别以及使用哪一个。
我在这里阅读了watch和Informer 的例子。这是两个 相关的SO 问题。
似乎watch提供了一种较低级别的方法来监视资源的更改并接收有关更改的事件。似乎使用SharedInformerFactory创建 SharedInformer 是要走的路。
到目前为止我有
import (
"encoding/json"
"errors"
"flag"
"fmt"
"io/ioutil"
"k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
typedv1 "k8s.io/client-go/kubernetes/typed/apps/v1"
"k8s.io/client-go/tools/cache"
"path/filepath"
"strings"
// We need this import to load the …Run Code Online (Sandbox Code Playgroud) 我已经ApiGateway向Kubernetes 添加了一个新的CRD ,我想要关注它的新资源/更改资源.
这适用于简单的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)
}
...
Run Code Online (Sandbox Code Playgroud)
RestClient(工作正常)
package main
import (
"net/http"
....
)
func main() …Run Code Online (Sandbox Code Playgroud) 如果我正在实现我的 Kubernetes CRD,那么实现自定义终结器似乎很容易:代码片段非常简单,因为对象上的第一个删除请求为该字段设置了一个值,而不是删除触发自定义控制器监视对象的对象执行它处理的任何终结器。metadata.deletionTimestamp
但是,让我们想象一下,我想为默认的 Kubernetes 资源(如命名空间、部署或其他任何资源)设置自定义终结器:这可能吗?