☸️ Kubernetes - Objects / Resources
Kubernetes objects are persistent entities in the Kubernetes system. Objects are used to represent the desired and current state of your cluster.
- What applications (pods) are running on which machines (nodes)?
- How much resources have been allocated for the applications and how much is left?
- Policies how the application behave.
Resource Types TL;DR:
container = a process
pod = an application
deployment = a managed application
service = an internal address
ingress = an external address
configmap = visible environment variables
secret = hidden environment variables
volume = a persistent file storage
You create, modify and delete objects through Kubernetes API. The underlying API is REST but there are wrapper libraries for many languages.
Every object includes two nested fields; object spec and object status. Object spec is the desired state that you provide + default values. Object status is the actual state of the object that Kubernetes system maintains.
Kubernetes deployment object:
Spec: I want 3 instances of my application running:
Status: We have 0 of such instances running so we will start 3 new ones.
# if any of the instances fail, status updates and a new instance is created
# so the spec and status are in sync
The most common way to define an object is with a YAML file. kubectl
converts this to JSON and sends it to the API.
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:1.7.9
ports:
- containerPort: 80
kubectl create -f nginx-deployment.yaml --record
Object YAML files have 5 top-level fields:
apiVersion
: which version of the Kubernetes API are you usingkind
: type of the object you want to createmetadata
: object identifiers, name, uuid and namespacespec
: configuration for this specific object typestatus
: the latest known status of the object, might be out-of-date or missing
metadata.name
should be unique. You can have duplicate names if the objects have different kind
. Name should be lower-case-with-dashes.and.optional.dots
.
Example pod spec:
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: ubuntu
image: ubuntu:trusty
command: [ "echo" ]
args: [ "Hello World" ]
Example deployment spec:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
# Unique key of the Deployment instance
name: deployment-example
spec:
# 3 Pods should exist at all times.
replicas: 3
template:
metadata:
labels:
# Apply this label to pods and default
# the Deployment label selector to this value
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10
Example job spec:
apiVersion: batch/v1
kind: Job
metadata:
# Unique key of the Job instance
name: example-job
spec:
template:
metadata:
name: example-job
spec:
containers:
- name: pi
image: perl
command: [ "perl" ]
args: [ "-Mbignum=bpi", "-wle", "print bpi(2000)" ]
# Do not restart containers after they exit
restartPolicy: Never