<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cherry Ghosh</title>
    <description>The latest articles on DEV Community by Cherry Ghosh (@cherry_ghosh_1ed2f396ad26).</description>
    <link>https://dev.to/cherry_ghosh_1ed2f396ad26</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3694127%2F388ff178-3c7b-4d1e-ba49-38c2bac478e2.jpg</url>
      <title>DEV Community: Cherry Ghosh</title>
      <link>https://dev.to/cherry_ghosh_1ed2f396ad26</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cherry_ghosh_1ed2f396ad26"/>
    <language>en</language>
    <item>
      <title>Securing a Civo K3s Cluster with Kuma Service Mesh(Baseline Implementation)</title>
      <dc:creator>Cherry Ghosh</dc:creator>
      <pubDate>Fri, 09 Jan 2026 12:21:29 +0000</pubDate>
      <link>https://dev.to/cherry_ghosh_1ed2f396ad26/securing-a-civo-k3s-cluster-with-kuma-service-meshbaseline-implementation-2jm</link>
      <guid>https://dev.to/cherry_ghosh_1ed2f396ad26/securing-a-civo-k3s-cluster-with-kuma-service-meshbaseline-implementation-2jm</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Service meshes are often considered to be too heavy, complex, and not needed when working with small Kubernetes clusters. Users who have already tried to implement Istio on limited infrastructure have known this fact well.&lt;/p&gt;

&lt;p&gt;This is a clean baseline implementation of the Kuma Service Mesh on a managed Civo K3s cluster, which focuses on zero-trust mTLS security and does not require application code changes. The layout forms a basis of advanced traffic and security control on later work. The K3s cluster was created using the Civo dashboard.The cluster itself is a mere infrastructure and all mesh capabilities are implemented inside Kubernetes.&lt;/p&gt;




&lt;h3&gt;
  
  
  Environment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Civo Kubernetes (K3s)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cluster:&lt;/strong&gt; 2-node managed cluster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Mesh:&lt;/strong&gt; Kuma 2.13.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Tools:&lt;/strong&gt; kubectl, kumactl (via WSL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo App:&lt;/strong&gt; Podinfo&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 1: Provisioning the Cluster on Civo
&lt;/h3&gt;

&lt;p&gt;A standard K3s cluster was created using the Civo dashboard.&lt;br&gt;
This cluster serves purely as infrastructure; all mesh functionality is deployed inside Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot:&lt;/strong&gt; Civo Kubernetes cluster overview showing nodes and status.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge4ocw5zj3ixuwegkm8y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge4ocw5zj3ixuwegkm8y.png" alt="Civo dashboard showing the kuma-demo Kubernetes cluster with two healthy K3s nodes" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Installing the Kuma Control Plane
&lt;/h3&gt;

&lt;p&gt;Kuma was installed using the official CLI, piping the generated manifest directly into Kubernetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kumactl &lt;span class="nb"&gt;install &lt;/span&gt;control-plane | kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, the control plane was verified in the &lt;code&gt;kuma-system&lt;/code&gt; namespace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot:&lt;/strong&gt; &lt;code&gt;kubectl get pods -n kuma-system&lt;/code&gt; showing &lt;code&gt;kuma-control-plane&lt;/code&gt; running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsteu5vxm71pxij1j0q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsteu5vxm71pxij1j0q7.png" alt="Terminal output showing kuma-control-plane pod running in the kuma-system namespace" width="800" height="49"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Onboarding Workloads with Sidecar Injection
&lt;/h3&gt;

&lt;p&gt;A dedicated namespace was created and labeled to enable automatic sidecar injection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create namespace kuma-demo
kubectl label namespace kuma-demo kuma.io/sidecar-injection&lt;span class="o"&gt;=&lt;/span&gt;enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Podinfo demo application was deployed and restarted to trigger Envoy sidecar injection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-n&lt;/span&gt; kuma-demo &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/stefanprodan/podinfo/master/kustomize/deployment.yaml
kubectl rollout restart deployment &lt;span class="nt"&gt;-n&lt;/span&gt; kuma-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each pod now runs with two containers: the application and the Kuma sidecar proxy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot:&lt;/strong&gt; &lt;code&gt;kubectl get pods -n kuma-demo&lt;/code&gt; showing &lt;code&gt;2/2 Ready&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9h2xco1qf71q5fk9o1j7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9h2xco1qf71q5fk9o1j7.png" alt="Terminal output showing podinfo pods running with two containers each after Kuma sidecar injection" width="800" height="88"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Enabling Zero-Trust mTLS
&lt;/h3&gt;

&lt;p&gt;By default, Kuma runs in permissive mode. Mutual TLS was enabled at the mesh level using a built-in CA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kuma.io/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mesh&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mtls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabledBackend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ca-1&lt;/span&gt;
    &lt;span class="na"&gt;backends&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ca-1&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;builtin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; mtls-policy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This enforces encrypted, authenticated communication between all services in the mesh.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Verifying the Mesh
&lt;/h3&gt;

&lt;p&gt;Workload registration was confirmed using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kumactl get dataplanes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Kuma Manager UI was accessed via port-forwarding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward svc/kuma-control-plane &lt;span class="nt"&gt;-n&lt;/span&gt; kuma-system 5681:5681
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the UI, the mesh status clearly shows &lt;strong&gt;mTLS enabled&lt;/strong&gt; and data plane proxies online.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kuma Manager overview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vk8swg9nffm1mknzpa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vk8swg9nffm1mknzpa4.png" alt="Kuma Manager dashboard showing one mesh, one service, and active data plane proxies" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mesh detail page showing &lt;code&gt;mTLS: builtin / ca-1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibvnao7k87oasyvxce63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibvnao7k87oasyvxce63.png" alt="Kuma mesh configuration page showing mTLS enabled using the built-in CA backend" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Observations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Kuma can easily be combined with lightweight K3s clusters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There was no need to make any changes to application code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Civo provides fast and predictable infrastructure that enables service mesh experimentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mesh level security is fully operated at the Kubernetes level without any reference to the user interface of the cloud provider.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In under an hour, it is possible to upgrade an unsecured Kubernetes cluster into a &lt;strong&gt;zero-trust, mTLS-enforced service mesh with Kuma&lt;/strong&gt; on Civo.&lt;/p&gt;

&lt;p&gt;This combination provides a great balance between simplicity, performance and security to developers working on smallto medium K3s clusters.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>kuma</category>
      <category>servicemesh</category>
      <category>k3s</category>
    </item>
  </channel>
</rss>
