为了账号安全,请及时绑定邮箱和手机立即绑定

“错误”:“方案中没有为类型 v1.ServiceMonitor 注册类型 \”

“错误”:“方案中没有为类型 v1.ServiceMonitor 注册类型 \”

Go
慕雪6442864 2023-02-28 20:27:58
我为我的应用程序创建了一个操作员,并想为它创建一个服务监视器。创建了 Prometheus 运算符。在我的 k8s 集群中导入了监控 Prometheus 库并创建了服务监控 CRD。这是这个对象的 Go 代码:package controllersimport (    "context"    "fmt"    appsv1alpha1 "k8s-operator/api/v1alpha1"    monitoring "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"    "gopkg.in/yaml.v2"    "k8s.io/apimachinery/pkg/api/errors"    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"    "k8s.io/apimachinery/pkg/types"    "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"    "sigs.k8s.io/controller-runtime/pkg/reconcile")// ensureSvcMonitor ensures SvcMonitor is Running in a namespace.func (r *MyappReconciler) ensureSvcMonitor(request reconcile.Request,    instance *appsv1alpha1.Myapp,    svcmonitor *monitoring.ServiceMonitor,) (*reconcile.Result, error) {    // See if SvcMonitor already exists and create if it doesn't    found := &monitoring.ServiceMonitor{}    err := r.Get(context.TODO(), types.NamespacedName{        Name:      svcmonitor.Name,        Namespace: instance.Namespace,    }, found)    if err != nil && errors.IsNotFound(err) {        // Create the SvcMonitor        err = r.Create(context.TODO(), svcmonitor)        if err != nil {            // SvcMonitor creation failed            return &reconcile.Result{}, err        } else {            // SvcMonitor creation was successful            return nil, nil        }    } else if err != nil {        // Error that isn't due to the SvcMonitor not existing        return &reconcile.Result{}, err    }    return nil, nil}// backendSvcMonitor is a code for creating a SvcMonitorfunc (r *MyappReconciler) backendSvcMonitor(v *appsv1alpha1.Myapp) *monitoring.ServiceMonitor {    svcmonitor := &monitoring.ServiceMonitor{        TypeMeta: metav1.TypeMeta{            Kind:       "ServiceMonitor",            APIVersion: "monitoring.coreos.com/v1",        },
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

在您的 中main.go,您需要添加monitoring/v1到scheme注入的controller-runtimeie 中:


// main.go

package main


import (

    "os"

    ctrl "sigs.k8s.io/controller-runtime"

    monitoring "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"

    "k8s.io/apimachinery/pkg/runtime"

)


var (

    scheme = runtime.NewScheme()

)


func init() {

    monitoring.AddToScheme(scheme)

}


func main() {

    mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{

        Scheme: scheme,

        // ... other options here

    })


    // Start Manager

    if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {

        os.Exit(1)

    }

}


查看完整回答
反对 回复 2023-02-28
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

看起来 crd ServiceMonitor 是monitoring.coreos.com而不是 monitoring.coreos.com/v1 的一部分,所以它应该足以在代码中更改它 (APIVersion):


package controllers


import (

    "context"

    "fmt"


    appsv1alpha1 "k8s-operator/api/v1alpha1"


    monitoring "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"

    "gopkg.in/yaml.v2"

    "k8s.io/apimachinery/pkg/api/errors"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

    "k8s.io/apimachinery/pkg/types"

    "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

    "sigs.k8s.io/controller-runtime/pkg/reconcile"

)


// ensureSvcMonitor ensures SvcMonitor is Running in a namespace.

func (r *MyappReconciler) ensureSvcMonitor(request reconcile.Request,

    instance *appsv1alpha1.Myapp,

    svcmonitor *monitoring.ServiceMonitor,

) (*reconcile.Result, error) {


    // See if SvcMonitor already exists and create if it doesn't

    found := &monitoring.ServiceMonitor{}

    err := r.Get(context.TODO(), types.NamespacedName{

        Name:      svcmonitor.Name,

        Namespace: instance.Namespace,

    }, found)

    if err != nil && errors.IsNotFound(err) {


        // Create the SvcMonitor

        err = r.Create(context.TODO(), svcmonitor)


        if err != nil {

            // SvcMonitor creation failed

            return &reconcile.Result{}, err

        } else {

            // SvcMonitor creation was successful

            return nil, nil

        }

    } else if err != nil {

        // Error that isn't due to the SvcMonitor not existing

        return &reconcile.Result{}, err

    }


    return nil, nil

}


// backendSvcMonitor is a code for creating a SvcMonitor

func (r *MyappReconciler) backendSvcMonitor(v *appsv1alpha1.Myapp) *monitoring.ServiceMonitor {


    svcmonitor := &monitoring.ServiceMonitor{

        TypeMeta: metav1.TypeMeta{

            Kind:       "ServiceMonitor",

            APIVersion: "monitoring.coreos.com",

        },

        ObjectMeta: metav1.ObjectMeta{

            Name:      v.Spec.Name + "-svcmonitor",

            Namespace: v.Namespace},

        Spec: monitoring.ServiceMonitorSpec{

            Endpoints: []monitoring.Endpoint{{

                Port: v.Spec.Name,

            }},

            Selector: metav1.LabelSelector{

                MatchLabels: labels(v),

            },

        },

    }


    controllerutil.SetControllerReference(v, svcmonitor, r.Scheme)

    yamlData, _ := yaml.Marshal(&svcmonitor)

    fmt.Println(string(yamlData))

    return svcmonitor

}


查看完整回答
反对 回复 2023-02-28
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信