> For the complete documentation index, see [llms.txt](https://docs.perfectscale.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.perfectscale.io/enable-automation/configuring-automation-with-crd.md).

# Configuring Automation with CRD

Seamlessly setup Automation with flexible CR configuration.

Use a Custom Resource (CR) to configure Automation through flexible configuration. This allows you to seamlessly integrate automation into your existing workflows and manage it using standard Kubernetes practices.

## Create Custom Resource (CR)&#x20;

After the installation of the automation agent, it is important to create a **cluster automation configuration**, as this step **is mandatory:**&#x20;

```yaml
apiVersion: perfectscale.io/v1
kind: ClusterAutomationConfig
metadata:
  name: cluster-automation-config
spec:
  automation:
    operational:
      stopAllAutomation: false # Global kill switch for automation (default: false)
      cleanupAllAutomation: false # Stops automation and reverts all changes, restoring original resource specifications and settings
```

{% hint style="info" %}
Automation is only enabled in configurations where automationMode for the workload type is set to "Enabled". This can be configured in the `ClusterAutomationConfig`, `NamespaceAutomationConfig`, or `WorkloadAutomationConfig`.

**Example**:

```yaml
apiVersion: perfectscale.io/v1
kind: ClusterAutomationConfig
metadata:
  name: cluster-automation-config
spec:
  automation:
    operational:
      stopAllAutomation: false # Global kill switch for automation (default: false)
      cleanupAllAutomation: false # Stops automation and reverts all changes, restoring original resource specifications and settings  
    workloadTypes:
      Deployment:
        operational:
          automationMode: "Enabled" # Enables automation for the workloads with a specific type in the cluster/namespace
```

This configuration enables automation for all workloads in a cluster with **type: Deployment**. Learn more about enabling automation for particular workload types [in a cluster](#cluster-level-configuration), [specific namespace](#namespace-level-configuration), or [specific workloads](#workload-level-configuration).
{% endhint %}

{% hint style="info" %}
**Only one cluster-level automation configuration can be applied per cluster**. To prevent errors, PerfectScale recommends using consistent naming for cluster-level configurations within the same cluster. This ensures that a new configuration will override the previous one without causing any conflicts.
{% endhint %}

To help you quickly start using PerfectScale Automation and streamline the optimization process, we provide pre-built Custom Resources (CRs) focused on desired optimization goals. You can easily implement the following CRs and customize them if needed.

{% hint style="info" %}
PerfectScale recommends you start with the cluster [cost-saving automation configuration](#recommended-adoption-path).&#x20;

:point\_right: Explore more configuration examples at our [GitHub](https://github.com/perfectscale-io/perfectscale-io.github.io/tree/main/charts/psc-autoscaler/examples).
{% endhint %}

## :zap: <mark style="color:green;">Recommended adoption path</mark>

To minimize waste and achieve optimal savings, we recommend starting with a simple, cluster-level automation focused on cost reduction.

**Create** a YAML file with the recommended cluster-level automation configuration using the following template:

```yaml
apiVersion: perfectscale.io/v1
kind: ClusterAutomationConfig
metadata:
  name: cluster-automation-config
spec:
  automation:
    operational:
      stopAllAutomation: false # Global kill switch for automation (default: false)
      cleanupAllAutomation: false # Stops automation and reverts all changes, restoring original resource specifications and settings  
    workloadTypes:
      Deployment:
        operational:
          automationMode: "Enabled" # Enables automation for the workloads with a specific type in the cluster/namespace
          restrictions:
      DaemonSet:
        operational:
          automationMode: "Enabled" # Enables automation for the workloads with a specific type in the cluster/namespace
          restrictions:
```

**Apply** the created configuration by running the following command (where `cluster-automation-config.yaml` - the name of your file created in the previous step):

```
kubectl apply -f cluster-automation-config.yaml
```

### Combining cost savings and performance improvement configuration  <a href="#example-2-combining-automated-cost-savings-and-performance-improvement" id="example-2-combining-automated-cost-savings-and-performance-improvement"></a>

The following example of a Cluster-level automation configuration allows you to automate the optimization of the entire cluster, enhancing its performance while maintaining optimal costs.

**Create** a YAML file with the cluster-level automation configuration using the following template:

```yaml
apiVersion: perfectscale.io/v1
kind: ClusterAutomationConfig
metadata:
  name: cluster-automation-config
spec:
  automation:
    operational:
      stopAllAutomation: false # Global kill switch for automation (default: false)
      cleanupAllAutomation: false # Stops automation and reverts all changes, restoring original resource specifications and settings  
    workloadTypes:
      Deployment:
        operational:
          automationMode: "Enabled" # Enables automation for the workloads with a specific type in the cluster/namespace
          restrictions:
            workloadMinWasteUSDPerMonth: 5 # Activates automation only if monthly waste exceeds a set threshold (for example, $5)
            cpuManagement:
              request:
                increaseEnabled: true # Allows PerfectScale Automation to increase CPU requests if the performance risks are observed
                decreaseEnabled: true # Allows PerfectScale Automation to decrease CPU requests to minimize waste
              limit:
                keepLimit: true # Automation will maintain a non-zero CPU limit and will not set the value to zero
            memoryManagement:
              request:
                increaseEnabled: true # Allows PerfectScale Automation to increase Memory requests if the performance risks are observed
                decreaseEnabled: true # Allows PerfectScale Automation to decrease Memory requests to minimize waste
              limit:
                increaseEnabled: true # Allows PerfectScale Automation to increase Memory limit if the performance risks are observed
                decreaseEnabled: true # Allows PerfectScale Automation to decrease Memory limit
      DaemonSet:
        operational:
          automationMode: "Enabled" # Enables automation for the workloads with a specific type in the cluster/namespace
          restrictions:
            workloadMinWasteUSDPerMonth: 5 # Activates automation only if monthly waste exceeds a set threshold (for example, $5)
            cpuManagement:
              request:
                increaseEnabled: true # Allows PerfectScale Automation to increase CPU requests if the performance risks are observed
                decreaseEnabled: true # Allows PerfectScale Automation to decrease CPU requests to minimize waste
              limit:
                keepLimit: true # Automation will maintain a non-zero CPU limit and will not set the value to zero
            memoryManagement:
              request:
                increaseEnabled: true # Allows PerfectScale Automation to increase Memory requests if the performance risks are observed
                decreaseEnabled: true # Allows PerfectScale Automation to decrease Memory requests to minimize waste
              limit:
                increaseEnabled: true # Allows PerfectScale Automation to increase Memory limit if the performance risks are observed
                decreaseEnabled: true # Allows PerfectScale Automation to decrease Memory limit
```

**Apply** the created configuration by running the following command (where `cluster-automation-config.yaml` - the name of your file created in the previous step):

```
kubectl apply -f cluster-automation-config.yaml
```

Let's explore additional examples of automation configurations that offer more granular and flexible control over Automation:

* [How to include a cluster, namespace, or workload in the Automation configuration](/enable-automation/configuring-automation-with-crd/including-a-cluster-namespace-or-workload-to-the-automation.md)
* [How to exclude a namespace or workload from the Automation configuration](/enable-automation/configuring-automation-with-crd/excluding-a-namespace-or-workload-from-the-automation-with-crd.md)

### Automation configuration defaults

Some automation configuration settings have predefined defaults. If you don’t specify a value, PerfectScale will automatically apply the default for that field. Below is the list of configurations and their default values.

<table><thead><tr><th>Config</th><th>Default</th></tr></thead><tbody><tr><td>stopAllAutomation</td><td>false</td></tr><tr><td>cleanupAllAutomation</td><td>false</td></tr><tr><td>automationMode</td><td>Enabled</td></tr><tr><td>workloadLabelSelectors</td><td>nil</td></tr><tr><td>wasteMaxAutomationFrequency</td><td><p>Deployment: 30m</p><p>Rollout: 30m</p><p>CronJob: 30m</p><p>Job: 30m</p><p>DaemonSet: 4h</p><p>StatefulSet: 24h</p></td></tr><tr><td>fixResiliencyMaxAutomationFrequency</td><td>30m</td></tr><tr><td>maintenanceWindowIgnoredForResiliency</td><td>false</td></tr><tr><td>maintenanceWindowIgnoredMinResiliencyLevel</td><td>""</td></tr><tr><td>maintenanceWindow</td><td><pre><code>monday:
  - "00:00-23:59"
tuesday:
  - "00:00-23:59"
wednesday:
  - "00:00-23:59"
thursday:
  - "00:00-23:59"
friday:
  - "00:00-23:59"
saturday:
  - "00:00-23:59"
sunday:
  - "00:00-23:59"
</code></pre></td></tr><tr><td>workloadMinWasteUSDPerMonth</td><td>5</td></tr><tr><td>cpuManagement</td><td><p><strong>request:</strong></p><p>IncreaseEnabled: false<br>DecreaseEnabled: true<br>MinimumCores: -1 // no limit<br>MaximumCores: -1 //no limit<br><br><strong>limit:</strong><br>KeepLimit: true<br><br><strong>maxCpuRequestIncreaseIterations:</strong><br>Daily: 3<br>Weekly: 6</p></td></tr><tr><td>memoryManagement</td><td><p><strong>request:</strong></p><p> IncreaseEnabled: false<br> DecreaseEnabled: true<br> MinimumGiB: -1 // no limit<br> MaximumGib: -1 //no limit<br><br><strong>limit:</strong><br> IncreaseEnabled: false<br> DecreaseEnabled: false<br> MinimumGiB: -1 // no limit<br> MaximumGib: -1 //no limit<br><br><strong>maxMemoryIncreaseIterations:</strong><br> Daily: 3<br> Weekly: 6</p></td></tr></tbody></table>
