DEV Community

Cover image for Advanced Kubernetes Networking: Implementing Service Mesh with Linkerd for Zero Trust Security
mark mwendia
mark mwendia

Posted on

Advanced Kubernetes Networking: Implementing Service Mesh with Linkerd for Zero Trust Security

The Case for Zero Trust Security:
In modern cloud-native architectures, Kubernetes has become the go-to platform for running and scaling microservices. But with its widespread adoption comes the challenge of securing complex, distributed systems. Traditional security approaches, which rely heavily on network perimeters and trust assumptions, are no longer enough. This is where Zero Trust Security comes into play—a model that assumes no part of the network is inherently trusted, and every request, communication, or access must be authenticated and authorized.

In Kubernetes, one of the most effective ways to implement Zero Trust Security is by using a Service Mesh. A service mesh allows microservices to communicate securely with each other, handling concerns such as service discovery, load balancing, and mutual TLS (mTLS) for encryption between services.

In this article, we’ll explore Linkerd, a lightweight service mesh, and walk through how to use it to implement Zero Trust Security for your Kubernetes environment.

Prerequisites

Before diving into Linkerd and Zero Trust Security, ensure you have the following:

  • Basic Kubernetes Knowledge: Familiarity with Kubernetes concepts such as pods, services, and namespaces.
  • Kubernetes Cluster: A running Kubernetes cluster. This can be on any platform (AWS, GCP, Azure, or even Minikube for local testing).
  • kubectl Installed: The Kubernetes command-line tool (kubectl) should be configured to access your cluster.
  • Helm: Install Helm, a package manager for Kubernetes, which simplifies the installation of Linkerd and other tools.
  • Linkerd CLI: The Linkerd command-line tool should be installed on your machine.

What is a Service Mesh?

A service mesh is an infrastructure layer for controlling service-to-service communication within a microservices architecture. It manages traffic between services, automatically applying security, observability, and reliability policies. Linkerd achieves this by injecting lightweight sidecar proxies into each pod that intercept and manage all incoming and outgoing requests.

Why Linkerd?

There are several service mesh options available, such as Istio, Consul, and AWS App Mesh, but Linkerd stands out for its simplicity, performance, and security focus. It provides built-in Zero Trust capabilities like mTLS (mutual Transport Layer Security) to encrypt communication between services. Additionally, Linkerd is lightweight and designed with operational simplicity in mind, making it an excellent choice for Kubernetes users who need security without excessive complexity.

Step 1: Installing Linkerd on Your Kubernetes Cluster

To get started, we first need to install Linkerd on our Kubernetes cluster. Linkerd can be installed using its CLI, or with Helm for more complex installations.

Installing Linkerd CLI
Run the following commands to install the Linkerd CLI:



Copy code
# Download and install the CLI
curl -sL https://run.linkerd.io/install | sh

# Add the Linkerd CLI to your PATH
export PATH=$PATH:$HOME/.linkerd2/bin

# Verify the installation
linkerd version


Enter fullscreen mode Exit fullscreen mode

This should show the installed version of the CLI.

Installing Linkerd on Kubernetes
Now that the CLI is installed, you can run the following commands to install Linkerd into your Kubernetes cluster:



Copy code
# Validate that your cluster is ready for Linkerd
linkerd check --pre

# Install Linkerd control plane
linkerd install | kubectl apply -f -

# Verify that the control plane is successfully installed
linkerd check


Enter fullscreen mode Exit fullscreen mode

This will deploy the Linkerd control plane into your Kubernetes cluster, consisting of several components that handle proxy injection, metrics, and more.

Step 2: Enabling mTLS for Zero Trust Security

By default, Linkerd encrypts traffic between all services using mutual TLS (mTLS). This ensures that all service-to-service communication is encrypted, and both the client and server are authenticated.

To demonstrate mTLS in action, let’s deploy a simple Kubernetes application and "mesh" it with Linkerd.

