Enabling external access to the Kubecost product requires exposing access to port 9090 on the kubecost-cost-analyzer pod. Exposing this endpoint will handle routing to Grafana as well. There are multiple ways to do this, including Ingress or Service definitions.
Please exercise caution when exposing Kubecost via an Ingress controller especially if there is no authentication in use. Consult your organization's internal recommendations.
Common samples below and others can be found on our GitHub repository.
# https://kubernetes.github.io/ingress-nginx/examples/auth/basic/apiVersion:v1data:auth:Zm9vOiRhcHIxJE9GRzNYeWJwJGNrTDBGSERBa29YWUlsSDkuY3lzVDAKkind:Secretmetadata:name:basic-authnamespace:defaulttype:Opaque---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:kubecost-ingress-tlsannotations:# type of authenticationnginx.ingress.kubernetes.io/auth-type:basic# name of the secret that contains the user/password definitionsnginx.ingress.kubernetes.io/auth-secret:basic-auth# message to display with an appropriate context why the authentication is requirednginx.ingress.kubernetes.io/auth-realm:'Authentication Required - kubecost'spec:ingressClassName:nginxrules: - host:kubecost.your.comhttp:paths: - path:/pathType:Prefixbackend:service:name:kubecost-cost-analyzerport:number:9090tls: - hosts: - kubecost.your.comsecretName:kubecost-tls # Use any cert tool/cert-manager or create manually: kubectl create secret tls kubecost-tls --cert /etc/letsencrypt/live/kubecost.your.com/fullchain.pem --key /etc/letsencrypt/live/kubecost.your.com/privkey.pem
When deploying Grafana on a non-root URL, you also need to update your grafana.ini to reflect this. More info can be found in values.yaml.
apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:kubecost-ingressannotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/enable-cors:"true"# remove path prefix from requests before sending to kubecost-frontendnginx.ingress.kubernetes.io/rewrite-target:/$2# add trailing slash to requests of indexnginx.ingress.kubernetes.io/configuration-snippet:| rewrite ^(/kubecost)$ $1/ permanent;spec:rules: - host:demo.kubecost.iohttp:paths:# serve kubecost from demo.kubecost.io/kubecost/ - path:/kubecost(/|$)(.*)pathType:ImplementationSpecificbackend:service:name:kubecost-cost-analyzer# should be configured if another helm name or service address is usedport:number:9090
ALB Example
Once an AWS Load Balancer (ALB) Controller is installed, you can use the following Ingress resource manifest pointed at the Kubecost cost-analyzer service: