<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deploy Tempo on Kubernetes on Grafana Labs</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/</link><description>Recent content in Deploy Tempo on Kubernetes on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>Deploy Tempo with Helm</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/helm-chart/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/helm-chart/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-tempo-with-helm&#34;&gt;Deploy Tempo with Helm&lt;/h1&gt;
&lt;p&gt;The Helm charts for Grafana Tempo and Grafana Enterprise Traces allows you to configure, install, and upgrade Grafana Tempo or Grafana Enterprise Traces within a Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;To deploy Tempo using the &lt;code&gt;tempo-distributed&lt;/code&gt; Helm chart, read the &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/get-started-helm-charts/&#34;&gt;Get started with Grafana Tempo using Helm&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;example-helm-chart&#34;&gt;Example Helm chart&lt;/h2&gt;
&lt;p&gt;The Tempo repository has an &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/helm&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;example Helm chart&lt;/a&gt; that shows a complete microservice-based deployment.&lt;/p&gt;
&lt;h2 id=&#34;helm-charts-for-deployment&#34;&gt;Helm charts for deployment&lt;/h2&gt;
&lt;p&gt;Tempo has two primary charts used for deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/tempo-distributed&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;tempo-distributed&lt;/code&gt; Helm chart&lt;/a&gt; deploys Tempo in microservices mode (&lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/get-started-helm-charts/&#34;&gt;read the documentation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/tempo&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;tempo&lt;/code&gt; Helm chart&lt;/a&gt; deploys Tempo in monolithic (single binary) mode&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="deploy-tempo-with-helm">Deploy Tempo with Helm&lt;/h1>
&lt;p>The Helm charts for Grafana Tempo and Grafana Enterprise Traces allows you to configure, install, and upgrade Grafana Tempo or Grafana Enterprise Traces within a Kubernetes cluster.&lt;/p></description></item><item><title>Deploy Tempo with Tempo Operator</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-tempo-with-tempo-operator&#34;&gt;Deploy Tempo with Tempo Operator&lt;/h1&gt;
&lt;p&gt;The Tempo Operator allows you to configure, install, upgrade, and operate Grafana Tempo on Kubernetes and OpenShift clusters.&lt;/p&gt;
&lt;p&gt;Some of the operator features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource Limits&lt;/strong&gt; - Specify overall resource requests and limits in the &lt;code&gt;TempoStack&lt;/code&gt; CR; the operator assigns fractions of it to each component&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AuthN and AuthZ&lt;/strong&gt; - Supports OpenID Control (OIDC) and role-based access control (RBAC)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed upgrades&lt;/strong&gt; - Updating the operator will automatically update all managed Tempo clusters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multitenancy&lt;/strong&gt; - Multiple tenants can send traces to the same Tempo cluster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mTLS&lt;/strong&gt; - Communication between the Tempo components can be secured via mTLS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaeger UI&lt;/strong&gt; - Traces can be visualized in Jaeger UI and exposed via Ingress or OpenShift Route&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt; - The operator and &lt;code&gt;TempoStack&lt;/code&gt; operands expose telemetry (metrics, traces) and integrate with Prometheus &lt;code&gt;ServiceMonitor&lt;/code&gt; and &lt;code&gt;PrometheusRule&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The source of the Tempo Operator can be found at &lt;a href=&#34;https://github.com/grafana/tempo-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;grafana/tempo-operator&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;p&gt;The operator can be installed from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo-operator/releases/latest/download/tempo-operator.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kubernetes manifest&lt;/a&gt; file on a Kubernetes cluster&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://operatorhub.io/operator/tempo-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;operatorhub.io&lt;/a&gt; on a Kubernetes cluster&lt;/li&gt;
&lt;li&gt;OperatorHub on an OpenShift cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;compatibility&#34;&gt;Compatibility&lt;/h2&gt;
&lt;h3 id=&#34;tempo&#34;&gt;Tempo&lt;/h3&gt;
&lt;p&gt;The supported Tempo version by the operator can be found in the &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/CHANGELOG.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;changelog&lt;/a&gt; or on the &lt;a href=&#34;https://github.com/grafana/tempo-operator/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;release page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kubernetes&#34;&gt;Kubernetes&lt;/h3&gt;
&lt;p&gt;The supported Kubernetes versions can be found in the &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/CHANGELOG.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;changelog&lt;/a&gt; or on the &lt;a href=&#34;https://github.com/grafana/tempo-operator/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;release page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;cert-manager&#34;&gt;cert-manager&lt;/h3&gt;
&lt;p&gt;The operator Kubernetes manifest installation files use cert-manger &lt;code&gt;v1&lt;/code&gt; custom resources to provision certificates for admission webhooks.&lt;/p&gt;
&lt;h2 id=&#34;community&#34;&gt;Community&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reach out to us on &lt;a href=&#34;https://grafana.slack.com/archives/C0414EUU39A&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#tempo-operator&lt;/a&gt; Grafana Slack channel.&lt;/li&gt;
&lt;li&gt;Participate on 
    &lt;a href=&#34;/docs/tempo/v2.10.x/community/&#34;&gt;Tempo community call&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="deploy-tempo-with-tempo-operator">Deploy Tempo with Tempo Operator&lt;/h1>
&lt;p>The Tempo Operator allows you to configure, install, upgrade, and operate Grafana Tempo on Kubernetes and OpenShift clusters.&lt;/p>
&lt;p>Some of the operator features are:&lt;/p></description></item><item><title>Deploy on Kubernetes with Tanka</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/tanka/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/tanka/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-on-kubernetes-with-tanka&#34;&gt;Deploy on Kubernetes with Tanka&lt;/h1&gt;
&lt;p&gt;Using this deployment guide, you can deploy Tempo to Kubernetes using a Jsonnet library and &lt;a href=&#34;https://tanka.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Tanka&lt;/a&gt; to create a development cluster or sand-boxed environment.
This procedure uses MinIO to provide object storage regardless of the cloud platform or on-premise storage you use.
In a production environment, you can use your cloud provider’s object storage service to avoid the operational overhead of running object storage in production.&lt;/p&gt;
&lt;p&gt;To set up Tempo using Kubernetes with Tanka, you need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configure Kubernetes and install Tanka&lt;/li&gt;
&lt;li&gt;Set up the Tanka environment&lt;/li&gt;
&lt;li&gt;Install libraries&lt;/li&gt;
&lt;li&gt;Deploy MinIO object storage&lt;/li&gt;
&lt;li&gt;Optional: Enable metrics-generator&lt;/li&gt;
&lt;li&gt;Deploy Tempo with the Tanka command&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This configuration isn&amp;rsquo;t suitable for a production environment but can provide a useful way to learn about Tempo.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;To deploy Tempo to Kubernetes with Tanka, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Kubernetes cluster with at least 40 CPUs and 46GB of memory for the default configuration. Small ingest or query volumes could use a far smaller configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt; (version depends upon the API version of Kubernetes in your cluster)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configure-kubernetes-and-install-tanka&#34;&gt;Configure Kubernetes and install Tanka&lt;/h2&gt;
&lt;p&gt;Follow these steps to configure Kubernetes and install Tanka.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new directory for the installation, and make it your current working directory:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir tempo
cd tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a Kubernetes namespace. You can replace the namespace&lt;code&gt;tempo&lt;/code&gt; in this example with a name of your choice.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl create namespace tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Grafana Tanka; refer to &lt;a href=&#34;https://tanka.dev/install&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Installing Tanka&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;jsonnet-bundler&lt;/code&gt;; refer to the &lt;a href=&#34;https://github.com/jsonnet-bundler/jsonnet-bundler/#install&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;jsonnet-bundler&lt;/code&gt; README&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;set-up-the-tanka-environment&#34;&gt;Set up the Tanka environment&lt;/h2&gt;
&lt;p&gt;Tanka requires the current context for your Kubernetes environment.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Check the current context for your Kubernetes cluster and ensure it&amp;rsquo;s correct:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl config current-context&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initialize Tanka. This uses the current Kubernetes context:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tk init --k8s=false
tk env add environments/tempo
tk env set environments/tempo \
 --namespace=tempo \
 --server-from-context=$(kubectl config current-context)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;install-libraries&#34;&gt;Install libraries&lt;/h2&gt;
&lt;p&gt;Install the &lt;code&gt;k.libsonnet&lt;/code&gt;, Jsonnet, and Memcachd libraries.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;k.libsonnet&lt;/code&gt; for your version of Kubernetes:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir -p lib
export K8S_VERSION=1.25
jb install github.com/jsonnet-libs/k8s-libsonnet/${K8S_VERSION}@main
cat &amp;lt;&amp;lt;EOF &amp;gt; lib/k.libsonnet
import &amp;#39;github.com/jsonnet-libs/k8s-libsonnet/${K8S_VERSION}/main.libsonnet&amp;#39;
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Tempo Jsonnet library and its dependencies.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;jb install github.com/grafana/tempo/operations/jsonnet/microservices@main&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Memcached library and its dependencies.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;jb install github.com/grafana/jsonnet-libs/memcached@master&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;deploy-minio-object-storage&#34;&gt;Deploy MinIO object storage&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://min.io&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO&lt;/a&gt; is an open source Amazon S3-compatible object storage service that is freely available and runs on Kubernetes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;minio.yaml&lt;/code&gt; and copy the following YAML configuration into it. You may need to remove/modify the &lt;code&gt;storageClassName&lt;/code&gt; depending on your Kubernetes platform. GKE, for example, may not support &lt;code&gt;local-path&lt;/code&gt; name but may support another option such as &lt;code&gt;standard&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # This name uniquely identifies the PVC. Will be used in deployment below.
  name: minio-pv-claim
  labels:
    app: minio-storage-claim
spec:
  # Read more about access modes here: http://kubernetes.io/docs/user-guide/persistent-volumes/#access-modes
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    # This is the request for storage. Should be available in the cluster.
    requests:
      storage: 50Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
spec:
  selector:
    matchLabels:
      app: minio
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        # Label is used as selector in the service.
        app: minio
    spec:
      # Refer to the PVC created earlier
      volumes:
        - name: storage
          persistentVolumeClaim:
            # Name of the PVC created earlier
            claimName: minio-pv-claim
      initContainers:
        - name: create-buckets
          image: busybox:1.28
          command:
            - &amp;#39;sh&amp;#39;
            - &amp;#39;-c&amp;#39;
            - &amp;#39;mkdir -p /storage/tempo-data&amp;#39;
          volumeMounts:
            - name: storage # must match the volume name, above
              mountPath: &amp;#39;/storage&amp;#39;
      containers:
        - name: minio
          # Pulls the default Minio image from Docker Hub
          image: minio/minio:latest
          args:
            - server
            - /storage
            - --console-address
            - &amp;#39;:9001&amp;#39;
          env:
            # Minio access key and secret key
            - name: MINIO_ACCESS_KEY
              value: &amp;#39;minio&amp;#39;
            - name: MINIO_SECRET_KEY
              value: &amp;#39;minio123&amp;#39;
          ports:
            - containerPort: 9000
            - containerPort: 9001
          volumeMounts:
            - name: storage # must match the volume name, above
              mountPath: &amp;#39;/storage&amp;#39;
---
apiVersion: v1
kind: Service
metadata:
  name: minio
spec:
  type: ClusterIP
  ports:
    - port: 9000
      targetPort: 9000
      protocol: TCP
      name: api
    - port: 9001
      targetPort: 9001
      protocol: TCP
      name: console
  selector:
    app: minio&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following command to apply the minio.yaml file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply --namespace tempo -f minio.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To check that MinIO is correctly configured, sign in to MinIO and verify that a bucket has been created. Without these buckets, no data will be stored.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Port-forward MinIO to port 9001:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt; kubectl port-forward --namespace tempo service/minio 9001:9001&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the MinIO admin bash using your browser: &lt;code&gt;http://localhost:9001&lt;/code&gt;. The sign-in credentials are username &lt;code&gt;minio&lt;/code&gt; and password &lt;code&gt;minio123&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that the Buckets page lists &lt;code&gt;tempo-data&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Tempo cluster using the MinIO object storage by updating the contents of the &lt;code&gt;environments/tempo/main.jsonnet&lt;/code&gt; file by running the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;jsonnet&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-jsonnet&#34;&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; environments/tempo/main.jsonnet
// The jsonnet file used to generate the Kubernetes manifests.
local tempo = import &amp;#39;microservices/tempo.libsonnet&amp;#39;;
local k = import &amp;#39;ksonnet-util/kausal.libsonnet&amp;#39;;
local container = k.core.v1.container;
local containerPort = k.core.v1.containerPort;

tempo {
    _images&amp;#43;:: {
        tempo: &amp;#39;grafana/tempo:latest&amp;#39;,
        tempo_query: &amp;#39;grafana/tempo-query:latest&amp;#39;,
    },

    tempo_distributor_container&amp;#43;:: container.withPorts([
            containerPort.new(&amp;#39;jaeger-grpc&amp;#39;, 14250),
            containerPort.new(&amp;#39;otlp-grpc&amp;#39;, 4317),
        ]),

    _config&amp;#43;:: {
        namespace: &amp;#39;tempo&amp;#39;,

        compactor&amp;#43;: {
            replicas: 1,
        },
        query_frontend&amp;#43;: {
            replicas: 2,
        },
        querier&amp;#43;: {
            replicas: 3,
        },
        ingester&amp;#43;: {
            replicas: 3,
            pvc_size: &amp;#39;10Gi&amp;#39;,
            pvc_storage_class: &amp;#39;standard&amp;#39;,
        },
        distributor&amp;#43;: {
            replicas: 3,
            receivers: {
                jaeger: {
                    protocols: {
                        grpc: {
                            endpoint: &amp;#39;0.0.0.0:14250&amp;#39;,
                        },
                    },
                },
                otlp: {
                    protocols: {
                        grpc: {
                            endpoint: &amp;#39;0.0.0.0:4317&amp;#39;,
                        },
                    },
                },
            },
        },

        metrics_generator&amp;#43;: {
            replicas: 1,
            ephemeral_storage_request_size: &amp;#39;10Gi&amp;#39;,
            ephemeral_storage_limit_size: &amp;#39;11Gi&amp;#39;,
            pvc_size: &amp;#39;10Gi&amp;#39;,
            pvc_storage_class: &amp;#39;standard&amp;#39;,
        },
        memcached&amp;#43;: {
            replicas: 3,
        },

        bucket: &amp;#39;tempo-data&amp;#39;,
        backend: &amp;#39;s3&amp;#39;,
    },

    tempo_config&amp;#43;:: {
        storage&amp;#43;: {
            trace&amp;#43;: {
                s3: {
                    bucket: $._config.bucket,
                    access_key: &amp;#39;minio&amp;#39;,
                    secret_key: &amp;#39;minio123&amp;#39;,
                    endpoint: &amp;#39;minio:9000&amp;#39;,
                    insecure: true,
                },
            },
        },
        metrics_generator&amp;#43;: {
            processor: {
                span_metrics: {},
                service_graphs: {},
            },

            registry&amp;#43;: {
                external_labels: {
                    source: &amp;#39;tempo&amp;#39;,
                },
            },
        },
        overrides&amp;#43;: {
            metrics_generator_processors: [&amp;#39;service-graphs&amp;#39;, &amp;#39;span-metrics&amp;#39;],
        },
    },

    tempo_ingester_container&amp;#43;:: {
      securityContext&amp;#43;: {
        runAsUser: 0,
      },
    },

    local statefulSet = $.apps.v1.statefulSet,
    tempo_ingester_statefulset&amp;#43;:
        statefulSet.mixin.spec.withPodManagementPolicy(&amp;#39;Parallel&amp;#39;),
}
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;optional-enable-metrics-generator&#34;&gt;Optional: Enable metrics-generator&lt;/h3&gt;
&lt;p&gt;In the preceding configuration, 
    &lt;a href=&#34;/docs/tempo/v2.10.x/configuration/#metrics-generator&#34;&gt;metrics generation&lt;/a&gt; is enabled. However, you still need to specify where to send the generated metrics data.