Example Application: Deploying a Simple Web App
First, we’ll deploy a basic web application with a frontend and backend:



# frontend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    app: frontend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80


Enter fullscreen mode Exit fullscreen mode


# backend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  labels:
    app: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: hashicorp/http-echo
        args:
        - "-text=hello from the backend"
        ports:
        - containerPort: 5678


Enter fullscreen mode Exit fullscreen mode

Apply these files to your cluster:



kubectl apply -f frontend.yaml
kubectl apply -f backend.yaml


Enter fullscreen mode Exit fullscreen mode

Injecting Linkerd Proxies into the Application

To enable Linkerd's mTLS, we need to inject its sidecar proxies into our application’s pods. Linkerd can do this automatically during deployment or after the fact.



# Inject the Linkerd sidecar into the frontend and backend deployments
kubectl get -n default deploy -o yaml | linkerd inject - | kubectl apply -f -


Enter fullscreen mode Exit fullscreen mode

Verifying mTLS

You can use the linkerd viz extension to visualize the encrypted traffic between the frontend and backend:



# Install Linkerd viz extension
linkerd viz install | kubectl apply -f -

# View the dashboard
linkerd viz dashboard


Enter fullscreen mode Exit fullscreen mode

In the Linkerd dashboard, you should see that all traffic between the frontend and backend services is encrypted with mTLS.

Step 3: Implementing Policy for Zero Trust

Linkerd allows you to enforce Zero Trust policies by controlling which services can communicate with each other. You can use ServiceProfiles to define fine-grained communication rules between services.

Defining a Service Profile

Let’s define a service profile for the backend service, restricting which services are allowed to send requests.



# backend-service-profile.yaml
apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: backend.default.svc.cluster.local
  namespace: default
spec:
  routes:
  - name: GET /
    condition:
      pathRegex: "/"
    isRetryable: true


Enter fullscreen mode Exit fullscreen mode

Apply the service profile:



kubectl apply -f backend-service-profile.yaml


Enter fullscreen mode Exit fullscreen mode

This profile restricts which paths are accessible on the backend service. You can define more specific rules to control traffic flow between services in your mesh.

Step 4: Monitoring and Observability with Linkerd

Security without visibility can create blind spots. Fortunately, Linkerd provides built-in observability features, including:

  • Golden Metrics: Success rate, request volume, and latency for each service.
  • Tap: Real-time inspection of live requests between services.
  • Grafana Dashboards: Pre-built dashboards to monitor mesh traffic. You can access these features through the Linkerd CLI or the dashboard.


# Tap into live traffic between frontend and backend
linkerd viz tap deploy/frontend

# View Grafana dashboards
linkerd viz dashboard


Enter fullscreen mode Exit fullscreen mode

These tools help you monitor traffic patterns, detect security incidents, and troubleshoot network issues.

Step 5: Scaling Zero Trust with Linkerd

Once you have Linkerd running in your cluster with mTLS enabled, you can extend it to a larger-scale production environment. Key considerations include:

  • Automated Proxy Injection: Use admission controllers to automatically inject Linkerd proxies into new deployments, ensuring that all services are secured without manual intervention.
  • Namespace Isolation: Use Kubernetes namespaces to segment services by environment (e.g., dev, staging, production) and apply different security policies per namespace.
  • External Services: Extend Zero Trust to external services by using Linkerd's ingress and egress policies.

Conclusion

As microservices architectures grow in complexity, securing service-to-service communication becomes more critical. Linkerd provides a lightweight yet powerful solution to implement Zero Trust Security in your Kubernetes environment, ensuring that all communication is encrypted, authenticated, and authorized.

With features like automatic mTLS, policy enforcement, and built-in observability, Linkerd not only strengthens your security posture but also simplifies the management of secure networking. By following the steps in this guide, you can take your Kubernetes networking to the next level with Linkerd's Zero Trust approach.

Further Reading:

  • Linkerd Documentation
  • Zero Trust Security

Top comments (0)