标签: kubebuilder

如何为任意对象触发 Kubernetes 控制器协调器?

概述

我正在为 VerticalScaler CRD 编写一个 Kubernetes 控制器,它可以垂直扩展集群中的 Deployment。我的规范引用了集群中现有的 Deployment 对象。如果引用的部署被修改或删除,我想将 VerticalScaler 的协调请求排入队列。

// VerticalScalerSpec defines the desired state of VerticalScaler.
type VerticalScalerSpec struct {
    // Name of the Deployment object which will be auto-scaled.
    DeploymentName string `json:"deploymentName"`
}
Run Code Online (Sandbox Code Playgroud)

问题

当资源不属于控制器并且该资源不持有对其资源由控制器管理的对象的引用时,是否有一种好方法来监视该资源?

我发现了什么

我认为这应该在控制器的 Kubebuilder 标准SetupWithManager函数中进行配置,尽管手表可能可以在其他地方设置。

// SetupWithManager sets up the controller with the Manager.
func (r *VerticalScalerReconciler) SetupWithManager(mgr ctrl.Manager) error {
    return ctrl.NewControllerManagedBy(mgr).
        For(&v1beta1.VerticalScaler{}).
        Complete(r)
}
Run Code Online (Sandbox Code Playgroud)

我一直在controller-runtime/pkg/builder和 Kubebuilder 文档中寻找一种好的方法。我发现的最接近的例子是关于手表的 kubebuilder-v1 文档中的“观看任意资源”部分:

控制器可以监视任意资源并将它们映射到控制器管理的资源的键。控制器甚至可以将一个事件映射到多个键,从而触发每个键的协调。

示例:为了响应集群扩展事件(例如节点的删除或添加),控制器将监视节点并将监视事件映射到控制器管理的对象的键。

我的挑战是如何将部署映射到依赖的 VerticalScaler,因为部署上不存在此信息。我可以在 VerticalScaler …

kubernetes kubebuilder kubernetes-operator

9
推荐指数
2
解决办法
1万
查看次数

获取触发 kubebuilder 中控制器的事件类型

我刚刚开始使用 kubebuilder 和 Golang 使用自定义资源扩展我们的 Kubernetes 集群。我很想根据实际调用它的事件在协调器功能中做不同的事情。

资源创建了吗?更新了吗?被删了吗?

这些事件中的每一个都会触发控制器,但是,我似乎无法找到查看哪些事件实际发生的可能性。我可以通过编写这样的协调器来解决这个问题:

func (r *ServiceDescriptorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    service := &batchv1.ServiceDescriptor{}
    if err := r.Get(context.TODO(), req.NamespacedName, service); err != nil && errors.IsNotFound(err) {
        fmt.Println("Resource was not found -> must have been deleted")
    else {
        fmt.Println("No errors found -> Resource must have been created or updated")
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这感觉奇怪地含蓄而且有点老套。

是否有一种干净的(可能是本机的)方法来获取协调器调用的事件类型?

go kubernetes kubernetes-custom-resources kubebuilder

7
推荐指数
1
解决办法
2019
查看次数

kubebuilder create webhook 需要之前创建的 API

我正在尝试创建一个验证网络钩子

kubebuilder create webhook batch \
            --version v1 \
            --kind Webhook \
            --defaulting \
            --programmatic-validation
Run Code Online (Sandbox Code Playgroud)

但它总是给我一个错误。

failed to create webhook: unable to inject the resource to. 
"base.go.kubebuilder.io/v3": kubebuilder create webhook requires. 
a previously created API
Run Code Online (Sandbox Code Playgroud)

我不确定在 kubebuilder 命令中添加额外的内容。任何帮助表示赞赏。

go kubernetes kubebuilder

7
推荐指数
1
解决办法
2724
查看次数

K8s Operator 使用事件过滤器监听秘密更改

几个月前我们创建了一个控制器,它使用 kubebuilder 运行得很好。

\n

几周前,我们将 \xe2\x80\x9clistener\xe2\x80\x9d 添加到秘密中,当秘密更改时(秘密属性)\n应该调用协调,问题是它有时有效有时无效, (您更改秘密应用它并且协调不会发生\xe2\x80\x99t),我们正在为完全相同的秘密文件执行此操作

\n

我们尝试了几天来找到根本原因,但没有成功,(我们将k8s.io/client-go v0.23.4和 更改为v0.22.3,现在 v0.22.1这才起作用。\n知道问题可能是什么吗?任何提示都会有帮助。或者我们有任何其他方法可以做到这一点可以尝试一下。

\n
func (r *vtsReconciler) SetupWithManager(mgr ctrl.Manager) error {\n    manager := ctrl.NewControllerManagedBy(mgr).\n        For(&vts.str).\n        WithEventFilter(predicate.Or(predicate.AnnotationChangedPredicate{}))\n    manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {\n        return r.SecretRequests.SecretFinder(a.GetName())\n    }))\n    return manager.Complete(r)\n}\n\n\n\nfunc (secm *SecretMapper) SecretFinder(name string) []reconcile.Request {\n    v := cli.ObjectKey{Name: name}\n    return secm.SecMap[v.String()]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

go kubernetes kubernetes-secrets kubebuilder

6
推荐指数
1
解决办法
1854
查看次数

监视特定对象的事件

我们有一个 k8s 运算符(基于 kubebuilder),它按预期工作,现在我们需要支持侦听集群上的机密。

以下代码正在运行,但是我收到了集群中所有秘密的事件,但效率不高

我只想获取特定秘密的事件,让我们说特定秘密的事件labels/annotation,我们该怎么做?

func (r *InvReconciler) SetupWithManager(mgr ctrl.Manager) error {
    manager := ctrl.NewControllerManagedBy(mgr).
        For(&corev1alpha1.Inv{}, builder.WithPredicates(predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{}))).
        WithOptions(controller.Options{
        })

    manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {
        return r.secretHandler.GetSecret(a.GetNamespace(), a.GetName())
    }))

    return manager.Complete(r)
}
Run Code Online (Sandbox Code Playgroud)

