Skip to content

tetratelabs/istio-cost-analyzer

Repository files navigation

Istio Cost Analyzer

The Istio Cost Analyzer is a tool that allows you to analyze the costliest workload links in your cluster. It relies on Kubernetes/Istio and Prometheus to gather data, and uses publicly-available cloud egress rates to estimate the overall egress costs of your services.

Usage

To use this on your kubernetes cluster, make sure you have a kubeconfig in your home directory, and make sure Istio is installed on your cluster, with the prometheus addon enabled. You must also have a HEALTHY Istio Operator available.

Installation

To install the istio-cost-analyzer binary:

go install github.com/tetratelabs/istio-cost-analyzer@latest

Setup

The setup command does a few things:

  • Edits Istio Operator config to add custom prometheus metrics (a destination_locality label on an Istio metric).
  • Creates a Mutating Webhook that gets called when a new deployment is created. This mutating webhook runs in a pod and has associated RBAC permissions, Services, etc.
  • Labels existing pods & deployments in said --targetNamespace.

You can either run the following command and have a webhook handle everything all existing Deployments and all Deployments created in the future:

istio-cost-analyzer setup
Flag Description Default Value
targetNamespace Namespace which the cost analyzer will watch/analyze default
analyzeAll (-a) Adding this flag will cause the cost analyzer to analyze all namespaces. Don't set this if you set targetNamespace. false
cloud Cloud on which your cluster is running (node info varies cloud to cloud -- inferred from Node info) Inferred from Node info
analyzerNamespace Namespace in which cost analyzer config will exist (you usually don't need to set this) istio-system

Running

Run:

istio-cost-analyzer analyze
Flag Description Default Value
cloud Cloud on which your cluster is running (node info varies cloud to cloud). Options are gcp or aws. If you are on GCP or AWS, you don't need to set this as it is inferred. Inferred from Node info
prometheusNamespace Namespace in which the prometheus pod exists (you usually don't need to set this) istio-system
pricePath For non-standard aws/gcp rates (on-prem, negotiated rates). If you set this, you don't need to set cloud. See /pricing (you usually don't need to set this) None
details Extended table view that shows both destination and source workload/locality, instead of just source. false
start RFC3999 UTC timestamp that indicates from when to start analyzing data. 0 (beginning)
end RFC3999 UTC timestamp that indicates to when to stop analyzing data. time.Now()

The output should look like (without --details):

Total: <$0.01

SOURCE WORKLOAD	SOURCE LOCALITY	COST   
productpage-v1 	us-west1-b     	<$0.01	
reviews-v2     	us-west1-b     	-     	
reviews-v3     	us-west1-b     	-  

With --details:

Total: <$0.01

SOURCE WORKLOAD	SOURCE LOCALITY	DESTINATION WORKLOAD	DESTINATION LOCALITY	TRANSFERRED (MB)	COST   
productpage-v1 	us-west1-b     	details-v1          	us-west1-c          	0.173250        	<$0.01	
productpage-v1 	us-west1-b     	reviews-v1          	us-west1-b          	0.058500        	-     	
productpage-v1 	us-west1-b     	reviews-v2          	us-west1-b          	0.056250        	-     	
productpage-v1 	us-west1-b     	reviews-v3          	us-west1-b          	0.058500        	-     	
reviews-v2     	us-west1-b     	ratings-v1          	us-west1-b          	0.056150        	-     	
reviews-v3     	us-west1-b     	ratings-v1          	us-west1-b          	0.058400        	-    

Cleanup

If you want to restart installation of the tool or don't want it in your cluster anymore, you can run:

istio-cost-analyzer destroy

You must set the --analyzerNamespace flag if you set it in the setup command.

You must also edit your Istio Operator config to remove the custom prometheus metrics. (you can use -o to do that here, but it's unstable)

  • add for latency: