Kubernetes Series Part 3: YAML - Your Kubernetes Configuration Language

Table of Contents

Kubernetes Series Part 3: YAML - Your Kubernetes Configuration Language

Welcome back to our Kubernetes journey! This time, we’ll level up our Kubernetes skills by diving into YAML – the language of choice for defining and managing your Kubernetes resources.

Why YAML for Kubernetes?

YAML (YAML Ain’t Markup Language) is a human-readable data serialization language. It’s often preferred for configuration files due to its clean syntax and ease of use.

Here’s why YAML shines in the Kubernetes world:

  • Declarative Configuration: YAML allows you to describe the desired state of your applications and resources. Kubernetes takes care of figuring out how to make that happen.

  • Version Control: YAML files are plain text, making them easy to track changes, collaborate on, and manage using version control systems like Git.

  • Reproducibility: YAML configurations ensure consistency and make it simple to recreate your Kubernetes deployments across different environments.

YAML Basics: Structure and Syntax

Let’s break down the fundamental elements of YAML:

  • Key-Value Pairs: YAML uses indentation to define structure. Key-value pairs are the building blocks, where a key is followed by a colon (:) and then the value.

  • Indentation Matters: Consistent indentation (usually two spaces) is crucial for defining the hierarchy and relationships between elements.

  • Lists and Maps: YAML supports lists (denoted by -) and maps (key-value pairs within a set of curly braces {}) for organizing data.

Example:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

hands-on Labs

Before we begin, let’s clean up any resources from our previous labs to start with a clean slate:

kubectl delete deployments --all
kubectl delete services --all

Remember the hands-on labs from Part 2? Let’s see how to achieve the same results using YAML configurations:

Lab 1: Deploy Nginx with Deployments

Part 2 Command:

kubectl create deployment nginx-deployment --image=nginx:latest --replicas=1

YAML Equivalent (nginx-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

To apply this configuration:

kubectl apply -f nginx-deployment.yaml

Lab 2: Expose Nginx with Services

Part 2 Command:

kubectl expose deployment nginx-deployment --type=ClusterIP --port=80 --target-port=80

YAML Equivalent (nginx-service.yaml):

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    name: http
  type: ClusterIP

To apply this configuration:

kubectl apply -f nginx-service.yaml

Lab 3: Scale Nginx to Handle Increased Traffic

Part 2 Command:

kubectl scale deployment nginx-deployment --replicas=2

YAML Equivalent (nginx-deployment.yaml):

You can directly modify the repilcas field in your nginx-deployment.yaml file and then apply the changes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2 # Update the replica count here
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

To apply the updated configuration:

kubectl apply -f nginx-deployment.yaml

Lab 4: Performing Rolling Updates

Part 2 Command:

kubectl set image deployment/nginx-deployment nginx=nginx:stable-perl

YAML Equivalent (nginx-deployment.yaml):

Similar to scaling, you can update the image field in your nginx-deployment.yaml and apply the changes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:stable-perl # Update the image tag here

To apply the updated configuration:

kubectl apply -f nginx-deployment.yaml