Connecting Pods with Kubernetes Services

KubernetesKubernetesBeginner
Practice Now

Introduction

In Kubernetes, Pods are ephemeral and can be terminated and recreated at any time. This presents a challenge when it comes to networking, as it is difficult to connect to a Pod directly. To solve this problem, Kubernetes provides a higher-level abstraction called a Service. A Service provides a stable IP address and DNS name for a set of Pods, allowing other components to connect to them easily. In this lab, you will learn how to network Pods with Services in Kubernetes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/ConfigurationandVersioningGroup(["`Configuration and Versioning`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("`Describe`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("`Exec`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("`Expose`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/set("`Set`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("`Label`") kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") subgraph Lab Skills kubernetes/describe -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/exec -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/create -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/expose -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/get -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/set -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/apply -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/label -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} kubernetes/initialization -.-> lab-15815{{"`Connecting Pods with Kubernetes Services`"}} end

Start the Minikube Cluster

Before creating resources, you need a running Kubernetes cluster. Minikube is a lightweight Kubernetes environment that runs on your local machine.

  1. Navigate to your working directory:

    Open the terminal and navigate to the default project folder:

    cd /home/labex/project
  2. Start Minikube:

    Start Minikube to initialize a Kubernetes cluster:

    minikube start
    • This command sets up a single-node Kubernetes cluster on your local machine.
    • Minikube may take a few minutes to start depending on your system's performance.
  3. Verify Minikube is running:

    Check the status of the Minikube cluster:

    minikube status
    • Look for components like kubelet and apiserver listed as Running.
    • If the cluster is not running, rerun minikube start.

If you encounter issues starting Minikube. Use minikube delete to reset the environment if needed.

Create a Pod

The first step is to create a simple Pod. Create a file named /home/labex/project/myapp-pod.yaml with the following contents:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    app: nginx
spec:
  containers:
    - name: my-container
      image: nginx

Save the file and create the Pod by running the following command:

kubectl apply -f /home/labex/project/myapp-pod.yaml

This will create a Pod named my-pod-1 with a single container running the Nginx image.

Create a Service

The second step is to create a Service that targets the Pod you created in the previous step. Create a file named /home/labex/project/service.yaml with the following contents:

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

Save the file and create the Service by running the following command:

kubectl apply -f /home/labex/project/service.yaml

This will create a Service named my-service that targets Pods with the label app=nginx and exposes port 80.

Test the Service

The third step is to test the Service by accessing it from another Pod. Create a file named /home/labex/project/test-pod-1.yaml with the following contents:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-1
spec:
  containers:
    - name: my-container
      image: nginx
      command:
        - sleep
        - "3600"

Save the file and create the test Pod by running the following command:

kubectl apply -f /home/labex/project/test-pod-1.yaml

This will create a Pod named test-pod-1 with a single container running the Busybox image.

Next, you will exec into the container and use curl to access the Service. Run the following command to exec into the container:

kubectl exec -it test-pod-1 -- sh

This will open a shell inside the container. From the shell, run the following command to access the Service:

curl http://my-service

This will return the default Nginx page, indicating that the Service is working correctly.

Update the Service

The fourth step is to update the Service to target a different set of Pods. Update the selector field in the /home/labex/project/service.yaml file to the following:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: busybox
  ports:
    - name: http
      port: 80
      targetPort: 8

Save the file and update the Service by running the following command:

kubectl apply -f service.yaml

This will update the Service to target Pods with the label app=busybox.

Test the Updated Service

The fifth step is to test the updated Service by accessing it from another Pod. Create a new test Pod with the following command:

kubectl run my-pod-2 --image=nginx --restart=Never

This will create a new Pod named test-pod-2 with a single container running the Busybox image.

Exec into the container and use curl to access the Service as you did in Step 3. This time, you should get an error indicating that the connection was refused.

This is because the Service is now targeting a different set of Pods than the ones that the test Pod is running. To fix this, you can update the label of the Pod to match the new selector in the Service.

Run the following command to update the label of the test Pod:

kubectl label pod my-pod-2 app=busybox

This will add the label app=busybox to the test Pod.

Now, if you run the curl command again, you should get the default Nginx page, indicating that the Service is working correctly.

Summary

In this lab, you learned how to network Pods with Services in Kubernetes. You created a simple Pod running the Nginx image, created a Service to target the Pod, and tested the Service by accessing it from another Pod. You also learned how to update the Service to target a different set of Pods and how to update the label of a Pod to match the new selector in the Service. Services are an essential component of networking in Kubernetes and allow you to connect to Pods in a reliable and scalable way.

Other Kubernetes Tutorials you may like