3.0 KiB
Other topics
Introduction
In this section you will get an overview of others Kubernetes useful features, in order of complexity.
Namespace
Namespaces
is the way to support multiple virtual clusters in Kubernetes.
They are intended for use in environments with many users spread across multiple teams, or projects. For clusters with a few to tens of users, you should not need to create or think about namespaces
at all. Start using namespaces
when you need the features they provide.
By default, all objects are in the default
namespace. There is a "hidden" namespace
where Kubernetes runs services for itself.
Try:
$ kubectl get namespace
NAME STATUS AGE
default Active 56d
kube-public Active 56d
kube-system Active 56d
$ kubectl get all --namespace=kube-system
[lot of stuff]
kubeval
It is a tool to validate your Kubernetes YAML files: https://github.com/garethr/kubeval
The easiest integration is with docker run
, if you files are in the directory kubernetes
docker run -it -v `pwd`/kubernetes:/kubernetes garethr/kubeval kubernetes/**/*
Helm
It is a package manager for Kubernetes: https://helm.sh/. It contains multiple, ready to use, Kubernetes manifest for projects, for example mysql
Stateful Set
Like a Deployment
, a StatefulSet
manages Pods that are based on an identical container spec. Unlike a Deployment
, a StatefulSet
maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling.
StatefulSets
are valuable for applications that require one or more of the following.
- Stable, unique network identifiers, ex: distributed system, like ElasticSearch
- Stable, persistent storage, ex: MySQL
- Ordered, graceful deployment and scaling
- Ordered, automated rolling updates, ex: MySQL Master+Slave
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Exercises
- Install
helm
, and use it to installredis
in your minikube - Configure a stateful set for nginx with a HPA at 1% CPU, in a namespace
staging
Clean up
kubectl delete statefulset,deployment,service,pod --all