Getting Started: Pod, Replicaset and Deployment in Kubernetes

oayanda

Israel .O. Ayanda

Posted on February 15, 2023

Getting Started: Pod, Replicaset and Deployment in Kubernetes

This is a quick tutorial is meant to explore some common objects in kubernetes.

let's begin!

Kubernetes

Kubernetes, also known as K8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

Prerequisites

  • Basic understanding of docker or containers

Pods

A pod is the smallest unit of kubernete cluster. It has a one to one relationship with a container. This means a pod should only hold one container. However, in some case, a pod can hold more than one related containers. To deploy an object in k8s, YAML file manifest is required with specific sections.

Let's explore how to deploy a simple nginx pod.

Deploying a Nginx Pod

Create pod manifest yaml file - nginx-pod.yaml

# Kubernetes api version
apiVersion: v1

# Type of kubernetes object to created
kind: Pod

# Provides information about the resource like name, label
metadata:
 name: nginx-pod
 labels:
  apps: nginx-pod

# Consists of the core information about Pod
spec:
 containers:
  - image: nginx:latest
    name: nginx-pod
    ports:
     - containerPort: 80
       protocol: TCP
Enter fullscreen mode Exit fullscreen mode
# Use this shortcut for typing kubectl all time
alias k=kubectl
Enter fullscreen mode Exit fullscreen mode
# Create a nginx pod
k create -f nginx-pod.yaml

# View the created pod
k get pods
Enter fullscreen mode Exit fullscreen mode

pods

# Get more information about the pod
k describe pod nginx-pod
or 
k get pod nginx-pod -o yaml
Enter fullscreen mode Exit fullscreen mode

The nginx image used in the yaml file is was pull from the docker hub, in some cases the intended repo is explicitly stated.

The nginx pod is created, but it can not be viewed in the browser. Another Kubernetes object called Service is required to expose to the Pod.

pods

Although, not reliable because of the ephemeral nature of pods, but for internal use only the container can be viewed by using a curl container dareyregistry/curl

# Run kubectl to connect inside the container
kubectl run curl --image=dareyregistry/curl -i --tty

# Type curl and your container's ip
 curl -v 10.244.0.40:80
Enter fullscreen mode Exit fullscreen mode

pods

Service

An abstract way to expose an application running on a set of Pods as a network service.

The Service manifest file fields are similar to that of the Pod. Let's take a look.

Create a yaml file for Service - nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    name: nginx-service
    app: server-service
spec:
  selector:
    app: nginx-pod
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
Enter fullscreen mode Exit fullscreen mode

Note the selector field, this must be same as the labels (in this case, app: nginx-pod) in the pod manifest file. This help the service object to map to particular object since they may be many pod running at any particular instance. The targetPort is set to the same value as the port field. Additionally, the Service object can also use a nodePort field to expose the Pod externally, we will see this later.

# Create service for nginx
k apply -f nginx-service.yaml

# forward the port of the service to free port on your machine localhost
k port-forward svc/nginx-service 8089:80

Enter fullscreen mode Exit fullscreen mode

replicaset

Verify in the browser

browser

# Clean up service
k delete svc nginx-service

# clean up pod
k delete po nginx-pod
## ReplicaSet
Enter fullscreen mode Exit fullscreen mode

A ReplicaSet's purpose is to maintain a stable set of replica Pods running at any given time. As such, it is often used to guarantee the availability of a specified number of identical Pods.

The child field matchLabels of the selector field is used to identify the pod and a replica field is used to indicate how many pods should be maintained. It uses the template field to specify the data for the new Pod(s) it should create when scaling up or to meet the number of replicas criteria.

Let's see this in action

Create a replicaset manifest yaml file - rs.yaml

#Part 1
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod

#Part 2
  template:
    metadata:
      name: nginx-pod
      labels:
         app: nginx-pod
    spec:
      containers:
      - image: nginx:latest
        name: nginx-pod
        ports:
        - containerPort: 80
          protocol: TCP
Enter fullscreen mode Exit fullscreen mode
# Create replicaset for ngix pod. 
k create -f rs.yaml

# View replicaset
k get rs

# View pods created by replicaset
k get pods

# Delete one of the pods
k delete po nginx-rs-2czdx

Enter fullscreen mode Exit fullscreen mode

deployments

Notice replica is set to 3, hence the 3 pods. If a pod is terminates, it recreates another pod from the configuration stated in the template field hence, it will always maintain 3 available pods unless specified otherwise.

# Clean up
k delete rs nginx-rs
Enter fullscreen mode Exit fullscreen mode

Deployment

A Deployment is another layer above ReplicaSets and Pods, newer and more advanced level concept than ReplicaSets. It manages the deployment of ReplicaSets and allows for easy updating of a ReplicaSet as well as the ability to roll back to a previous version of deployment. It is declarative and can be used for rolling updates of micro-services, ensuring there is no downtime.

Officially, it is highly recommended to use Deplyments to manage replica sets rather than using replica sets directly.

The manifest file for a deployment looks similar to a replicaset but the kind is deployment.

Create a deployment manifest yaml file - deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
Enter fullscreen mode Exit fullscreen mode
# Create deployment
k create -f deployment.yaml

# view deployment, replicaset and pods
k get deploy,rs,pod

Enter fullscreen mode Exit fullscreen mode

deployments

# Clean up
k delete deploy nginx-deployment
Enter fullscreen mode Exit fullscreen mode

As always, I look forward to getting your thoughts on this tutorial. Please feel free to leave a comment!

Read here for more additional resources

💖 💪 🙅 🚩
oayanda
Israel .O. Ayanda

Posted on February 15, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related