Kubernetes

Exploring Kubernetes networking and service discovery

Kubernetes networking
Written by MilanMaximo

When working with Kubernetes, it’s important to understand how networking and service discovery work.
Kubernetes networking is responsible for routing traffic between pods, while service discovery ensures that services can find each other and communicate. In this tutorial, we’ll cover the basics of Kubernetes networking and service discovery, including services, service types, and service discovery using DNS and environment variables.

What is a Service?

A service in Kubernetes is an abstraction that defines a logical set of pods and a policy by which to access them. Services enable pods to communicate with each other using stable IP addresses, even if the pods themselves are ephemeral and their IP addresses change over time. Services can also expose pods to the outside world, allowing external traffic to reach the pods.

Service Types

Kubernetes supports several types of services, including:

ClusterIP

A ClusterIP service is the default service type in Kubernetes. It exposes the service on a cluster-internal IP address, which is only accessible from within the cluster. This type of service is useful for communicating between pods within the same cluster.

NodePort

A NodePort service exposes the service on a port on each node in the cluster. This type of service is useful for accessing the service from outside the cluster.

LoadBalancer

A LoadBalancer service exposes the service on a cloud provider-specific load balancer. This type of service is useful for accessing the service from outside the cluster.

ExternalName

An ExternalName service maps a service to a DNS name. This type of service is useful for integrating with external services.

Service Discovery Using DNS

Kubernetes provides DNS-based service discovery, which allows services to discover each other using DNS names. When a service is created in Kubernetes, a DNS name is automatically created for it. The DNS name takes the form of [service-name].[namespace].svc.cluster.local, where [service-name] is the name of the service and [namespace] is the namespace in which the service is defined.

For example, if you create a service named my-service in the my-namespace namespace, the DNS name for the service would be my-service.my-namespace.svc.cluster.local. You can use this DNS name to communicate with the service from other pods in the same cluster.

Service Discovery Using Environment Variables

Kubernetes also provides service discovery using environment variables. When a container is started in a pod, Kubernetes sets environment variables that contain information about the service, including the service’s host and port. These environment variables can be used by the container to communicate with the service.

The environment variables take the form of [SERVICE_NAME]_SERVICE_HOST and [SERVICE_NAME]_SERVICE_PORT, where [SERVICE_NAME] is the name of the service. For example, if you create a service named my-service, the environment variables would be MY_SERVICE_HOST and MY_SERVICE_PORT.

Creating and Configuring Services

To create a service in Kubernetes, you need to create a service definition file in YAML format. The service definition file should specify the type of service, the ports that the service exposes, and the labels that select the pods to be included in the service. Here’s an example service definition file:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 80
    targetPort: 8080
  selector:
    app: my-app

In this example, we’re creating a ClusterIP service named my-service that exposes port 80 and targets port 8080 on the pods that are selected by the label app: my-app. Once you’ve created the service definition file, you can apply it to your cluster using the kubectl apply command:

kubectl apply -f my-service.yaml

This will create the service in your cluster and make it available to other pods.

Now you can check your service:

kubectl get services

or

kubectl get svc

Tips and Tricks

Here are some tips and tricks for working with networking and service discovery in a Kubernetes environment:

  • Use labels to select pods for your services. Labels allow you to define a logical grouping of pods and easily select them for inclusion in your services.
  • Use environment variables for service discovery in your containers. This makes it easy to write containerized applications that can discover and communicate with services.
  • NodePort or LoadBalancer services to expose services to the outside world. This allows external traffic to reach your pods.
  • The kubectl get endpoints command to view the IP addresses and ports of the pods that are included in your services.
  • Use the kubectl describe service command to view detailed information about your services, including their endpoints, DNS names, and labels.

Now let’s see how it is looks like in imperative

  1. Use labels to select pods for your services:

To add labels to an existing pod, you can use the kubectl label command:

kubectl label pods  app=my-app

To create a pod with labels, you can use the --labels flag:

kubectl run my-app --image=my-image --labels=app=my-app

To create a service with labels, you can use the --selector flag:

kubectl expose deployment my-app --port=80 --target-port=8080 --selector=app=my-app
  1. Use environment variables for service discovery in your containers:

To set environment variables in a pod, you can use the env field in the pod spec:

spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: DB_HOST
      value: my-db-service
  1. Use NodePort or LoadBalancer services to expose services to the outside world:

To create a NodePort service:

kubectl expose deployment my-app --port=80 --target-port=8080 --type=NodePort

To create a LoadBalancer service:

kubectl expose deployment my-app --port=80 --target-port=8080 --type=LoadBalancer
  1. Use the kubectl get endpoints command to view the IP addresses and ports of the pods that are included in your services:
kubectl get endpoints my-app

This will show you the IP addresses and ports of the pods that are included in the my-app service.

  1. Use the kubectl describe service command to view detailed information about your services, including their endpoints, DNS names, and labels:
kubectl describe service my-app

This will show you detailed information about the my-app service, including its endpoints, DNS names, and labels.ubernetes

Further Reading

If you want to dive deeper into Kubernetes networking and service discovery, here are some helpful resources:

I hope this post has been helpful in understanding Kubernetes networking and service discovery.
With these concepts in mind, you’ll be well on your way to building complex, distributed applications in Kubernetes.

Just practice!

About the author

MilanMaximo

Leave a Comment