--- myst: html_meta: "description": "Build a minimal integration chart with cdk8s-monitoring, synthesize the manifests, and deploy the monitoring stack to a test cluster." "property=og:description": "Build a minimal integration chart with cdk8s-monitoring, synthesize the manifests, and deploy the monitoring stack to a test cluster." "property=og:title": "Quick start" "keywords": "cdk8s, Kubernetes, monitoring, quick start, synth, deploy" --- # Quick start In this tutorial you build a tiny integration chart with `@bluedynamics/cdk8s-monitoring`, synthesize it into Kubernetes manifests, and deploy the stack to a test cluster. By the end you will have Prometheus, Grafana, Loki, Alloy, and Thanos running, and you will understand how a cluster supplies its own configuration to the shared stack. The dish you cook here is a working stack. The skills you take away are how to provide required cluster values, how `mergeConfig` fills in the defaults, and how the manifests reach the cluster through sync waves. ## Before you start You need a cluster with the stack prerequisites already in place. Setting them up is a separate task, so follow {doc}`../how-to/setup-prerequisites` first if you have not. You also need Node.js and the cdk8s CLI, covered in the same guide. This tutorial deploys real workloads with persistent volumes. Use a test cluster, not production. ## Step 1: Create the project Create an empty directory and initialize a TypeScript cdk8s app. ```shell mkdir monitoring-quickstart cd monitoring-quickstart cdk8s init typescript-app ``` Notice that cdk8s generates a `main.ts`, a `package.json`, and an `imports/` directory. You will replace the contents of `main.ts` in a moment. ## Step 2: Install the library Add the construct library and its peer dependencies. ```shell npm install @bluedynamics/cdk8s-monitoring cdk8s cdk8s-plus-33 constructs ``` ## Step 3: Write the integration chart Replace the contents of `main.ts` with the minimal integration below. ```typescript import { App } from 'cdk8s'; import { MonitoringChart, mergeConfig } from '@bluedynamics/cdk8s-monitoring'; const app = new App(); const config = mergeConfig({ namespace: 'monitoring', clusterName: 'example', domains: { grafana: 'grafana.example.com' }, s3: { endpoint: 'https://s3.example.com', endpointNoProtocol: 's3.example.com', region: 'eu', buckets: { thanos: 'example-thanos', loki: 'example-loki' }, }, smtp: { host: 'mail.example.com', port: 587, from: 'monitoring@example.com', requireTls: true, }, integrations: { s3ProviderConfig: 'my-s3-provider', s3SecretStore: 'my-s3-secret-store', s3CredentialsKey: 'my-s3-credentials', grafanaSecretStore: 'my-app-secret-store', grafanaCredentialsKey: 'my-grafana-admin', }, }); new MonitoringChart(app, 'monitoring', config); app.synth(); ``` Replace the `integrations` names with the Crossplane provider config and External Secrets stores your cluster actually has; see {doc}`../how-to/configure-s3-credentials`. Notice that you provide only the six cluster-specific fields: `namespace`, `clusterName`, `domains`, `s3`, `smtp`, and `integrations`. You do not set any versions, retention, storage, replicas, or resources. `mergeConfig` fills those in from the package defaults, so this short input is a complete configuration. ## Step 4: Synthesize the manifests Run the cdk8s synth step. ```shell npx cdk8s synth ``` You should see a new `dist/` directory with a YAML file for the `monitoring` chart. Open it and notice that every resource carries an `argocd.argoproj.io/sync-wave` annotation. The values run from `0` to `3`, which is how the stack orders its own rollout. ## Step 5: Deploy the stack Apply the synthesized manifest. ```shell kubectl apply -f dist/monitoring.k8s.yaml ``` The manifest contains Crossplane and External Secrets resources, Helm chart resources, and plain Kubernetes objects. The cluster controllers reconcile them, so the stack comes up over a few minutes rather than instantly. ## Step 6: Watch it come up Watch the pods in the monitoring namespace. ```shell kubectl get pods -n monitoring --watch ``` You will see Prometheus, Grafana, Alertmanager, the Loki components, Alloy, and the three Thanos workloads appear and move to `Running`. Once Grafana is ready, open it through your ingress to confirm the stack is live. ## What you built You wrote a complete integration chart in a few lines, synthesized it, and deployed a full monitoring stack. You saw that the library carries every default, so an integration chart only supplies what is unique to its cluster. ## Next steps - {doc}`../how-to/provide-config` — turn this throwaway script into a maintainable integration chart. - {doc}`../how-to/add-app-dashboards` — attach your own dashboards to the running Grafana. - {doc}`../explanation/architecture` — understand the components you just deployed.