Before diving in, let’s look at some of the basic building blocks that you have to work with from the Kubernetes API:
- A Node is a worker machine provisioned to run Kubernetes. Each Node is managed by the Kubernetes master.
 - A Pod is a logical, tightly-coupled group of application containers that run on a Node. Containers in a Pod are deployed together and share resources (like data volumes and network addresses). Multiple Pods can run on a single Node.
 - A Service is a logical set of Pods that perform a similar function. It enables load balancing and service discovery. It’s an abstraction layer over the Pods; Pods are meant to be ephemeral while services are much more persistent.
 - Deployments are used to describe the desired state of Kubernetes. They dictate how Pods are created, deployed, and replicated.
 - Labels are key/value pairs that are attached to resources (like Pods) which are used to organize related resources. You can think of them like CSS selectors. For example:
 - Environment - dev, test, prod
 - App version - beta, 1.2.1
 - Type - client, server, db
 - Ingress is a set of routing rules used to control the external access to Services based on the request host or path.
 - Volumes are used to persist data beyond the life of a container. They are especially important for stateful applications like Redis and Postgres.
 - A PersistentVolume defines a storage volume independent of the normal Pod-lifecycle. It’s managed outside of the particular Pod that it resides in.
 - A PersistentVolumeClaim is a request to use the PersistentVolume by a user.