Kubernetes has become the go-to solution for container management thanks to its easy management of complex microservice-based architectures..
But its complex pricing models and lack of visibility make it difficult to track Kubernetes costs.. In this blog post, we'll take a look at some of the ways you can monitor and reduce your Kubernetes spending.
Table of content
- Autoscaling
- Spot Instances
- Resource limits
- Kubernetes Namespaces
- Set Cost Alerts
- Remove Unused Resources
- Cost Management Tool
Autoscaling
Scalability is one of Kubernetes' strong points and the ability to spin resources up or down depending on demand can net you significant costs savings.
Before you enable autoscaling in Kubernetes, it's important to understand the CPU and memory usage of your pods. Once you have this information, you can set resource limits and requests to enable Kubernetes to make informed decisions about when to scale up or down.
Kubernetes offers three main methods for autoscaling:
- Horizontal Pod Autoscaling (HPA). HPA adjusts the total number of nodes in your cluster by increasing or decreasing their number based on your application resource usage. It is controlled by the HorizontalPodAutoscaler, which uses a control loop to check the utilization of resources against metrics specified in the HPA definition. These metrics can be CPU utilization, custom metrics, object metrics, and external metrics, which are obtained from aggregated APIs. HPA is the most commonly used type of autoscaling, and is the preferred option for dealing with sudden increases in resource usage.
- Vertical Pod Autoscaling (VPA). Also referred to as scaling up, VPA lets you throw more resources such as CPU and memory onto existing machines. Instead of using predetermined values for CPU and memory, VPA suggests values that you can use to modify your pods either manually or automatically. Please note that updating the specifications through VPA results in the recreation of the pods.
- Kubernetes Autoscaler (Cluster Autoscaler) can automatically change the size of the cluster by launching new nodes when the pods do not have enough resources.
By using autoscaling, you can ensure that you have the resources you need, when you need them. This can help you drive down cost by avoiding over provisioning.
Spot Instances
Spot instances can cut your infrastructure costs by 50-90%, depending on your cloud provider. They are priced lower because they come from excess computing capacity in a data center, and can be taken away a very short notice.
Still, if you're running a fault-tolerant workload that can handle interruptions, spot nodes can make a lot of sense. This can include short jobs or stateless services that can easily be rescheduled and resumed with limited impact and without loss of data.
Resource Limits
Kubernetes provides precise control over resource requests down to the MiB level for RAM and a fraction of a CPU, avoiding over provisioning and ensuring efficient resource utilization.
To gain a better control of your spending, consider implementing resource limits in your YAML definition files for pods. Resource limits specify the maximum amount of resources, such as CPU and memory, that a pod can consume. This way, you can ensure that pods do not consume more resources than necessary, which can help reduce costs.
resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"
In the example, the above 'limits' specifies the maximum amount of CPU and memory a pod can consume, while the 'requests' field defines the minimum resources required.
Keep in mind that setting these values too high or too low can lead to performance degradation or over provisioning, which is why it's important to keep monitoring your resource utilization.
Kubernetes Namespaces
Namespaces provide a way to isolate resources within a cluster, allowing you to separate different environments, such as development, testing, and production, and allocate resources accordingly.
Once you create a namespace, you can use quotas and limits on the amount of resources a namespace can consume.
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-medium
spec:
hard:
cpu: "10"
memory: 20Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["medium"]
As is the case with resource limits, it's important to regularly monitor your usage to make sure costs are kept in control.
Set Cost Alerts
Detecting cost anomalies in real-time can be one of the most effective ways of managing your Kubernetes spending. Most monitoring tools out there such as Prometheus, Datadog and Finout have cost alerts built in to help you catch cost spikes before they morph into real issues.
Whenever the cost of your cluster exceeds a specified threshold, you'll get notified so you can take action. When setting this threshold, aim for a value that's high enough to avoid false alarms, but low enough to detect significant cost spikes.
Remove Unused Resources
One of the most forgotten and costly factors is not removing unused resources. Forgetting to wipe machines after use by users results in avoidable financial and resource waste. To prevent waste of resources and money, you can employ scripts and set up monthly checks through cron jobs.
These checks will identify unused or idle resources and pods, which can then be removed from dev and test environments. This process can also be integrated into production environments with a final manual review before removing resources.
Cost Management Tool
You can't manage what you don't measure and the same goes for your Kuberenetes costs. Using a cost management tool gives you a granular view of your costs, broken down by namespace, workload, nodes, and pods.
A tool like Finout will go above and beyond this to translate your costs into real business metrics, such as cost per customer or feature. This will give your DevOps, finance, and business teams the insights they need to make data-driven decision that positively impact your company's bottom line.
Want to get a clear picture of your total cloud spending? Book a demo to see Finout in action.