You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kubernetes-hands-on/18-stateful-set/README.md

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

  1. Install helm, and use it to install redis in your minikube
  2. 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