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

我为我的应用程序创建了一个操作员,并想为它创建一个服务监视器。创建了 Prometheus 运算符。在我的 k8s 集群中导入了监控 Prometheus 库并创建了服务监控 CRD。这是这个对象的 Go 代码:


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/v1",

        },


慕雪6442864
浏览 115回答 2
2回答

噜噜哒

在您的 中main.go,您需要添加monitoring/v1到scheme注入的controller-runtimeie 中:// main.gopackage mainimport (    "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)    }}

鸿蒙传说

看起来 crd ServiceMonitor 是monitoring.coreos.com而不是 monitoring.coreos.com/v1 的一部分,所以它应该足以在代码中更改它 (APIVersion):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",        },        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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go