diff --git a/charts/crane/Chart.yaml b/charts/crane/Chart.yaml index cdefc25..7549148 100644 --- a/charts/crane/Chart.yaml +++ b/charts/crane/Chart.yaml @@ -16,6 +16,6 @@ sources: type: application -version: 0.6.0 +version: 0.7.0 -appVersion: v0.6.0 \ No newline at end of file +appVersion: v0.7.0 \ No newline at end of file diff --git a/charts/crane/crds/analysis.crane.io_analytics.yaml b/charts/crane/crds/analysis.crane.io_analytics.yaml index 63b0929..0a8924e 100644 --- a/charts/crane/crds/analysis.crane.io_analytics.yaml +++ b/charts/crane/crds/analysis.crane.io_analytics.yaml @@ -262,6 +262,16 @@ spec: namespace: description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' type: string + recommenderRef: + description: RecommenderRef presents recommender info for recommendation + mission. + properties: + name: + description: Recommender's Name + type: string + required: + - name + type: object resourceVersion: description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' diff --git a/charts/crane/crds/analysis.crane.io_recommendationrules.yaml b/charts/crane/crds/analysis.crane.io_recommendationrules.yaml new file mode 100644 index 0000000..f8239f3 --- /dev/null +++ b/charts/crane/crds/analysis.crane.io_recommendationrules.yaml @@ -0,0 +1,290 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.7.0 + creationTimestamp: null + name: recommendationrules.analysis.crane.io +spec: + group: analysis.crane.io + names: + kind: RecommendationRule + listKind: RecommendationRuleList + plural: recommendationrules + shortNames: + - rr + singular: recommendationrule + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .spec.runInterval + name: RunInterval + type: string + - description: CreationTimestamp is a timestamp representing the server time when + this object was created. + jsonPath: .metadata.creationTimestamp + name: AGE + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: RecommendationRule represents the configuration of an RecommendationRule + object. + 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: RecommendationRuleSpec defines resources and runInterval + to recommend + properties: + namespaceSelector: + description: NamespaceSelector indicates resource namespaces to select + from + properties: + any: + description: Select all namespace if true + type: boolean + matchNames: + description: List of namespace names to select from. + items: + type: string + type: array + type: object + recommenders: + description: List of recommender type to run + items: + description: Recommender referring to the Recommender in RecommendationConfiguration + properties: + name: + description: Recommender's Name + type: string + required: + - name + type: object + type: array + resourceSelectors: + description: ResourceSelector indicates how to select resources(e.g. + a set of Deployments) for a Recommendation. + items: + description: ResourceSelector describes how the resources will be + selected. + properties: + apiVersion: + description: API version of the resource, e.g. "apps/v1" + type: string + kind: + description: Kind of the resource, e.g. Deployment + type: string + labelSelector: + description: A label selector is a label query over a set of + resources. The result of matchLabels and matchExpressions + are ANDed. An empty label selector matches all objects. A + null label selector matches no objects. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values array + must be non-empty. If the operator is Exists or + DoesNotExist, the values array must be empty. This + array is replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field is + "key", the operator is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + name: + description: Name of the resource. + type: string + required: + - kind + type: object + type: array + runInterval: + description: RunInterval between two recommendation + type: string + required: + - namespaceSelector + - recommenders + - resourceSelectors + type: object + status: + description: RecommendationRuleStatus represents the current state of + an RecommendationRule item. + properties: + lastUpdateTime: + description: LastUpdateTime is the last time the status updated. + format: date-time + type: string + recommendations: + description: Recommendations is a list of RecommendationMission that + run parallel. + items: + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + lastStartTime: + description: LastStartTime is last time we start a recommendation + mission. + format: date-time + type: string + message: + description: Message presents the running message for this mission + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + recommenderRef: + description: RecommenderRef presents recommender info for recommendation + mission. + properties: + name: + description: Recommender's Name + type: string + required: + - name + type: object + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + targetRef: + description: 'ObjectReference contains enough information to + let you inspect or modify the referred object. --- New uses + of this type are discouraged because of difficulty describing + its usage when embedded in APIs. 1. Ignored fields. It includes + many fields which are not generally honored. For instance, + ResourceVersion and FieldPath are both very rarely valid in + actual usage. 2. Invalid usage help. It is impossible to + add specific help for individual usage. In most embedded + usages, there are particular restrictions like, "must + refer only to types A and B" or "UID not honored" or "name + must be restricted". Those cannot be well described when + embedded. 3. Inconsistent validation. Because the usages + are different, the validation rules are different by usage, + which makes it hard for users to predict what will happen. 4. + The fields are both imprecise and overly precise. Kind is + not a precise mapping to a URL. This can produce ambiguity during + interpretation and require a REST mapping. In most cases, + the dependency is on the group,resource tuple and the + version of the actual struct is irrelevant. 5. We cannot + easily change it. Because this type is embedded in many locations, + updates to this type will affect numerous schemas. Don''t + make new APIs embed an underspecified API type they do not + control. Instead of using this type, create a locally provided + and used type that is well-focused on your reference. For + example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 + .' + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead + of an entire object, this string should contain a valid + JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container + within a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that + triggered the event) or if no container name is specified + "spec.containers[2]" (container with index 2 in this pod). + This syntax is chosen only to have some well-defined way + of referencing a part of an object. TODO: this design + is not final and this field is subject to change in the + future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + type: array + x-kubernetes-list-type: atomic + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/crane/crds/analysis.crane.io_recommendations.yaml b/charts/crane/crds/analysis.crane.io_recommendations.yaml index 9c78970..f4b7da8 100644 --- a/charts/crane/crds/analysis.crane.io_recommendations.yaml +++ b/charts/crane/crds/analysis.crane.io_recommendations.yaml @@ -40,6 +40,11 @@ spec: - jsonPath: .spec.adoptionType name: AdoptionType type: string + - description: CreationTimestamp is a timestamp representing the server time when + this object was created. + jsonPath: .metadata.creationTimestamp + name: AGE + type: date name: v1alpha1 schema: openAPIV3Schema: @@ -157,6 +162,8 @@ spec: status: description: RecommendationStatus represents the current state of a recommendation. properties: + action: + type: string conditions: description: Conditions is an array of current recommendation conditions. items: @@ -227,13 +234,78 @@ spec: - type type: object type: array + currentInfo: + type: string + description: + type: string lastUpdateTime: description: LastUpdateTime is last time we got an update on this status. format: date-time type: string + recommendedInfo: + type: string recommendedValue: type: string + targetRef: + description: 'ObjectReference contains enough information to let you + inspect or modify the referred object. --- New uses of this type + are discouraged because of difficulty describing its usage when + embedded in APIs. 1. Ignored fields. It includes many fields which + are not generally honored. For instance, ResourceVersion and FieldPath + are both very rarely valid in actual usage. 2. Invalid usage help. It + is impossible to add specific help for individual usage. In most + embedded usages, there are particular restrictions like, "must + refer only to types A and B" or "UID not honored" or "name must + be restricted". Those cannot be well described when embedded. 3. + Inconsistent validation. Because the usages are different, the + validation rules are different by usage, which makes it hard for + users to predict what will happen. 4. The fields are both imprecise + and overly precise. Kind is not a precise mapping to a URL. This + can produce ambiguity during interpretation and require a REST + mapping. In most cases, the dependency is on the group,resource + tuple and the version of the actual struct is irrelevant. 5. + We cannot easily change it. Because this type is embedded in many + locations, updates to this type will affect numerous schemas. Don''t + make new APIs embed an underspecified API type they do not control. + Instead of using this type, create a locally provided and used type + that is well-focused on your reference. For example, ServiceReferences + for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 + .' + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object type: object type: object served: true diff --git a/charts/crane/templates/craned-deployment.yaml b/charts/crane/templates/craned-deployment.yaml index 5b005dd..aeb3a7f 100644 --- a/charts/crane/templates/craned-deployment.yaml +++ b/charts/crane/templates/craned-deployment.yaml @@ -39,7 +39,7 @@ spec: command: - /craned args: - - --recommendation-config-file=/tmp/recommendation-config/config_set.yaml + - --recommendation-configuration-file=/tmp/recommendation-config/config.yaml {{- range $key, $value := .Values.craned.containerArgs }} {{- if $value }} - --{{ $key }}={{ $value }} @@ -91,7 +91,7 @@ spec: secretName: webhook-server-tls - name: config configMap: - name: recommendation-config + name: recommendation-configuration {{ if .Values.cranedDashboard.enable }} - name: nginx-conf configMap: @@ -116,30 +116,27 @@ type: kubernetes.io/tls apiVersion: v1 kind: ConfigMap metadata: - name: recommendation-config + name: recommendation-configuration namespace: {{ .Release.Namespace }} labels: {{- include "crane.labels" . | nindent 4 }} data: - config_set.yaml: |- + config.yaml: |- apiVersion: analysis.crane.io/v1alpha1 - kind: ConfigSet - configs: - - targets: [] - properties: - resource.cpu-request-percentile: "0.98" - replicas.workload-min-replicas: "3" - replicas.pod-min-ready-seconds: "30" - replicas.pod-available-ratio: "0.5" - replicas.default-min-replicas: "3" - replicas.max-replicas-factor: "3" - replicas.min-cpu-usage-threshold: "0.1" - replicas.fluctuation-threshold: "1.0" - replicas.min-cpu-target-utilization: "30" - replicas.max-cpu-target-utilization: "75" - replicas.cpu-target-utilization: "30" - replicas.cpu-percentile: "95" - replicas.reference-hpa: "true" + kind: RecommendationConfiguration + recommenders: + - name: Replicas + acceptedResources: + - kind: Deployment + apiVersion: apps/v1 + - kind: StatefulSet + apiVersion: apps/v1 + - name: Resource + acceptedResources: + - kind: Deployment + apiVersion: apps/v1 + - kind: StatefulSet + apiVersion: apps/v1 {{ if .Values.cranedDashboard.enable }} ---