If you&amp;rsquo;d like to remote write these metrics onto a Prometheus compatible instance (such as Grafana Cloud metrics or a Mimir instance), you&amp;rsquo;ll need to include the configuration block below in the &lt;code&gt;metrics_generator&lt;/code&gt; section of the &lt;code&gt;tempo_config&lt;/code&gt; block above (this assumes basic auth is required, if not then remove the &lt;code&gt;basic_auth&lt;/code&gt; section).
You can find the details for your Grafana Cloud metrics instance for your Grafana Cloud account by using the &lt;a href=&#34;/docs/grafana-cloud/account-management/cloud-portal/&#34;&gt;Cloud Portal&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;jsonnet&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-jsonnet&#34;&gt;storage&amp;#43;: {
    remote_write: [
        {
            url: &amp;#39;https://&amp;lt;urlForPrometheusCompatibleStore&amp;gt;/api/v1/write&amp;#39;,
            send_exemplars: true,
            basic_auth: {
                username: &amp;#39;&amp;lt;username&amp;gt;&amp;#39;,
                password: &amp;#39;&amp;lt;password&amp;gt;&amp;#39;,
            },
        }
    ],
},
```



&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Enabling metrics generation and remote writing them to Grafana Cloud Metrics produces extra active series that could potentially impact your billing. For more information on billing, refer to &lt;a href=&#34;/docs/grafana-cloud/billing-and-usage/&#34;&gt;Billing and usage&lt;/a&gt;. For more information on metrics generation, refer the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/metrics-from-traces/metrics-generator/&#34;&gt;Metrics-generator documentation&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;


### Optional: Reduce component system requirements

Smaller ingestion and query volumes could allow the use of smaller resources. If you wish to lower the resources allocated to components, then you can do this via a container configuration. For example, to change the CPU and memory resource allocation for the ingesters.

To change the resources requirements, follow these steps:

1. Open the `environments/tempo/main.jsonnet` file.
2. Add a new configuration block for the appropriate component (in this case, the ingesters):
   ```jsonnet
   tempo_ingester_container&amp;#43;:: {
       resources&amp;#43;: {
           limits&amp;#43;: {
               cpu: &amp;#39;3&amp;#39;,
               memory: &amp;#39;5Gi&amp;#39;,
           },
           requests&amp;#43;: {
               cpu: &amp;#39;200m&amp;#39;,
               memory: &amp;#39;2Gi&amp;#39;,
           },
       },
   },&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Save the changes to the file.&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Lowering these requirements can impact overall performance.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;deploy-tempo-using-tanka&#34;&gt;Deploy Tempo using Tanka&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Deploy Tempo using the Tanka command:

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tk apply environments/tempo/main.jsonnet&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;If the ingesters don’t start after deploying Tempo with the Tanka command, this may be related to the storage class selected for the Write Ahead Logs. If this is the case, add an appropriate storage class to the ingester configuration. For example, to add a standard instead of fast storage class, add the following to the &lt;code&gt;config&lt;/code&gt; (not &lt;code&gt;tempo_config&lt;/code&gt;) section in the previous step:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;  ingester&amp;#43;: {
    pvc_storage_class: &amp;#39;standard&amp;#39;,
  },&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;The Tempo instance will now accept the two configured trace protocols (OTLP gRPC and Jaeger gRPC) via the distributor service at &lt;code&gt;distributor.tempo.svc.cluster.local&lt;/code&gt; on the relevant ports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OTLP gRPC: &lt;code&gt;4317&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jaeger gRPC: &lt;code&gt;14250&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can query Tempo using the &lt;code&gt;query-frontend.tempo.svc.cluster.local&lt;/code&gt; service on port &lt;code&gt;3200&lt;/code&gt; for Tempo queries or port &lt;code&gt;16686&lt;/code&gt; or &lt;code&gt;16687&lt;/code&gt; for Jaeger type queries.&lt;/p&gt;
&lt;p&gt;Now that you&amp;rsquo;ve configured a Tempo cluster, you&amp;rsquo;ll need to validate your deployment.
Refer to the 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/test/set-up-test-app/&#34;&gt;Validate Kubernetes deployment using a test application&lt;/a&gt; for instructions.&lt;/p&gt;
]]></content><description>&lt;h1 id="deploy-on-kubernetes-with-tanka">Deploy on Kubernetes with Tanka&lt;/h1>
&lt;p>Using this deployment guide, you can deploy Tempo to Kubernetes using a Jsonnet library and &lt;a href="https://tanka.dev" target="_blank" rel="noopener noreferrer">Grafana Tanka&lt;/a> to create a development cluster or sand-boxed environment.
This procedure uses MinIO to provide object storage regardless of the cloud platform or on-premise storage you use.
In a production environment, you can use your cloud provider’s object storage service to avoid the operational overhead of running object storage in production.&lt;/p></description></item></channel></rss>