Kubernetes is the container orchestration tool.
Its primary job it to ensure that given container is running with regards to given constraints (e.g container X requires N mb of memory or container X must be replicated N times on different physical nodes).
Kubernetes covers more use-cases: it is a platform for automatic deployment, scaling, HA and orchestration of containerized applications
Terminology
Kubernetes introduces multiple concepts.
The main one is: the resource (aka. object)
In order to list all of the Kubernetes resources use: kubectl api-resources
Kubernetes Resources
The handy command: kubectl explain <resource>
, for nested fields: kubectl explain <resource>.<field>
Node
Worker machine, runs Services, capable of running Pods. Either VM or physical machine
Pod
Resource
The 'execution' unit of Kubernetes. Representation of one or more application containers (Docker or rkt) or shared resources for those containers. Shared resources are available for all containers in the POD. All containers within the POD share the same IP address and can communicate via loopback interface PODs are ephemeral.
Namespace
Virtual cluster, scope for names.
In order to find out if given resource is affected by namespace use: kubectl api-resources --namespaced=true
,
all of the listed resources respect the namespace setting.
Deployment
Configuration how to create/update instances of the application
Service
Set of Pods with policy how to access them (e.g. load balancing or service discovery for pods)
Controller
Pods manager (handles, e.g., pod replication). Given information about desired number of PODs ensures the desired number of them is running.
Volume
Local storage on the POD is ephemeral. When the POD is destroyed, the POD data is gone forever. In order to enable 'persistent' storage - use volumes.
Non-resource concepts
Labels
Key-value pairs. Used to group together set of objects. Each object can have multiple labels, 'same' label can be attached to multiple objects
Basics
The PODs are the execution units submitted by the 'user', however creating, submitting PODs one by one would be tedious.
This is solved by using e.g., deployment, statefulsets or daemonsets. They provide policies for scheduling multiple PODs.
Containers within one POD share IP address. Tightly coupled containers should run within one Pod. Pod provides two kinds of shared (by pod's containers) resources: networking and storage.
Services match a set of pods using labels and selectors. Services are published or discovered either via DNS or environmental variables.
Services by default are visible within the cluster only and there is no way to access them from the outside of the Kubernetes cluster.
In Kubernetes following networking rules hold true: 1. All containers/pods can communicate with all other containers/pods without NAT 2. All Nodes can communicate with all containers/pods (and vice-versa) without NAT 3. The IP that a container sees itself as is the same IP that others see it as
Kubectl
is used to interact with the cluster.
If you have multiple clusters, list them with: kubectl config get-contexts
,
switch between them with: kubectl config use-context CONTEXT_NAME
kubectl
commands supports both: imperative and declarative management:
- kubectl create -f your.yaml
- imperative
- kubectl apply -f your.yaml
- declarative
In order to get detailed information about any part of your deployment use kubectl describe <kind>
.
The term kind
is defined in this manual (it can simply be a pod
, service
or deployment
)
In order to debug what actually happens within Kubernetes cluster: kubectl get events --sort-by='{.lastTimestamp}'
Setup
Setup depends on the number of nodes used for cluster
Single-node
Use minikube.
It uses either KVM or VirtualBox as docker host.
In order to increase default limits of the VM, it must be destroyed first: minikube delete; minikube start --memory 12288
Multi-node
TODO
References
- https://kubernetes.io/docs/user-journeys/users/application-developer/foundational/
- https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html
- https://vimeo.com/245778144/4d1d597c5e
- https://www.magalix.com/blog/kubernetes-cluster-networking-101
- https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html