From b9c23cafdf9e78198c68b993863a003b7a50d9da Mon Sep 17 00:00:00 2001 From: Johannes <38868829+Fovty@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:02:54 +0200 Subject: [PATCH] Fix/cleanup-readme (#20) * fix: READMEs for helm deploy * chore: remove old deployment * chore: add diagram for readme * fix: replace old project name * dix: update instructions accordingly * fix: numbering * chore: formatting and grammar Signed-off-by: Bruno Bressi --------- Signed-off-by: Bruno Bressi Co-authored-by: Bruno Bressi --- README.md | 67 +++++++++------------- chart/README.md | 92 ++++++++++++++++++++++++++++-- chart/images/architecture.png | Bin 0 -> 63170 bytes deploy/config.yaml | 7 --- deploy/deployment.yaml | 41 -------------- deploy/kustomization.yaml | 6 -- deploy/rbac.yaml | 104 ---------------------------------- kube_downscaler/cmd.py | 4 +- kube_downscaler/helper.py | 4 +- 9 files changed, 120 insertions(+), 205 deletions(-) create mode 100644 chart/images/architecture.png delete mode 100644 deploy/config.yaml delete mode 100644 deploy/deployment.yaml delete mode 100644 deploy/kustomization.yaml delete mode 100644 deploy/rbac.yaml diff --git a/README.md b/README.md index 31879cc..1bb98a5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -Kubernetes Downscaler +Python Kubernetes Downscaler ===================== -This is a fork of [hjacobs/kube-downscaler](https://codeberg.org/hjacobs/kube-downscaler) which is no longer maintained. Here the original text of the kube-downscaler README: +This is a fork of [hjacobs/kube-downscaler](https://codeberg.org/hjacobs/kube-downscaler) which is no longer maintained. **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* -- [Concepts](#concepts) - - [Algorithm](#algorithm) - - [Minimum replicas](#minimum-replicas) - - [Specific workload](#specific-workload) - - [Example use cases](#example-use-cases) -- [Usage](#usage) - - [Deployment](#deployment) - - [Example configuration](#example-configuration) - - [Notes](#notes) -- [Configuration](#configuration) - - [Uptime / downtime spec](#uptime--downtime-spec) - - [Alternative logic, based on periods](#alternative-logic-based-on-periods) - - [Command Line Options](#command-line-options) - - [Namespace Defaults](#namespace-defaults) -- [Contributing](#contributing) -- [License](#license) +- [Python Kubernetes Downscaler](#python-kubernetes-downscaler) + - [Concepts](#concepts) + - [Algorithm](#algorithm) + - [Minimum replicas](#minimum-replicas) + - [Specific workload](#specific-workload) + - [Example use cases](#example-use-cases) + - [Usage](#usage) + - [Helm Chart](#helm-chart) + - [Example configuration](#example-configuration) + - [Notes](#notes) + - [Configuration](#configuration) + - [Uptime / downtime spec](#uptime--downtime-spec) + - [Alternative logic, based on periods](#alternative-logic-based-on-periods) + - [Command Line Options](#command-line-options) + - [Namespace Defaults](#namespace-defaults) + - [Contributing](#contributing) + - [License](#license) @@ -43,7 +44,7 @@ Scale down / "pause" Kubernetes workload (`Deployments`, `StatefulSets`, and/or ### Algorithm -`Kube-downscaler` will scale down the deployment\'s replicas if all of the following +`py-kube-downscaler` will scale down the deployment\'s replicas if all of the following conditions are met: - **current time** is not part of the \"uptime\" schedule or is part of the \"downtime\" schedule. @@ -122,21 +123,9 @@ were tested to work fine with the downscaler. ## Usage -### Deployment +### Helm Chart -Deploy the downscaler into your cluster via (also works with -[kind](https://kind.sigs.k8s.io/) or -[Minikube](https://github.com/kubernetes/minikube)): - -``` {.sourceCode .bash} -$ kubectl apply -f deploy/ -``` - -In case you are deploying `kube-downscaler` to another namespace than -`default`, for example if your context is pointing to `my-namespace`. -Make sure you change the `deploy/rbac.yaml` Service Account -configuration `namespace: default` to the destination namespace -`my-namespace`, instead of `default`. +For detailed information on deploying the `py-kube-downscaler` using our Helm chart, please refer to the [Helm Chart README](./chart/README.md#Deploy-py-kube-downscaler-using-Helm-chart) in the chart directory. ### Example configuration @@ -146,7 +135,7 @@ prevent downscaling \-\-- remove it to enable the downscaler, e.g. by editing the deployment: ``` {.sourceCode .bash} -$ kubectl edit deploy kube-downscaler +$ kubectl edit deploy py-kube-downscaler ``` The example deployment manifests come with a configured uptime @@ -186,7 +175,7 @@ with Deployments, consider the following: during downtime based upon the external traffic as well as maintain a lower `minReplicas` during downtime if there is no/low traffic. **If the Deployment is annotated instead of the HPA, it leads to a race - condition** where `kube-downscaler` scales down the Deployment and HPA + condition** where `py-kube-downscaler` scales down the Deployment and HPA upscales it as its `minReplicas` is higher. To enable Downscaler on HPA with `--downtime-replicas=1`, @@ -276,7 +265,7 @@ Available command line options: : Restrict the downscaler to work only in a single namespace (default: all namespaces). This is mainly useful for deployment scenarios - where the deployer of kube-downscaler only has access to a given + where the deployer of py-kube-downscaler only has access to a given namespace (instead of cluster access). If used simultaneously with `--exclude-namespaces`, none is applied. @@ -329,7 +318,7 @@ Available command line options: `--exclude-deployments` : Exclude specific deployments/statefulsets/cronjobs from downscaling - (default: kube-downscaler, downscaler), can also be configured via + (default: py-kube-downscaler, downscaler), can also be configured via environment variable `EXCLUDE_DEPLOYMENTS`. Despite its name, this option will match the name of any included resource type (Deployment, StatefulSet, CronJob, ..). @@ -351,10 +340,10 @@ Available command line options: `--matching-labels` -: Optional: list of workload\'s labels which are covered by the kube-downscaler +: Optional: list of workload\'s labels which are covered by the py-kube-downscaler scope. All workloads whose labels don't match any in the list are ignored. For backwards compatibility, if this argument is not specified, - kube-downscaler will apply to all resources. + py-kube-downscaler will apply to all resources. ### Namespace Defaults diff --git a/chart/README.md b/chart/README.md index fa98b0f..8ea395c 100644 --- a/chart/README.md +++ b/chart/README.md @@ -1,13 +1,97 @@ -# Kube Downscaler Helm Chart +# Python Kubernetes Downscaler - Helm Chart -This repository offers a convenience chart for the `kube-downscaler` [project](https://codeberg.org/hjacobs/kube-downscaler). +This repository offers a Helm chart for the `py-kube-downscaler`. ## Important values | Key | Type | Example | Description | -| ------------------ | ------ | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +|--------------------|--------|-------------------------------------------------------------------------------------------------------|-------------------------------------------------| | image.tag | string | `"23.2.0@sha256:4129e7e7551eb451ee2b43680ef818f3057304ad50888f79ec9722afab6c29ff"` | Tag of the image to use | | arguments | list | `[--interval=60,--include-resources=deployments,statefulsets,horizontalpodautoscalers,scaledobjects]` | Arguments to pass to the kube-downscaler binary | | excludedNamespaces | list | `["namespace-a", "namespace-b"]` | Namespaces to exclude from downscaling | -How the downscaler can be configured is described in the [kube-downscaler documentation](https://codeberg.org/hjacobs/kube-downscaler). +# Deploy py-kube-downscaler using Helm chart + +This directory contains tutorial to deploy py-kube-downscaler. + +## Configuring your Deployment to downscale + +Please add below annotations based on timezone your deployment should run: + +``` +metadata: + annotations: + downscaler/uptime: "Mon-Fri 07:00-19:00 US/Eastern" +``` + +Note: For more configuration details please, +refer [here](https://github.com/caas-team/py-kube-downscaler?tab=readme-ov-file#configuration). + +## Architecture + +The diagram below depicts how a py-kube-downscaler agent controls applications. +![Alt text](images/architecture.png?raw=true "Kube py-kube-downscaler diagram") + +## Quick Start + +Below are instructions to quickly install and configure py-kube-downscaler. + +### Installing py-kube-downscaler + +1. Make sure you're connected to the right cluster: + +``` +kubectl config current-context +``` + +2. Before deploying, make sure to update *values.yaml* in py-kube-downscaler chart depending on whether you want RBAC + roles deployed or not: + +```yaml +rbac: + create: false +``` + +Note: In case RBAC is enabled, a new service account will be created for py-kube-downscaler with certain privileges, +otherwise the 'default' one will be used. + +3. Deploy py-kube-downscaler: + +``` +cd chart +helm install . --namespace py-kube-downscaler --name py-kube-downscaler +``` + +4. Check the deployed release status: + +``` +helm list -n py-kube-downscaler +``` + +``` +NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE +py-kube-downscaler 1 Tue Sep 25 02:07:58 2018 DEPLOYED py-kube-downscaler-0.5.1 0.5.1 py-kube-downscaler + +``` + +5. Check whether py-kube-downscaler pod is up and running: + +``` +kubectl get pods -n py-kube-downscaler +``` + +``` +NAME READY STATUS RESTARTS AGE +py-kube-downscaler-py-kube-downscaler-7f58c6b5b7-rnglz 1/1 Running 0 6m +``` + +6. Check the Kubernetes event logs, to make sure of successful deployment of py-kube-downscaler: + +``` +kubectl get events -w +``` + +## Acknowledgments + +Thanks to [Kube-downscaler](https://github.com/hjacobs/kube-downscaler) project authored +by [Henning Jacobs](https://github.com/hjacobs). diff --git a/chart/images/architecture.png b/chart/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf428f3c97764e7225403f21c3bab996301f073 GIT binary patch literal 63170 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

    $m!C2eI8~ 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 literal 0 HcmV?d00001 diff --git a/deploy/config.yaml b/deploy/config.yaml deleted file mode 100644 index f097956..0000000 --- a/deploy/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: kube-downscaler -data: - # downscale for non-work hours - DEFAULT_UPTIME: "Mon-Fri 07:30-20:30 CET" diff --git a/deploy/deployment.yaml b/deploy/deployment.yaml deleted file mode 100644 index 72648f3..0000000 --- a/deploy/deployment.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - application: kube-downscaler - version: v23.2.0 - name: kube-downscaler -spec: - replicas: 1 - selector: - matchLabels: - application: kube-downscaler - template: - metadata: - labels: - application: kube-downscaler - version: v23.2.0 - spec: - serviceAccountName: kube-downscaler - containers: - - name: downscaler - image: hjacobs/kube-downscaler:23.2.0 - args: - # dry run by default, remove to perform downscaling - - --dry-run - # run every minute - - --interval=60 - envFrom: - - configMapRef: - name: kube-downscaler - optional: true - resources: - limits: - memory: 100Mi - requests: - cpu: 5m - memory: 100Mi - securityContext: - readOnlyRootFilesystem: true - runAsNonRoot: true - runAsUser: 1000 diff --git a/deploy/kustomization.yaml b/deploy/kustomization.yaml deleted file mode 100644 index 15c1172..0000000 --- a/deploy/kustomization.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -resources: - - deployment.yaml - - rbac.yaml - - config.yaml diff --git a/deploy/rbac.yaml b/deploy/rbac.yaml deleted file mode 100644 index 751b09c..0000000 --- a/deploy/rbac.yaml +++ /dev/null @@ -1,104 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: kube-downscaler ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kube-downscaler -rules: -- apiGroups: - - "" - resources: - - pods - - namespaces - verbs: - - get - - watch - - list -- apiGroups: - - apps - resources: - - deployments - - statefulsets - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - argoproj.io - resources: - - rollouts - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - autoscaling - resources: - - horizontalpodautoscalers - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - batch - resources: - - cronjobs - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - keda.sh - resources: - - scaledobjects - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - zalando.org - resources: - - stacks - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - get - - create - - watch - - list - - update - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: kube-downscaler -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: kube-downscaler -subjects: -- kind: ServiceAccount - name: kube-downscaler - namespace: default diff --git a/kube_downscaler/cmd.py b/kube_downscaler/cmd.py index c37979e..f72bb14 100644 --- a/kube_downscaler/cmd.py +++ b/kube_downscaler/cmd.py @@ -81,8 +81,8 @@ def get_parser(): ) parser.add_argument( "--exclude-deployments", - help="Exclude specific deployments from downscaling. Despite its name, this option will match the name of any included resource type (Deployment, StatefulSet, CronJob, ..). (default: kube-downscaler,downscaler)", - default=os.getenv("EXCLUDE_DEPLOYMENTS", "kube-downscaler,downscaler"), + help="Exclude specific deployments from downscaling. Despite its name, this option will match the name of any included resource type (Deployment, StatefulSet, CronJob, ..). (default: py-kube-downscaler,downscaler)", + default=os.getenv("EXCLUDE_DEPLOYMENTS", "py-kube-downscaler,downscaler"), ) parser.add_argument( "--downtime-replicas", diff --git a/kube_downscaler/helper.py b/kube_downscaler/helper.py index 545dbf7..6094475 100644 --- a/kube_downscaler/helper.py +++ b/kube_downscaler/helper.py @@ -107,7 +107,7 @@ def create_event(resource, message: str, reason: str, event_type: str, dry_run: { "metadata": { "namespace": resource.namespace, - "generateName": "kube-downscaler-", + "generateName": "py-kube-downscaler-", }, "type": event_type, "count": 1, @@ -124,7 +124,7 @@ def create_event(resource, message: str, reason: str, event_type: str, dry_run: "uid": resource.metadata.get("uid"), }, "message": message, - "source": {"component": "kube-downscaler"}, + "source": {"component": "py-kube-downscaler"}, }, ) if not dry_run: