From 7b63ab847ab7050c4ae9db76f557619aef3795ef Mon Sep 17 00:00:00 2001 From: MohammedAbdi Date: Tue, 21 May 2024 12:45:31 -0400 Subject: [PATCH 1/2] remove bundle Signed-off-by: MohammedAbdi --- ...c.authorization.k8s.io_v1_clusterrole.yaml | 17 - ...nitoring.coreos.com_v1_servicemonitor.yaml | 18 - ...er-manager-metrics-service_v1_service.yaml | 23 -- .../susql-operator.clusterserviceversion.yaml | 313 ------------------ .../manifests/susql.ibm.com_labelgroups.yaml | 87 ----- bundle/metadata/annotations.yaml | 14 - bundle/tests/scorecard/config.yaml | 70 ---- 7 files changed, 542 deletions(-) delete mode 100644 bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml delete mode 100644 bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml delete mode 100644 bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml delete mode 100644 bundle/manifests/susql-operator.clusterserviceversion.yaml delete mode 100644 bundle/manifests/susql.ibm.com_labelgroups.yaml delete mode 100644 bundle/metadata/annotations.yaml delete mode 100644 bundle/tests/scorecard/config.yaml diff --git a/bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml deleted file mode 100644 index 3f9deff..0000000 --- a/bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - app.kubernetes.io/component: kube-rbac-proxy - app.kubernetes.io/created-by: susql-operator - app.kubernetes.io/instance: metrics-reader - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/name: clusterrole - app.kubernetes.io/part-of: susql-operator - name: susql-operator-metrics-reader -rules: -- nonResourceURLs: - - /metrics - verbs: - - get diff --git a/bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml b/bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml deleted file mode 100644 index 7e18273..0000000 --- a/bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: - app.kubernetes.io/component: metrics - app.kubernetes.io/created-by: susql-operator - app.kubernetes.io/instance: susql-controller-manager-metrics-monitor - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/name: servicemonitor - app.kubernetes.io/part-of: susql-operator - control-plane: susql-controller-manager - name: susql-operator-susql-controller-manager-metrics-monitor -spec: - endpoints: - - port: metrics - selector: - matchLabels: - control-plane: susql-controller-manager diff --git a/bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml b/bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml deleted file mode 100644 index 67c24f8..0000000 --- a/bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - creationTimestamp: null - labels: - app.kubernetes.io/component: kube-rbac-proxy - app.kubernetes.io/created-by: susql-operator - app.kubernetes.io/instance: susql-controller-manager-metrics-service - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/name: service - app.kubernetes.io/part-of: susql-operator - control-plane: susql-controller-manager - name: susql-operator-susql-controller-manager-metrics-service -spec: - ports: - - name: metrics - port: 8082 - protocol: TCP - targetPort: metrics - selector: - control-plane: susql-controller-manager -status: - loadBalancer: {} diff --git a/bundle/manifests/susql-operator.clusterserviceversion.yaml b/bundle/manifests/susql-operator.clusterserviceversion.yaml deleted file mode 100644 index f0c9fa8..0000000 --- a/bundle/manifests/susql-operator.clusterserviceversion.yaml +++ /dev/null @@ -1,313 +0,0 @@ -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: - annotations: - alm-examples: |- - [ - { - "apiVersion": "susql.ibm.com/v1", - "kind": "LabelGroup", - "metadata": { - "labels": { - "app.kubernetes.io/created-by": "susql-operator", - "app.kubernetes.io/instance": "labelgroup-sample", - "app.kubernetes.io/managed-by": "kustomize", - "app.kubernetes.io/name": "labelgroup", - "app.kubernetes.io/part-of": "susql-operator" - }, - "name": "labelgroup-sample" - }, - "spec": null - } - ] - capabilities: Basic Install - categories: Monitoring - containerImage: quay.io/sustainable_computing_io/susql_operator:0.0.15 - createdAt: "2024-05-21T14:53:53Z" - description: 'Aggregates energy data from pods tagged with SusQL labels ' - operators.operatorframework.io/builder: operator-sdk-v1.34.1 - operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 - repository: https://github.com/sustainable-computing-io/susql-operator - support: https://github.com/sustainable-computing-io/susql-operator/issues - name: susql-operator.v0.0.15 - namespace: placeholder -spec: - apiservicedefinitions: {} - customresourcedefinitions: - owned: - - description: LabelGroup is the Schema for the labelgroups API - displayName: Label Group - kind: LabelGroup - name: labelgroups.susql.ibm.com - version: v1 - description: |- - ### About this Operator - - SusQL is a Kubernetes operator that aggregates energy data from pods - tagged with SusQL specific labels. The energy measurements are taken - from Kepler which should be deployed in the cluster before - using SusQL. - - ### Prerequisites - - 1. Deployment of Kepler on the cluster - 2. Ensure that [User Project Monitoring](https://docs.openshift.com/container-platform/latest/monitoring/enabling-monitoring-for-user-defined-projects.html) - is enabled to monitor energy consumed in user projects. - - ### API Backward Compatibility - - Until Operator supports **seamless upgrades**, a new version of the operator may - introduce a change that is **NOT** backwards compatible with the previous version. - Thus, to upgrade the operator, uninstall the already installed version completely - (including CRDs) and install the new version. For example to upgrade from 0.1.0 - to 0.2.0, you must first uninstall 0.1.0. - - ### LabelGroup spec Example - - ``` - apiVersion: susql.ibm.com/v1 - kind: LabelGroup - metadata: - name: labelgroup-name - namespace: susql-operator - spec: - labels: - - my-label-1 - - my-label-2 - ``` - - ### Documentation - - Documentation can be found at [SusQL Operator](https://github.com/sustainable-computing-io/susql-operator#readme). - - ### Getting help - - If you encounter any issues while using the SusQL Operator, you can create an - [issue](https://github.com/sustainable-computing-io/susql-operator/issues) - on our GitHub repo for bugs, enhancements, or other requests. - - ### Contributing - You can contribute by raising [issues](https://github.com/sustainable-computing-io/susql-operator/issues) - related to susql-operator. - - ### License - susql-operator is licensed under the Apache 2.0 license - displayName: SusQL - icon: - - base64data: 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 - mediatype: image/png - install: - spec: - clusterPermissions: - - rules: - - apiGroups: - - susql.ibm.com - resources: - - labelgroups - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - susql.ibm.com - resources: - - labelgroups/finalizers - verbs: - - update - - apiGroups: - - susql.ibm.com - resources: - - labelgroups/status - verbs: - - get - - patch - - update - - apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create - - apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create - - apiGroups: - - "" - resources: - - pods - - pods/status - verbs: - - get - - list - - watch - serviceAccountName: susql-operator-susql-controller-manager - deployments: - - label: - app.kubernetes.io/component: manager - app.kubernetes.io/created-by: susql-operator - app.kubernetes.io/instance: susql-controller-manager - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/name: deployment - app.kubernetes.io/part-of: susql-operator - name: susql-operator-susql-controller-manager - spec: - replicas: 1 - selector: - matchLabels: - control-plane: susql-controller-manager - strategy: {} - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - control-plane: susql-controller-manager - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/arch - operator: In - values: - - amd64 - - arm64 - - ppc64le - - s390x - - key: kubernetes.io/os - operator: In - values: - - linux - containers: - - args: - - --leader-elect - - --kepler-prometheus-url=$(KEPLER-PROMETHEUS-URL) - - --kepler-metric-name=$(KEPLER-METRIC-NAME) - - --susql-prometheus-database-url=$(SUSQL-PROMETHEUS-DATABASE-URL) - - --susql-prometheus-metrics-url=$(SUSQL-PROMETHEUS-METRICS-URL) - - --sampling-rate=$(SAMPLING-RATE) - - --health-probe-bind-address=:8081 - - --metrics-bind-address=127.0.0.1:8082 - command: - - /manager - env: - - name: KEPLER-PROMETHEUS-URL - value: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 - - name: KEPLER-METRIC-NAME - value: kepler_container_joules_total - - name: SUSQL-PROMETHEUS-DATABASE-URL - value: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 - - name: SUSQL-PROMETHEUS-METRICS-URL - value: http://0.0.0.0:8082 - - name: SAMPLING-RATE - value: "2" - image: quay.io/sustainable_computing_io/susql_operator:0.0.15 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 20 - periodSeconds: 20 - name: manager - ports: - - containerPort: 8082 - name: metrics - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 20 - periodSeconds: 20 - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - securityContext: - runAsNonRoot: true - serviceAccountName: susql-operator-susql-controller-manager - terminationGracePeriodSeconds: 10 - permissions: - - rules: - - apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - serviceAccountName: susql-operator-susql-controller-manager - strategy: deployment - installModes: - - supported: true - type: OwnNamespace - - supported: true - type: SingleNamespace - - supported: true - type: MultiNamespace - - supported: true - type: AllNamespaces - keywords: - - monitoring - - aggregation - - sustainability - - energy - - kepler - - susql - links: - - name: SusQL Operator - url: https://github.com/sustainable-computing-io/susql-operator - - name: Sustainable Computing - url: https://github.com/sustainable-computing-io - maintainers: - - email: trent@jp.ibm.com - name: Scott Trent - - email: mohammed.munir.abdi@ibm.com - name: Mohammed Abdi - maturity: alpha - minKubeVersion: 1.16.0 - provider: - name: SusQL Operator Contributors - url: https://github.com/sustainable-computing-io/susql-operator - version: 0.0.15 diff --git a/bundle/manifests/susql.ibm.com_labelgroups.yaml b/bundle/manifests/susql.ibm.com_labelgroups.yaml deleted file mode 100644 index 9f54c83..0000000 --- a/bundle/manifests/susql.ibm.com_labelgroups.yaml +++ /dev/null @@ -1,87 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.12.0 - creationTimestamp: null - name: labelgroups.susql.ibm.com -spec: - group: susql.ibm.com - names: - kind: LabelGroup - listKind: LabelGroupList - plural: labelgroups - singular: labelgroup - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: LabelGroup is the Schema for the labelgroups API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: LabelGroupSpec defines the desired state of LabelGroup - properties: - disableUsingMostRecentValue: - description: Do not use the most recent value stored in the database - type: boolean - labels: - description: List of labels to be tracked for energy measurments (up - to 3) - items: - type: string - type: array - type: object - status: - description: LabelGroupStatus defines the observed state of LabelGroup - properties: - activeContainerIds: - additionalProperties: - type: number - description: Active containers associated with these set of labels - type: object - kubernetesLabels: - additionalProperties: - type: string - description: SusQL Kubernetes labels constructed from the spec - type: object - phase: - description: Transition phase of the label group - type: string - prometheusLabels: - additionalProperties: - type: string - description: SusQL Prometheus labels constructed from the spec - type: object - susqlPrometheusQuery: - description: Prometheus query to get the total energy for this label - group - type: string - totalEnergy: - description: TotalEnergy keeps track of the accumulated energy over - time - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: null - storedVersions: null diff --git a/bundle/metadata/annotations.yaml b/bundle/metadata/annotations.yaml deleted file mode 100644 index a510846..0000000 --- a/bundle/metadata/annotations.yaml +++ /dev/null @@ -1,14 +0,0 @@ -annotations: - # Core bundle annotations. - operators.operatorframework.io.bundle.mediatype.v1: registry+v1 - operators.operatorframework.io.bundle.manifests.v1: manifests/ - operators.operatorframework.io.bundle.metadata.v1: metadata/ - operators.operatorframework.io.bundle.package.v1: susql-operator - operators.operatorframework.io.bundle.channels.v1: alpha - operators.operatorframework.io.metrics.builder: operator-sdk-v1.34.1 - operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 - operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v4 - - # Annotations for testing. - operators.operatorframework.io.test.mediatype.v1: scorecard+v1 - operators.operatorframework.io.test.config.v1: tests/scorecard/ diff --git a/bundle/tests/scorecard/config.yaml b/bundle/tests/scorecard/config.yaml deleted file mode 100644 index d5b4b3e..0000000 --- a/bundle/tests/scorecard/config.yaml +++ /dev/null @@ -1,70 +0,0 @@ -apiVersion: scorecard.operatorframework.io/v1alpha3 -kind: Configuration -metadata: - name: config -stages: -- parallel: true - tests: - - entrypoint: - - scorecard-test - - basic-check-spec - image: quay.io/operator-framework/scorecard-test:v1.33.0 - labels: - suite: basic - test: basic-check-spec-test - storage: - spec: - mountPath: {} - - entrypoint: - - scorecard-test - - olm-bundle-validation - image: quay.io/operator-framework/scorecard-test:v1.33.0 - labels: - suite: olm - test: olm-bundle-validation-test - storage: - spec: - mountPath: {} - - entrypoint: - - scorecard-test - - olm-crds-have-validation - image: quay.io/operator-framework/scorecard-test:v1.33.0 - labels: - suite: olm - test: olm-crds-have-validation-test - storage: - spec: - mountPath: {} - - entrypoint: - - scorecard-test - - olm-crds-have-resources - image: quay.io/operator-framework/scorecard-test:v1.33.0 - labels: - suite: olm - test: olm-crds-have-resources-test - storage: - spec: - mountPath: {} - - entrypoint: - - scorecard-test - - olm-spec-descriptors - image: quay.io/operator-framework/scorecard-test:v1.33.0 - labels: - suite: olm - test: olm-spec-descriptors-test - storage: - spec: - mountPath: {} - - entrypoint: - - scorecard-test - - olm-status-descriptors - image: quay.io/operator-framework/scorecard-test:v1.33.0 - labels: - suite: olm - test: olm-status-descriptors-test - storage: - spec: - mountPath: {} -storage: - spec: - mountPath: {} From 2550bbb37e43f700e319fe7c2942e591f91b784a Mon Sep 17 00:00:00 2001 From: MohammedAbdi Date: Tue, 21 May 2024 12:54:11 -0400 Subject: [PATCH 2/2] update service monitor Signed-off-by: MohammedAbdi --- ...c.authorization.k8s.io_v1_clusterrole.yaml | 17 + ...nitoring.coreos.com_v1_servicemonitor.yaml | 18 + ...er-manager-metrics-service_v1_service.yaml | 23 ++ .../susql-operator.clusterserviceversion.yaml | 336 ++++++++++++++++++ .../manifests/susql.ibm.com_labelgroups.yaml | 87 +++++ bundle/metadata/annotations.yaml | 14 + bundle/tests/scorecard/config.yaml | 70 ++++ config/default/kustomization.yaml | 2 +- config/manager/manager.yaml | 32 +- 9 files changed, 582 insertions(+), 17 deletions(-) create mode 100644 bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml create mode 100644 bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml create mode 100644 bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml create mode 100644 bundle/manifests/susql-operator.clusterserviceversion.yaml create mode 100644 bundle/manifests/susql.ibm.com_labelgroups.yaml create mode 100644 bundle/metadata/annotations.yaml create mode 100644 bundle/tests/scorecard/config.yaml diff --git a/bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 0000000..3f9deff --- /dev/null +++ b/bundle/manifests/susql-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml @@ -0,0 +1,17 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: susql-operator + app.kubernetes.io/instance: metrics-reader + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: clusterrole + app.kubernetes.io/part-of: susql-operator + name: susql-operator-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get diff --git a/bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml b/bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml new file mode 100644 index 0000000..7e18273 --- /dev/null +++ b/bundle/manifests/susql-operator-susql-controller-manager-metrics-monitor_monitoring.coreos.com_v1_servicemonitor.yaml @@ -0,0 +1,18 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + app.kubernetes.io/component: metrics + app.kubernetes.io/created-by: susql-operator + app.kubernetes.io/instance: susql-controller-manager-metrics-monitor + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: servicemonitor + app.kubernetes.io/part-of: susql-operator + control-plane: susql-controller-manager + name: susql-operator-susql-controller-manager-metrics-monitor +spec: + endpoints: + - port: metrics + selector: + matchLabels: + control-plane: susql-controller-manager diff --git a/bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml b/bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml new file mode 100644 index 0000000..67c24f8 --- /dev/null +++ b/bundle/manifests/susql-operator-susql-controller-manager-metrics-service_v1_service.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: susql-operator + app.kubernetes.io/instance: susql-controller-manager-metrics-service + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: service + app.kubernetes.io/part-of: susql-operator + control-plane: susql-controller-manager + name: susql-operator-susql-controller-manager-metrics-service +spec: + ports: + - name: metrics + port: 8082 + protocol: TCP + targetPort: metrics + selector: + control-plane: susql-controller-manager +status: + loadBalancer: {} diff --git a/bundle/manifests/susql-operator.clusterserviceversion.yaml b/bundle/manifests/susql-operator.clusterserviceversion.yaml new file mode 100644 index 0000000..37dff0e --- /dev/null +++ b/bundle/manifests/susql-operator.clusterserviceversion.yaml @@ -0,0 +1,336 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "susql.ibm.com/v1", + "kind": "LabelGroup", + "metadata": { + "labels": { + "app.kubernetes.io/created-by": "susql-operator", + "app.kubernetes.io/instance": "labelgroup-sample", + "app.kubernetes.io/managed-by": "kustomize", + "app.kubernetes.io/name": "labelgroup", + "app.kubernetes.io/part-of": "susql-operator" + }, + "name": "labelgroup-sample" + }, + "spec": null + } + ] + capabilities: Basic Install + categories: Monitoring + containerImage: quay.io/sustainable_computing_io/susql_operator:0.0.15 + createdAt: "2024-05-21T16:53:43Z" + description: 'Aggregates energy data from pods tagged with SusQL labels ' + operators.operatorframework.io/builder: operator-sdk-v1.34.1 + operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 + repository: https://github.com/sustainable-computing-io/susql-operator + support: https://github.com/sustainable-computing-io/susql-operator/issues + name: susql-operator.v0.0.15 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: LabelGroup is the Schema for the labelgroups API + displayName: Label Group + kind: LabelGroup + name: labelgroups.susql.ibm.com + version: v1 + description: |- + ### About this Operator + + SusQL is a Kubernetes operator that aggregates energy data from pods + tagged with SusQL specific labels. The energy measurements are taken + from Kepler which should be deployed in the cluster before + using SusQL. + + ### Prerequisites + + 1. Deployment of Kepler on the cluster + 2. Ensure that [User Project Monitoring](https://docs.openshift.com/container-platform/latest/monitoring/enabling-monitoring-for-user-defined-projects.html) + is enabled to monitor energy consumed in user projects. + + ### API Backward Compatibility + + Until Operator supports **seamless upgrades**, a new version of the operator may + introduce a change that is **NOT** backwards compatible with the previous version. + Thus, to upgrade the operator, uninstall the already installed version completely + (including CRDs) and install the new version. For example to upgrade from 0.1.0 + to 0.2.0, you must first uninstall 0.1.0. + + ### LabelGroup spec Example + + ``` + apiVersion: susql.ibm.com/v1 + kind: LabelGroup + metadata: + name: labelgroup-name + namespace: susql-operator + spec: + labels: + - my-label-1 + - my-label-2 + ``` + + ### Documentation + + Documentation can be found at [SusQL Operator](https://github.com/sustainable-computing-io/susql-operator#readme). + + ### Getting help + + If you encounter any issues while using the SusQL Operator, you can create an + [issue](https://github.com/sustainable-computing-io/susql-operator/issues) + on our GitHub repo for bugs, enhancements, or other requests. + + ### Contributing + You can contribute by raising [issues](https://github.com/sustainable-computing-io/susql-operator/issues) + related to susql-operator. + + ### License + susql-operator is licensed under the Apache 2.0 license + displayName: SusQL + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + clusterPermissions: + - rules: + - apiGroups: + - susql.ibm.com + resources: + - labelgroups + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - susql.ibm.com + resources: + - labelgroups/finalizers + verbs: + - update + - apiGroups: + - susql.ibm.com + resources: + - labelgroups/status + verbs: + - get + - patch + - update + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + - apiGroups: + - "" + resources: + - pods + - pods/status + verbs: + - get + - list + - watch + serviceAccountName: susql-operator-susql-controller-manager + deployments: + - label: + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: susql-operator + app.kubernetes.io/instance: susql-controller-manager + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: deployment + app.kubernetes.io/part-of: susql-operator + name: susql-operator-susql-controller-manager + spec: + replicas: 1 + selector: + matchLabels: + control-plane: susql-controller-manager + strategy: {} + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: susql-controller-manager + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux + containers: + - args: + - --secure-listen-address=0.0.0.0:8443 + - --upstream=http://127.0.0.1:8082/ + - --logtostderr=true + - --v=0 + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.14.1 + name: kube-rbac-proxy + ports: + - containerPort: 8443 + name: https + protocol: TCP + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + - args: + - --leader-elect + - --kepler-prometheus-url=$(KEPLER-PROMETHEUS-URL) + - --kepler-metric-name=$(KEPLER-METRIC-NAME) + - --susql-prometheus-database-url=$(SUSQL-PROMETHEUS-DATABASE-URL) + - --susql-prometheus-metrics-url=$(SUSQL-PROMETHEUS-METRICS-URL) + - --sampling-rate=$(SAMPLING-RATE) + - --health-probe-bind-address=:8081 + - --metrics-bind-address=127.0.0.1:8082 + command: + - /manager + env: + - name: KEPLER-PROMETHEUS-URL + value: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 + - name: KEPLER-METRIC-NAME + value: kepler_container_joules_total + - name: SUSQL-PROMETHEUS-DATABASE-URL + value: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 + - name: SUSQL-PROMETHEUS-METRICS-URL + value: http://0.0.0.0:8082 + - name: SAMPLING-RATE + value: "2" + image: quay.io/sustainable_computing_io/susql_operator:0.0.15 + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 20 + periodSeconds: 20 + name: manager + ports: + - containerPort: 8082 + name: metrics + protocol: TCP + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 20 + periodSeconds: 20 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + securityContext: + runAsNonRoot: true + serviceAccountName: susql-operator-susql-controller-manager + terminationGracePeriodSeconds: 10 + permissions: + - rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + serviceAccountName: susql-operator-susql-controller-manager + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: true + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - monitoring + - aggregation + - sustainability + - energy + - kepler + - susql + links: + - name: SusQL Operator + url: https://github.com/sustainable-computing-io/susql-operator + - name: Sustainable Computing + url: https://github.com/sustainable-computing-io + maintainers: + - email: trent@jp.ibm.com + name: Scott Trent + - email: mohammed.munir.abdi@ibm.com + name: Mohammed Abdi + maturity: alpha + minKubeVersion: 1.16.0 + provider: + name: SusQL Operator Contributors + url: https://github.com/sustainable-computing-io/susql-operator + version: 0.0.15 diff --git a/bundle/manifests/susql.ibm.com_labelgroups.yaml b/bundle/manifests/susql.ibm.com_labelgroups.yaml new file mode 100644 index 0000000..9f54c83 --- /dev/null +++ b/bundle/manifests/susql.ibm.com_labelgroups.yaml @@ -0,0 +1,87 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.0 + creationTimestamp: null + name: labelgroups.susql.ibm.com +spec: + group: susql.ibm.com + names: + kind: LabelGroup + listKind: LabelGroupList + plural: labelgroups + singular: labelgroup + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: LabelGroup is the Schema for the labelgroups API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: LabelGroupSpec defines the desired state of LabelGroup + properties: + disableUsingMostRecentValue: + description: Do not use the most recent value stored in the database + type: boolean + labels: + description: List of labels to be tracked for energy measurments (up + to 3) + items: + type: string + type: array + type: object + status: + description: LabelGroupStatus defines the observed state of LabelGroup + properties: + activeContainerIds: + additionalProperties: + type: number + description: Active containers associated with these set of labels + type: object + kubernetesLabels: + additionalProperties: + type: string + description: SusQL Kubernetes labels constructed from the spec + type: object + phase: + description: Transition phase of the label group + type: string + prometheusLabels: + additionalProperties: + type: string + description: SusQL Prometheus labels constructed from the spec + type: object + susqlPrometheusQuery: + description: Prometheus query to get the total energy for this label + group + type: string + totalEnergy: + description: TotalEnergy keeps track of the accumulated energy over + time + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/bundle/metadata/annotations.yaml b/bundle/metadata/annotations.yaml new file mode 100644 index 0000000..a510846 --- /dev/null +++ b/bundle/metadata/annotations.yaml @@ -0,0 +1,14 @@ +annotations: + # Core bundle annotations. + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: susql-operator + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.metrics.builder: operator-sdk-v1.34.1 + operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 + operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v4 + + # Annotations for testing. + operators.operatorframework.io.test.mediatype.v1: scorecard+v1 + operators.operatorframework.io.test.config.v1: tests/scorecard/ diff --git a/bundle/tests/scorecard/config.yaml b/bundle/tests/scorecard/config.yaml new file mode 100644 index 0000000..d5b4b3e --- /dev/null +++ b/bundle/tests/scorecard/config.yaml @@ -0,0 +1,70 @@ +apiVersion: scorecard.operatorframework.io/v1alpha3 +kind: Configuration +metadata: + name: config +stages: +- parallel: true + tests: + - entrypoint: + - scorecard-test + - basic-check-spec + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: basic + test: basic-check-spec-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-bundle-validation + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-bundle-validation-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-crds-have-validation + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-crds-have-validation-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-crds-have-resources + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-crds-have-resources-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-spec-descriptors + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-spec-descriptors-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-status-descriptors + image: quay.io/operator-framework/scorecard-test:v1.33.0 + labels: + suite: olm + test: olm-status-descriptors-test + storage: + spec: + mountPath: {} +storage: + spec: + mountPath: {} diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index e018219..5b14036 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -30,7 +30,7 @@ patchesStrategicMerge: # Protect the /metrics endpoint by putting it behind auth. # If you want your controller-manager to expose the /metrics # endpoint w/o any authn/z, please comment the following line. -# - manager_auth_proxy_patch.yaml +- manager_auth_proxy_patch.yaml diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index 4301f37..5e5b835 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -39,22 +39,22 @@ spec: # according to the platforms which are supported by your solution. # It is considered best practice to support multiple architectures. You can # build your manager image using the makefile target docker-buildx. - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/arch - operator: In - values: - - amd64 - - arm64 - - ppc64le - - s390x - - key: kubernetes.io/os - operator: In - values: - - linux + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux securityContext: runAsNonRoot: true # TODO(user): For common cases that do not require escalating privileges