Deploy the COS Lite observability stack on MicroK8s

Key Value
Summary Deploy the COS Lite observability stack on MicroK8s.
Categories deploy-applications
Difficulty 2
Author Leon Mintz


Duration: 1:00

The COS Lite bundle is a Juju-based observability stack, running on Kubernetes. The bundle consists of Prometheus, Loki, Alertmanager and Grafana.

This tutorial assumes you have a Juju controller bootstrapped on a MicroK8s cloud that is ready to use. A typical setup using snaps can be found in the Juju docs. Follow the instructions there to install Juju and MicroK8s.

Let’s go and deploy that bundle!

Configure MicroK8s

Duration: 2:00

For the COS Lite bundle deployment to go smoothly, make sure the following MicroK8s addons are enabled: dns, hostpath-storage and metallb.

You can check this with microk8s status, and if any are missing, enable them with

microk8s enable dns hostpath-storage

The bundle comes with Traefik to provide ingress, for which the metallb addon should be enabled:

IPADDR=$(ip -4 -j route | jq -r '.[] | select(.dst | contains("default")) | .prefsrc')
microk8s enable metallb:$IPADDR-$IPADDR

To wait for all the addons to be rolled out,

microk8s kubectl rollout status deployments/hostpath-provisioner -n kube-system -w
microk8s kubectl rollout status deployments/coredns -n kube-system -w
microk8s kubectl rollout status daemonset.apps/speaker -n metallb-system -w

If you have an HTTP proxy configured, you will need to give this information to MicroK8s. See the proxy docs for details.

By default, MicroK8s will use and as DNS servers, which can be adjusted. See the dns docs for details.

Deploy the COS Lite bundle

Duration: 5:00

It is usually a good idea to create a dedicated model for the COS Lite bundle. So let’s do just that and call the new model cos:

juju add-model cos
juju switch cos

Next, deploy the bundle with:

juju deploy cos-lite \
  --channel=edge \

Now you can sit back and watch the deployment take place:

watch --color juju status --color --relations

The status of your deployment should eventually be very similar to the following:

> juju status --relations
Model  Controller  Cloud/Region        Version  SLA          Timestamp
cos    charm-dev   microk8s/localhost  2.9.33   unsupported  16:00:00-00:00

App           Version  Status  Scale  Charm             Channel  Rev  Address         Exposed  Message
alertmanager           active      1  alertmanager-k8s  edge      28   no       
grafana                active      1  grafana-k8s       edge      39  no       
loki                   active      1  loki-k8s          edge      41  no       
prometheus    2.33.5   active      1  prometheus-k8s    edge      56  no       
traefik                active      1  traefik-k8s       edge      84    no       

Unit             Workload  Agent  Address     Ports  Message
alertmanager/0*  active    idle         
grafana/0*       active    idle         
loki/0*          active    idle         
prometheus/0*    active    idle         
traefik/0*       active    idle         

Relation provider                   Requirer                     Interface              Type     Message
alertmanager:alerting               loki:alertmanager            alertmanager_dispatch  regular  
alertmanager:alerting               prometheus:alertmanager      alertmanager_dispatch  regular  
alertmanager:grafana-dashboard      grafana:grafana-dashboard    grafana_dashboard      regular  
alertmanager:grafana-source         grafana:grafana-source       grafana_datasource     regular  
alertmanager:replicas               alertmanager:replicas        alertmanager_replica   peer     
alertmanager:self-metrics-endpoint  prometheus:metrics-endpoint  prometheus_scrape      regular  
grafana:grafana                     grafana:grafana              grafana_peers          peer     
loki:grafana-dashboard              grafana:grafana-dashboard    grafana_dashboard      regular  
loki:grafana-source                 grafana:grafana-source       grafana_datasource     regular  
loki:metrics-endpoint               prometheus:metrics-endpoint  prometheus_scrape      regular  
prometheus:grafana-dashboard        grafana:grafana-dashboard    grafana_dashboard      regular  
prometheus:grafana-source           grafana:grafana-source       grafana_datasource     regular  
prometheus:prometheus-peers         prometheus:prometheus-peers  prometheus_peers       peer     
traefik:ingress-per-unit            loki:ingress                 ingress_per_unit       regular  
traefik:ingress-per-unit            prometheus:ingress           ingress_per_unit       regular  
traefik:metrics-endpoint            prometheus:metrics-endpoint  prometheus_scrape      regular

Now COS Lite is good to go: you can relate software with it to begin the monitoring!

Alternatively, you may want to deploy the bundle with one or more of our readily available overlays, which is what we’ll cover next.

Deploy the COS Lite bundle with overlays

Duration: 2:00

An overlay is a set of model-specific modifications that avoid repetitive overhead in setting up bundles like COS Lite.

Specifically, we offer the following overlays:

You can apply the offers overlay do an existing COS Lite bundle by executing the juju deploy command. The storage-small overlay, however, is applicable only on the first deployment. So, if you were following the previous steps you would first need to switch to a new Juju model or remove all applications from the current one.

To use any of the overlays above, you need to include an --overlay argument per overlay (applied in order):

curl -L -O
curl -L -O

juju deploy cos-lite \
  --trust \
  --channel=edge \
  --overlay ./offers-overlay.yaml \
  --overlay ./storage-small-overlay.yaml

Browse dashboards

Duration: 2:00

When all the charms are deployed you can head over to browse their built-in web-UIs. You can find out their addresses from juju status, which should have a section similar to:

Unit              Workload  Agent  Address     Ports  Message
alertmanager/0*   active    idle         
grafana/0*        active    idle         
loki/0*           active    idle         
prometheus/0*     active    idle         

In this case, the dashboards would be something like:

  •, for alertmanager
  •, for grafana
  •, for prometheus

(Note: the IP addresses are almost certainly going to be different in your case.)


That’s all folks!

Congrats, you made it! You should now be able to easily:

  • deploy the COS Lite observability stack
  • augment the COS Lite bundle file with ready-made overlays
  • find the URLs of the web-UI dashboards

Next steps

Further readings

Last updated 3 days ago.