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 using
kind: type of the object you want to create
metadata: object identifiers, name, uuid and namespace
spec: configuration for this specific object type
status: 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
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