virli/tutorial/k8s/scaling.md

3.4 KiB

Montée en charge

Commençons facilement, en augmentant le nombre de workers :

kubectl scale deploy/worker --replicas=10

Tout comme cela fonctionnait en partie avec docker-compose, on obtient ici le même résultat. Ouf ... c'était pas trop tôt !

Nous pouvons profiter de regarder l'augmentation en direct, via la commande :

kubectl get pods -w

Par contre, ce ne sera pas aussi simple d'augmenter le nombre de rng. En effet, il nous faut répartir les services entre plusieurs machines.

Daemon sets

Une ressource daemon sets va s'assurer que tous les nœuds (ou une partie) vont exécuter une instance d'un pod. Ainsi, si un nouveau nœud rejoint le cluster, le pod sera automatiquement lancé dessus. Inversement, lorsqu'un nœud quitte le cluster, le pod est nettoyé.

On s'en sert principalement pour exécuter une instance de daemon de stockage (tel que Ceph, glusterd, ...) ou pour la collecte de logs (fluentd, logstash, ...), voire du monitoring (Prometheus, collectd, ...)

Pour créer un daemon sets, il est nécessaire d'écrire un fichier YAML :

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
	k8s-app: fluentd-logging
spec:
  selector:
	matchLabels:
	  name: fluentd-elasticsearch
  template:
	metadata:
	  labels:
	    name: fluentd-elasticsearch
	spec:
	  tolerations:
	  - key: node-role.kubernetes.io/master
	    effect: NoSchedule
	  containers:
	  - name: fluentd-elasticsearch
		image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
		resources:
		  limits:
		    memory: 200Mi
		  requests:
		    cpu: 100m
			memory: 200Mi
		volumeMounts:
		- name: varlog
		  mountPath: /var/log
	    - name: varlibdockercontainers
		  mountPath: /var/lib/docker/containers
		  readOnly: true
	  terminationGracePeriodSeconds: 30
	  volumes:
	  - name: varlog
	    hostPath:
		  path: /var/log
	  - name: varlibdockercontainers
	    hostPath:
          path: /var/lib/docker/containers

Ensuite, on crée le DaemonSet en appliquant la nouvelle spécification :

kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml

Pour plus d'informations, consultez la documentation.

DaemonSet rng

Pour réaliser le DaemonSet de notre pod rng, le plus simple est de partir d'un export de la ressource existante :

kubectl get deploy/rng -o yaml > rng.yml

La première chose que l'on peut faire, c'est changer le type décrit dans le champ kind :

kind: DaemonSet

Vous pouvez essayer d'appliquer cette spec, pour voir et essayer de tâtonner grâce aux erreurs renvoyées par l'API.

Il vous faudra également retirer le champ replicas (qui n'a pas de sens ici, vu que la réplication est basée sur les nœuds), les champs strategy, progressDeadlineSeconds, ainsi que la ligne status: {}.

Force ! {-}

En fait, plutôt que de corriger ces erreurs, on aurait aussi très bien pu désactiver la validation comme ceci :

kubectl apply -f rng.yml --validate=false
Trop de pods rng {-}

Après avoir appliqué la nouvelle spec, on constate qu'il y a beaucoup de pods rng. En effet, l'ancien pod déployé avec la ressource deployment est toujours là.

Botleneck résolu ? {-}

Admirez maintenant dans Chronograf si vous avez réussi à augmenter votre nombre de pépites !