( YAML Ain’t Markup Language) is a human readable data serialisation language used to create configuration files with any programming language. Kubernetes is an open source container orchestration system that uses YAML configuration files also known as manifests used to deploy different resources in Kubernetes . In this hands-on-lab we are going to explore YAML templates with examples.
What is a YAML File?
YAML stands for yet another markup language, or YAML ain't markup language. YAML is one of the most popular languages for writing configuration files, and developers use it to define and deploy resources such as pods, services, and deployment in Kubernetes.
YAML files either have the extension with .yaml or .yml .
YAML File Structure
YAML file is composed of a collection of data structures. It has the following components.
- Key-Value Pairs
- YAML Maps and YAML Lists
- YAML Indentation
- Merging YAML files
Example Configuration file in YAML structure
Kind: kind represents the type of Kubernetes object. From the above example, kind represents the Kubernetes Pod object.
Metadata: The field metadata used to organise and define the detailed information about one or more aspects of the specific object. We can also summarise the object and can easily track and work with specific objects.
Spec: The state we desire for the object. This field contains the details about the object. Kubernetes always try to make sure that at any point of time, the cluster current state is matching with the desired state. If we create any object in Kubernetes , we specify the desired state in the spec field in the YAML file.
The basic structure of a YAML file consists of key/value pairs. Each key-value pair is written as
key: value and is separated by colon
(:), where whitespace after the : is optional.
Maps are associated with a group of key-value pairs. Basically, whatever structure you want to put together, you can do it with those two structures. We might have maps of lists and lists of maps and so on.,
- maps of maps
- maps of lists
- lists of lists
- lists of maps
For example, you might have a config file that starts like this,
From the above example, we can see, we have two values,
Pod, mapped to two keys,
Let’s look at the following structures by creating a key that maps to another map:
we have a key(
metadata) with two other keys as its value
labels. The labels key itself has a map as its value app. You can nest these as far as you want to.
YAML lists are literally a sequence of objects. YAML Lists used to represent a list of items. Each item in the list is a list of key/value pairs.
You can have any number of items in a list, which is defined as items that start with a dash
(-) indented from the parent, this indicates the start of a document.
Let’s look at the pod.yaml file. Here, Members of the list can also be maps as:
Each container inside the
spec which consists of a
image, and a list of
ports. Each list item under ports itself is a map and also lists the containerPort and its values 80 and 88.
We structure the YAML document with indentation. The indentation level can be one or more spaces. Indentation is nothing but a blank space between a margin and the beginning of a line of text.
The number of spaces doesn’t matter, but make sure that the indented lines mentioned in the YAML file should be
CONSISTENT. So that the YAML processor knows how all of these lines relate to each other because we’ve indented the lines.
From the above pod.yaml file example , the
labels are at the same indentation level inside
metadata field, so the processor knows they’re both part of the same map, it knows that
app is a value for
labels because it’s indented further.
Because tabs are treated differently by different editors and tools.
Lines starts with
‘#’ are considered as comments. YAML file supports single line comments. These comments are ignored by YAML parsers.
YAML doesn’t support multi-line comments. Suppose we would like to comment on multiple lines in the YAML file, we have to start each commented line with a
Merging YAML files
A YAML file can contain one or more YAML documents. We can write multiple YAML files into a single YAML file. Each file is separated by three dashes
- - -and treated as a stand-alone unit.
Suppose I want to deploy any application , I need to write a deployment or service object for that , instead of having all of those in different files , we can have them in a single file.
Example: Create deployment.yaml with the following content:
Labels and Selectors in Kubernetes
Labels: Labels are nothing but Tagging our Pod. Labels are key-value pairs which you can assign to any objects like Deployments, Services and Pods in Kubernetes. They do not provide uniqueness. It is mostly built for the users to identify the objects very easily.
We can attach these labels at the creation time or at the runtime as well.
Selectors: Label Selectors are used to identify a set of objects easily. Selectors work like a filter, and we can get any details of Kubernetes objects.
From the above example of a deployment.yaml file, we have created the Deployment with labels (app: nginx) assigned to the object. The replica set can acquire a selected Pod mentioned in the
matchLabels. And that label selector must match the labels we defined in the template, i.e.,
spec.selector needs to match with at least one of the labels defined in the template.
Kubernetes API Objects
In Kubernetes we are going to communicate with API servers via CLI/API to work with different endpoints or objects like Pods, Nodes, Devices, Deployment etc., in the Kubernetes cluster. In the api server, we have core api groups and other api groups.
In Kubernetes everything is an object. If we look at any endpoints, they can be under the following versions, and these are the predefined endpoints to connect with.
The following output shows the different endpoints
- Beta(V1 beta 1)
Run the following command and the output shows the different endpoints:
For example, we would create a Deployment object , we would go and connect with
In the Deployment object, we can define the labels to our pod configuration.
As we know that, we have a
spec.selector and it is going to match with one of the labels defined in the labels section of the template. Instead of writing the labels again, we are going to refer to them by using the
We are going to use the
& symbol in the deployment.yaml file as looks like the following:
From the above Deployment object, we have given a reference name as
labelsTo Match with
& symbol and instead of writing the labels again to our Pod’s configuration, we can write a reference of those labels with a
So that we don't need to mention the labels again and this is basically used to avoid duplication.
In YAML, the string which doesn’t have a special meaning, we can write with quotes.
There are many types of strings used in YAML files for different purposes. For each use case, we can use quoting like single ('string')and double quoting("string").
For example: In the below yaml file,in the
env field of
NO will be treated as a boolean false value. To avoid that, use quotes
Why YAML Over JSON?
YAML is a superset of JSON. YAML is the most human-readable format, and JSON doesn’t allow comments, but YAML allows comments. Also, YAML uses indentation to define structure in the file, which is very helpful for one familiar with indentation style language like Python.
Configuration in YAML:
We will translate to this into JSON, it would look like this,
Linters are programs,used to check the quality of the code in a YAML file by displaying warnings and errors. It helps you to create a YAML configuration file for our Kubernetes cluster easily.
- For Online: https://www.yamllint.com/
- For offline: https://github.com/mikefarah/yq
- VS Code IDE Plugin: https://code.marketplace.visualstudio.com/iems?itemname=redhat.vscode.yaml
This article we have looked at gives an understanding about YAML templates with examples and also knows the configuration type information by using a combination of lists and maps in YAML file and how the YAML configuration file works in Kubernetes. I hope this article helped in better understanding of YAML Templates. Have a Happy Learning!.