这是函数

func (secretReq secretHandler) GetSecret(namespace string, name string) []reconcile.Request {

    fmt.Println("secret is: ", namespace, "--", name)
    return nil
}
Run Code Online (Sandbox Code Playgroud)

让我们说像下面这样的秘密,并且仅对于这个秘密(带标签foo: bar)我会在创建或修改它时收到事件

apiVersion: v1
kind: Secret
metadata:
  labels:
    foo: bar
  name: mysecret
  namespace: dev
type: Opaque
data: …
Run Code Online (Sandbox Code Playgroud)

azure go kubernetes kubebuilder

6
推荐指数
1
解决办法
1933
查看次数

为什么准入 webhook 在 kubebuilder 书中的 CronJob 示例中不起作用

我正在关注 KubeBuilder 书中的 CronJob 示例:https ://book.kubebuilder.io/cronjob-tutorial/cronjob-tutorial.html

我直接使用https://github.com/kubernetes-sigs/kubebuilder/tree/master/docs/book/src/cronjob-tutorial/testdata/project 中的代码

运行后make run,显示如下日志:

INFO    controller-runtime.metrics  metrics server is starting to listen    {"addr": ":8080"}
INFO    controller-runtime.builder  Registering a mutating webhook  {"GVK": "batch.tutorial.kubebuilder.io/v1, Kind=CronJob", "path": "/ilder-io-v1-cronjob"}
INFO    controller-runtime.webhook  registering webhook {"path": "/mutate-batch-tutorial-kubebuilder-io-v1-cronjob"}
INFO    controller-runtime.builder  Registering a validating webhook    {"GVK": "batch.tutorial.kubebuilder.io/v1, Kind=CronJob", "path": "/builder-io-v1-cronjob"}
INFO    controller-runtime.webhook  registering webhook {"path": "/validate-batch-tutorial-kubebuilder-io-v1-cronjob"}
INFO    setup   starting manager
INFO    controller-runtime.manager  starting metrics server {"path": "/metrics"}
INFO    controller-runtime.webhook.webhooks starting webhook server
INFO    controller-runtime.controller   Starting EventSource    {"controller": …
Run Code Online (Sandbox Code Playgroud)

webhooks kubernetes kubebuilder

5
推荐指数
1
解决办法
467
查看次数

如何为 Enum 类型分配默认值

从这段 Go 代码中,我生成了 CRD yaml。我在 Go 中使用以下结构。我想从枚举选项之一为参数“Size”和“Case”分配默认值。分配 // +kubebuilder:validation:default:=512 在生成的 yaml 文件中不会生效。在 kubebuilder 中有什么方法可以为枚举分配默认值吗?

type Options struct {
    // +kubebuilder:validation:default:=512
    // +kubebuilder:validation:Enum=64;128;256;512
    Size int64 `json:"Size"`
    
    // +kubebuilder:validation:Enum=caseA;caseB
    // +kubebuilder:validation:default:=caseA
    Case string `json:"case"`
}   



Generated yaml without default value
---------------
 case:
     enum:
      - caseA
      - caseB
     type: string

 Size:
     enum:
      - 64
      - 128
      - 256
      -512
     format: int64
     type: integer
Run Code Online (Sandbox Code Playgroud)

go kubebuilder

5
推荐指数
1
解决办法
4325
查看次数

kubebuilder 在本地调试 web-hooks

我们有一个 kubebuilder 控制器,它按预期工作,现在我们需要创建一个 webhooks ,

我按照教程 https://book.kubebuilder.io/reference/markers/webhook.html进行 操作,现在我想在本地运行和调试它,但是不确定如何处理证书,是否有一种简单的方法来创建它,任何例子都会非常有帮助。

顺便说一句,我已经安装了cert-manager并应用了以下示例 yaml,但不知道下一步该做什么...

我需要最简单的解决方案,我能够在本地webhook运行和调试s ,就像我已经使用控制器所做的那样(在使用 webhooks 之前),

https://book.kubebuilder.io/cronjob-tutorial/running.html

证书管理器

我在集群中创建了以下内容

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com
  namespace: test
spec:
  # Secret names are always required.
  secretName: example-com-tls

  # secretTemplate is optional. If set, these annotations and labels will be
  # copied to the Secret named example-com-tls. These labels and annotations will
  # be re-reconciled if the Certificate's secretTemplate changes. secretTemplate
  # is also enforced, …
Run Code Online (Sandbox Code Playgroud)

certificate go google-cloud-platform kubernetes kubebuilder

5
推荐指数
1
解决办法
710
查看次数

如何在 kubebuilder 中监视外部自定义资源更改而不导入外部类型

假设我有以下代码片段,它设置了一个监视外部资源“外部”的协调器:

// SetupWithManager sets up the controller with the Manager.
func (r *SomethingReconciler) SetupWithManager(mgr ctrl.Manager) error {
    return ctrl.NewControllerManagedBy(mgr).
        For(&api.Something{}).
        WithOptions(controller.Options{
            MaxConcurrentReconciles: stdruntime.NumCPU(),
            RecoverPanic:            true,
        }).
        Watches(
            &source.Kind{Type: &somev1.External{}},
            handler.EnqueueRequestsFromMapFunc(r.findInternalObjectsForExternal),
            builder.WithPredicates(predicate.Funcs{
                UpdateFunc: func(ue event.UpdateEvent) bool { return true },
                DeleteFunc: func(de event.DeleteEvent) bool { return true },
            }),
        ).
        Complete(r)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法将somev1.External类型导入到我的项目中,因为导入包含此类型的 go 模块会破坏我当前项目的依赖关系。
kubebuilder 中有没有一种方法可以监视外部资源,而无需显式导入其类型?比如GVK之类的?

go kubernetes kubebuilder

4
推荐指数
1
解决办法
836
查看次数

如何使用自定义资源的分数格式(即 X/Y)显示 kubectl 列

在 Kubernetes 中,是否可以使用 CRD 的“additionalPrinterColumns”字段以分数格式(即 X/Y)显示列?

更准确地说,我想kubectl使用与下面的 READY 字段相同的格式显示 CR 字段的描述:

kubectl get statefulsets.apps <my-statefulset>
NAME              READY   AGE
<my-statefulset>  2/2     18m
Run Code Online (Sandbox Code Playgroud)

您能否提供“additionalPrinterColumns”部分的内容?

kubernetes kubernetes-custom-resources kubebuilder operator-sdk

3
推荐指数
1
解决办法
1671
查看次数

Rbac 使用 Kubebuilder 进行规则

我的问题是我正在尝试使用该unstructured.Unstructured类型来创建部署,如下所示:

// +kubebuilder:rbac:groups=stable.resource.operator.io,resources=resource,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=stable.resource.operator.io,resources=resource/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=apps,resources=deployments/status,verbs=get;list;watch;create;update;patch;delete
func (r *ResourceReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {

    ctx := context.Background()
    log := r.Log.WithValues("resource", req.NamespacedName)
    instance := &stablev1.Resource{}
    // your logic here

    if err := r.Get(ctx, req.NamespacedName, instance); err != nil {
        log.Error(err, "unable to fetch Resource")
        // we'll ignore not-found errors, since they can't be fixed by an immediate
        // requeue (we'll need to wait for a new notification), and we can get them
        // on deleted requests. …
Run Code Online (Sandbox Code Playgroud)

go kubernetes kubebuilder

2
推荐指数
1
解决办法
925
查看次数

使用 Kubebuilder 生成控制器 Gen

我正在尝试在 Kubebuilder 中构建我的自定义资源项目,但每当我构建它时,我似乎都缺少我的控制器生成。我不断收到错误:

/Users/*****/Kubernetes/postgres-writer-operator/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
bash: /Users/****/Kubernetes/postgres-writer-operator/bin/controller-gen: No such file or directory
make: *** [generate] Error 127
Error: failed to create API: unable to run post-scaffold tasks of "base.go.kubebuilder.io/v3": exit status 2
Usage:
  kubebuilder create api [flags]
Run Code Online (Sandbox Code Playgroud)

我是 Kubernetes 新手,正在遵循以下教程: https://yash-kukreja-98.medium.com/develop-on-kubernetes-series-operator-dev-understanding-and-dissecting-kubebuilder-4321d3ecd7d6

首先,我运行以下命令来引导我的项目:

kubebuilder init \
--domain yash.com \
--repo github.com/yashvardhan-kukreja/postgres-writer-operator \
--project-name postgres-writer-operator \
--license apache2 \
--skip-go-version-check
Run Code Online (Sandbox Code Playgroud)

运行命令后,我进入目录并找到以下文件和文件夹: 在此输入图像描述

然后下一步是为我的自定义资源 PostgresWriter 运行引导程序并将其附加到运算符。

kubebuilder create api \
--group demo \
--version v1 \
--kind PostgresWriter \
--resource true \
--controller …
Run Code Online (Sandbox Code Playgroud)

containers kubernetes kubebuilder kubernetes-operator

1
推荐指数
1
解决办法
5818
查看次数