245
FORMATION KUBERNETES 1

FORMATION KUBERNETES - particule

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: FORMATION KUBERNETES - particule

FORMATION KUBERNETES

1

Page 2: FORMATION KUBERNETES - particule

CONCERNANT CES SUPPORTS DE COURS

2 . 1

Page 3: FORMATION KUBERNETES - particule

SUPPORTS DE COURS RÉALISÉS PAR PARTICULE

ex Expertise Cloud NativeExpertise DevOpsNos offres de formations:

Sources : HTML/PDF :

Osones/Alterway

https://particule.io/trainings/https://github.com/particuleio/formations/

https://particule.io/formations/

2 . 2

Page 4: FORMATION KUBERNETES - particule

COPYRIGHT

Licence : Copyright © 2014-2019 alter way Cloud ConsultingCopyright © 2020 particule.Depuis 2020, tous les commits sont la propriété deleurs auteurs respectifs

Creative Commons BY-SA 4.0

2 . 3

Page 5: FORMATION KUBERNETES - particule

LE CLOUD : VUE D’ENSEMBLE

3 . 1

Page 6: FORMATION KUBERNETES - particule

LE CLOUD, C’EST LARGE !

Stockage/calcul distant (on oublie, cf. externalisation)

Virtualisation++

Abstraction du matériel (voire plus)

Accès normalisé par des APIs

Service et facturation à la demande

Flexibilité, élasticité

3 . 2

Page 7: FORMATION KUBERNETES - particule

WAAS : WHATEVER AS A SERVICE

IaaS : Infrastructure as a Service

PaaS : Platform as a Service

SaaS : Software as a Service

3 . 3

Page 8: FORMATION KUBERNETES - particule

LE CLOUD EN UN SCHÉMA

3 . 4

Page 9: FORMATION KUBERNETES - particule

POURQUOI DU CLOUD ? CÔTÉ TECHNIQUE

Abstraction des couches basses

On peut tout programmer à son gré (API)

Permet la mise en place d’architectures scalables

3 . 5

Page 10: FORMATION KUBERNETES - particule

VIRTUALISATION DANS LE CLOUD

Le cloud IaaS repose souvent sur la virtualisation

Ressources compute : virtualisation

Virtualisation complète : KVM, Xen

Virtualisation conteneurs : OpenVZ, LXC, Docker, RKT

3 . 6

Page 11: FORMATION KUBERNETES - particule

NOTIONS ET VOCABULAIRE IAAS

L’instance est par définition éphémère

Elle doit être utilisée comme ressource de calcul

Séparer les données des instances

3 . 7

Page 12: FORMATION KUBERNETES - particule

ORCHESTRATION DES RESSOURCES ?

Groupement fonctionnel de ressources : microservices

Infrastructure as Code : Définir toute uneinfrastructure dans un seul fichier texte de manièredéclarative

Scalabilité : passer à l'échelle son infrastructure enfonction de différentes métriques.

3 . 8

Page 13: FORMATION KUBERNETES - particule

POSITIONNEMENT DES CONTENEURS DANS L'ÉCOSYSTÈME CLOUD ?

Facilitent la mise en place de PaaS

Fonctionnent sur du IaaS ou sur du bare-metal

Simplifient la décomposition d'applications en microservices

3 . 9

Page 14: FORMATION KUBERNETES - particule

LES CONTENEURS

4 . 1

Page 15: FORMATION KUBERNETES - particule

DÉFINITION

Les conteneurs fournissent un environnement isolésur un système hôte, semblable à un chroot sousLinux ou une jail sous BSD, mais en proposant plusde fonctionnalités en matière d'isolation et deconfiguration. Ces fonctionnalités sont dépendantesdu système hôte et notamment du kernel.

4 . 2

Page 16: FORMATION KUBERNETES - particule

LE KERNEL LINUX

Namespaces

Cgroups (control groups)

4 . 3

Page 17: FORMATION KUBERNETES - particule

LES NAMESPACES

4 . 4

Page 18: FORMATION KUBERNETES - particule

MOUNT NAMESPACES ( LINUX 2.4.19)

Permet de créer un arbre des points de montageindépendants de celui du système hôte.

4 . 5

Page 19: FORMATION KUBERNETES - particule

UTS NAMESPACES (LINUX 2.6.19)

Unix Time Sharing : Permet à un conteneur dedisposer de son propre nom de domaine et d’identitéNIS sur laquelle certains protocoles tel que LDAPpeuvent se baser.

4 . 6

Page 20: FORMATION KUBERNETES - particule

IPC NAMESPACES (LINUX 2.6.19)

Inter Process Communication : Permet d’isoler lesbus de communication entre les processus d’unconteneur.

4 . 7

Page 21: FORMATION KUBERNETES - particule

PID NAMESPACES (LINUX 2.6.24)

Isole l’arbre d’exécution des processus et permetdonc à chaque conteneur de disposer de son propreprocessus maître (PID 0) qui pourra ensuite exécuteret manager d'autres processus avec des droitsillimités tout en étant un processus restreint au seindu système hôte.

4 . 8

Page 22: FORMATION KUBERNETES - particule

USER NAMESPACES (LINUX 2.6.23-3.8)

Permet l’isolation des utilisateurs et des groupes ausein d’un conteneur. Cela permet notamment degérer des utilisateurs tels que l’UID 0 et GID 0, le rootqui aurait des permissions absolues au sein d’unnamespace mais pas au sein du système hôte.

4 . 9

Page 23: FORMATION KUBERNETES - particule

NETWORK NAMESPACES (LINUX 2.6.29)

Permet l’isolation des ressources associées au réseau,chaque namespace dispose de ses propres cartesréseaux, plan IP, table de routage, etc.

4 . 10

Page 24: FORMATION KUBERNETES - particule

CGROUPS : CONTROL CROUPSCGroup: / |--docker | |--7a977a50f48f2970b6ede780d687e72c0416d9ab6e0b02030698c1633fdde956 | |--6807 nginx: master process ngin | | |--6847 nginx: worker proces

4 . 11

Page 25: FORMATION KUBERNETES - particule

CGROUPS : LIMITATION DE RESSOURCES

Limitation des ressources : des groupes peuvent êtremis en place afin de ne pas dépasser une limite demémoire.

4 . 12

Page 26: FORMATION KUBERNETES - particule

CGROUPS : PRIORISATION

Priorisation : certains groupes peuvent obtenir uneplus grande part de ressources processeur ou debande passante d'entrée-sortie.

4 . 13

Page 27: FORMATION KUBERNETES - particule

CGROUPS : COMPTABILITÉ

Comptabilité : permet de mesurer la quantité deressources consommées par certains systèmes, envue de leur facturation par exemple.

4 . 14

Page 28: FORMATION KUBERNETES - particule

CGROUPS : ISOLATION

Isolation : séparation par espace de nommage pourles groupes, afin qu'ils ne puissent pas voir lesprocessus des autres, leurs connexions réseaux ouleurs fichiers.

4 . 15

Page 29: FORMATION KUBERNETES - particule

CGROUPS : CONTRÔLE

Contrôle : figer les groupes ou créer un point desauvegarde et redémarrer.

4 . 16

Page 30: FORMATION KUBERNETES - particule

DEUX PHILOSOPHIES DE CONTENEURS

Systeme : simule une séquence de boot complèteavec un init process ainsi que plusieurs processus(LXC, OpenVZ).Process : un conteneur exécute un ou plusieursprocessus directement, en fonction de l'applicationconteneurisée (Docker, Rkt).

4 . 17

Page 31: FORMATION KUBERNETES - particule

ENCORE PLUS “CLOUD” QU’UNE INSTANCE

Partage du kernel

Un seul processus par conteneur

Le conteneur est encore plus éphémère quel’instance

Le turnover des conteneurs est élevé : orchestration

4 . 18

Page 32: FORMATION KUBERNETES - particule

CONTAINER RUNTIME

Permettent d'exécuter des conteneurs sur un système

docker: historique

containerd: implémentation de référence

cri-o: implémentation Open Source développée parRedHat

kata containers: Conteneurs dans des VMs

4 . 19

Page 33: FORMATION KUBERNETES - particule

LES CONTENEURS: CONCLUSION

Fonctionnalités offertes par le Kernel

Les conteneurs engine fournissent des interfacesd'abstraction

Plusieurs types de conteneurs pour différents besoins

4 . 20

Page 34: FORMATION KUBERNETES - particule

BUILD, SHIP AND RUN !

5 . 1

Page 35: FORMATION KUBERNETES - particule

BUILD

5 . 2

Page 36: FORMATION KUBERNETES - particule

LE CONTENEUR ET SON IMAGE

Flexibilité et élasticité

Format standard de facto

Instanciation illimitée

5 . 3

Page 37: FORMATION KUBERNETES - particule

CONSTRUCTION D'UNE IMAGE

Possibilité de construire son image à la main (long etsource d'erreurs)

Suivi de version et construction d'images de manièreautomatisée

Utilisation de Dockerfile afin de garantirl'idempotence des images

5 . 4

Page 38: FORMATION KUBERNETES - particule

DOCKERFILE

Suite d'instruction qui définit une image

Permet de vérifier le contenu d'une image

FROM alpine:3.4MAINTAINER Particule <[email protected]>RUN apk -U add nginxEXPOSE 80 443CMD ["nginx"]

5 . 5

Page 39: FORMATION KUBERNETES - particule

DOCKERFILE : PRINCIPALES INSTRUCTIONS

FROM : baseimage utilisée

RUN : Commandes effectuées lors du build de l'image

EXPOSE : Ports exposées lors du run (si -P est précisé)

ENV : Variables d'environnement du conteneur àl'instanciation

CMD : Commande unique lancée par le conteneur

ENTRYPOINT : "Préfixe" de la commande uniquelancée par le conteneur

5 . 6

Page 40: FORMATION KUBERNETES - particule

DOCKERFILE : BEST PRACTICES

Bien choisir sa baseimage

Chaque commande Dockerfile génère un nouveaulayer

Comptez vos layers !

5 . 7

Page 41: FORMATION KUBERNETES - particule

DOCKERFILE : BAD LAYERINGRUN apk --update add \ git \ tzdata \ python \ unrar \ zip \ libxslt \ py-pip \

RUN rm -rf /var/cache/apk/*

VOLUME /config /downloads

EXPOSE 8081

CMD ["--datadir=/config", "--nolaunch"]

ENTRYPOINT ["/usr/bin/env","python2","/sickrage/SickBeard.py"]

5 . 8

Page 42: FORMATION KUBERNETES - particule

DOCKERFILE : GOOD LAYERINGRUN apk --update add \ git \ tzdata \ python \ unrar \ zip \ libxslt \ py-pip \ && rm -rf /var/cache/apk/*

VOLUME /config /downloads

EXPOSE 8081

CMD ["--datadir=/config", "--nolaunch"]

ENTRYPOINT ["/usr/bin/env","python2","/sickrage/SickBeard.py"]

5 . 9

Page 43: FORMATION KUBERNETES - particule

DOCKERFILE : DOCKERHUB

Build automatisée d'images Docker

Intégration GitHub / DockerHub

Plateforme de stockage et de distribution d'imagesDocker

5 . 10

Page 44: FORMATION KUBERNETES - particule

SHIP

5 . 11

Page 45: FORMATION KUBERNETES - particule

SHIP : LES CONTENEURS SONT MANIPULABLES

Sauvegarder un conteneur :

Exporter une image :

Importer un conteneur :

docker commit mon-conteneur backup/mon-conteneur

docker run -it backup/mon-conteneur

docker save -o mon-image.tar backup/mon-conteneur

docker import mon-image.tar backup/mon-conteneur

5 . 12

Page 46: FORMATION KUBERNETES - particule

SHIP : DOCKER REGISTRY

DockerHub n’est qu’au Docker registry ce queGitHub est à git

Pull and Push

Image officielle : registry

5 . 13

Page 47: FORMATION KUBERNETES - particule

RUN

5 . 14

Page 48: FORMATION KUBERNETES - particule

RUN : LANCER UN CONTENEUR

docker run

-d (detach)

-i (interactive)

-t (pseudo tty)

5 . 15

Page 49: FORMATION KUBERNETES - particule

RUN : BEAUCOUP D’OPTIONS...

-v /directory/host:/directory/container

-p portHost:portContainer

-P-e “VARIABLE=valeur”

--restart=always--name=mon-conteneur

5 . 16

Page 50: FORMATION KUBERNETES - particule

RUN : ...DONT CERTAINES UN PEU DANGEREUSES

--privileged (Accès à tous les devices)

--pid=host (Accès aux PID de l’host)

--net=host (Accès à la stack IP de l’host)

5 . 17

Page 51: FORMATION KUBERNETES - particule

RUN : SE “CONNECTER” À UN CONTENEUR

docker exec

docker attach

5 . 18

Page 52: FORMATION KUBERNETES - particule

RUN : DÉTRUIRE UN CONTENEUR

docker kill (SIGKILL)

docker stop (SIGTERM puis SIGKILL)

docker rm (détruit complètement)

5 . 19

Page 53: FORMATION KUBERNETES - particule

BUILD, SHIP AND RUN : CONCLUSIONS

Écosystème de gestion d'images

Construction automatisée d'images

Contrôle au niveau conteneurs

5 . 20

Page 54: FORMATION KUBERNETES - particule

KUBERNETES : PROJET, GOUVERNANCE ETCOMMUNAUTÉ

6 . 1

Page 55: FORMATION KUBERNETES - particule

KUBERNETES

COE développé par Google, devenu open source en2014Adapté à tout type d'environnementDevenu populaire en très peu de tempsPremier projet de la CNCF

6 . 2

Page 56: FORMATION KUBERNETES - particule

CNCF

The Foundation’s mission is to create and drive theadoption of a new computing paradigm that is optimizedfor modern distributed systems environments capable ofscaling to tens of thousands of self healing multi-tenant

nodes.

6 . 3

Page 57: FORMATION KUBERNETES - particule

CNCF : PRÉREQUIS

Distribuer sous forme de conteneursGestion dynamique de la configurationOrienté micro services

6 . 4

Page 58: FORMATION KUBERNETES - particule

CNCF : LES RÔLES

Intendance des projetsFaire grossir et évoluer l'écosystèmeRendre la technologie accessiblePromouvoir la technologie

6 . 5

Page 59: FORMATION KUBERNETES - particule

OCI

Créé sous la Linux FondationBut : Créer un standard Open Source concernant lamanière de "runner" et le format des conteneurs etimagesNon lié à des produitsNon lié à des COErunC a été donné par Docker à l'OCI commeimplémention de base

6 . 6

Page 60: FORMATION KUBERNETES - particule

KUBERNETES : PROJET

Docs : Slack : Discuss : Stack Overflow :

Serverfault

https://kubernetes.io/docs/http://slack.k8s.io/

https://discuss.kubernetes.io

https://stackoverflow.com/questions/tagged/kubernetes

https://stackoverflow.com/questions/tagged/kubernetes

6 . 7

Page 61: FORMATION KUBERNETES - particule

KUBERNETES : PROJET

Hébergé sur Github : :

Issues :

Pull Requests

Releases :

Projets en incubation :

(Deprécié)

https://github.com/kubernetes/kubernetes

https://github.com/kubernetes/kubernetes/issues

https://github.com/kubernetes/kubernetes/pulls

https://github.com/kubernetes/kubernetes/releases

https://github.com/kubernetes-incubator/

https://github.com/kubernetes-sigs/

6 . 8

Page 62: FORMATION KUBERNETES - particule

KUBERNETES : CYCLE DE DÉVELOPPEMENT

Chaque release a son propre planning, pour exemple:

Chaque cycle de développement dure 12 semaines etpeut être étendu si nécessaireFeatures freezeCode FreezeAlpha ReleaseBeta ReleasesRelease Candidates

https://github.com/kubernetes/sig-release/tree/master/releases/release-1.12#timeline

6 . 9

Page 63: FORMATION KUBERNETES - particule

KUBERNETES : COMMUNAUTÉ

Contributor and community guide :

Décomposée en [Special Interest Groups] :

Les SIG sont des projets, centres d'intérêts ou Working Group différents :NetworkDocsAWSetc

Chaque SIG peut avoir des guidelines différentes.

https://github.com/kubernetes/community/blob/master/README.md#kubernetes-community

https://github.com/kubernetes/community/blob/master/sig-list.md

6 . 10

Page 64: FORMATION KUBERNETES - particule

KUBERNETES : KUBECON

La CNCF organise trois KubeCon par an :

Amérique du Nord (San Diego, Seattle, Boston, etc)Europe (Berlin, Barcelone, Amsterdam, etc)Chine

6 . 11

Page 65: FORMATION KUBERNETES - particule

KUBERNETES : ARCHITECTURE

7 . 1

Page 66: FORMATION KUBERNETES - particule

KUBERNETES : COMPOSANTS

Kubernetes est écrit en Go, compilé statiquement.Un ensemble de binaires sans dépendanceFaciles à conteneuriser et à packagerPeut se déployer uniquement avec des conteneurssans dépendance d'OS

7 . 2

Page 67: FORMATION KUBERNETES - particule

KUBERNETES : COMPOSANTS DU CONTROL PLANE

etcd: Base de donnéeskube-apiserver : API server qui permet laconfiguration d'objets Kubernetes (Pod, Service,Deployment, etc.)kube-proxy : Permet le forwarding TCP/UDP et leload balancing entre les services et les backends(Pods)kube-scheduler : Implémente les fonctionnalités deschedulingkube-controller-manager : Responsable de l'état ducluster, boucle infinie qui régule l'état du cluster afind'atteindre un état désiré

7 . 3

Page 68: FORMATION KUBERNETES - particule

KUBERNETES : COMPOSANTS DU CONTROL PLANE

7 . 4

Page 69: FORMATION KUBERNETES - particule

KUBERNETES : COMPOSANTS DU CONTROL PLANE

7 . 5

Page 70: FORMATION KUBERNETES - particule

KUBERNETES : ETCD

Base de données de type Clé/Valeur (Key Value Store)Stocke l'état d'un cluster KubernetesPoint sensible (stateful) d'un cluster KubernetesProjet intégré à la CNCF

7 . 6

Page 71: FORMATION KUBERNETES - particule

KUBERNETES : KUBE-APISERVER

Les configurations d'objets (Pods, Service, RC, etc.) sefont via l'API serverUn point d'accès à l'état du cluster aux autrescomposants via une API RESTTous les composants sont reliés à l'API server

7 . 7

Page 72: FORMATION KUBERNETES - particule

KUBERNETES : KUBE-SCHEDULER

Planifie les ressources sur le clusterEn fonction de règles implicites (CPU, RAM, stockagedisponible, etc.)En fonction de règles explicites (règles d'affinité etanti-affinité, labels, etc.)

7 . 8

Page 73: FORMATION KUBERNETES - particule

KUBERNETES : KUBE-PROXY

Responsable de la publication des ServicesUtilise iptablesRoute les paquets à destination des conteneurs etréalise le load balancing TCP/UDP

7 . 9

Page 74: FORMATION KUBERNETES - particule

KUBERNETES : KUBE-CONTROLLER-MANAGER

Boucle infinie qui contrôle l'état d'un clusterEffectue des opérations pour atteindre un état donnéDe base dans Kubernetes : replication controller,endpoints controller, namespace controller etserviceaccounts controller

7 . 10

Page 75: FORMATION KUBERNETES - particule

KUBERNETES : AUTRES COMPOSANTS

kubelet : Service "agent" fonctionnant sur tous lesnœuds et assure le fonctionnement des autresserviceskubectl : Ligne de commande permettant de piloterun cluster Kubernetes

7 . 11

Page 76: FORMATION KUBERNETES - particule

KUBERNETES : KUBELET

Service principal de KubernetesPermet à Kubernetes de s'auto configurer :

Surveille un dossier contenant les manifests(fichiers YAML des différents composant deKubernetes).Applique les modifications si besoin (upgrade,rollback).

Surveille l'état des services du cluster via l'API server(kube-apiserver).

7 . 12

Page 77: FORMATION KUBERNETES - particule

KUBERNETES : KUBELET

Assure la communication entre les nodes etl'apiserverEn charge de créer les conteneurs au travers del'interface Container Runtime Interface (CRI)Peut fonctionner avec différentes container runtimes

7 . 13

Page 78: FORMATION KUBERNETES - particule

KUBERNETES : KUBELET

7 . 14

Page 79: FORMATION KUBERNETES - particule

KUBERNETES: NETWORK

Kubernetes n'implémente pas de solution réseau pardéfaut, mais s'appuie sur des solutions tierces qui

implémentent les fonctionnalités suivantes :

Chaque pods reçoit sa propre adresse IPLes pods peuvent communiquer directement sansNAT

7 . 15

Page 80: FORMATION KUBERNETES - particule

KUBERNETES : CONCEPTS ET OBJETS

8 . 1

Page 81: FORMATION KUBERNETES - particule

KUBERNETES : API RESOURCES

NamespacesPodsDeploymentsDaemonSetsStatefulSetsJobsCronjobs

8 . 2

Page 82: FORMATION KUBERNETES - particule

KUBERNETES : NAMESPACES

Fournissent une séparation logique des ressources :Par utilisateursPar projet / applicationsAutres...

Les objets existent uniquement au sein d'unnamespace donnéÉvitent la collision de nom d'objets

8 . 3

Page 83: FORMATION KUBERNETES - particule

KUBERNETES : LABELS

Système de clé/valeurOrganisent les différents objets de Kubernetes (Pods,RC, Services, etc.) d'une manière cohérente quireflète la structure de l'applicationCorrèlent des éléments de Kubernetes : par exempleun service vers des Pods

8 . 4

Page 84: FORMATION KUBERNETES - particule

KUBERNETES : LABELS

Exemple de label :apiVersion: v1kind: Podmetadata: name: nginx labels: app: nginxspec: containers: - name: nginx image: nginx ports: - containerPort: 80

8 . 5

Page 85: FORMATION KUBERNETES - particule

KUBERNETES : POD

Ensemble logique composé de un ou plusieursconteneursLes conteneurs d'un pod fonctionnent ensemble(instanciation et destruction) et sont orchestrés surun même hôteLes conteneurs partagent certaines spécifications duPod :

La stack IP (network namespace)Inter-process communication (PID namespace)Volumes

C'est la plus petite et la plus simple unité dansKubernetes

8 . 6

Page 86: FORMATION KUBERNETES - particule

KUBERNETES : POD

Les Pods sont définis en YAML comme les fichiersdocker-compose :

8 . 7

Page 87: FORMATION KUBERNETES - particule

KUBERNETES : DEPLOYMENT

Permet d'assurer le fonctionnement d'un ensemblede PodsVersion, Update et RollbackAnciennement appelés Replication Controllers

8 . 8

Page 88: FORMATION KUBERNETES - particule

KUBERNETES : DEPLOYMENT

8 . 9

Page 89: FORMATION KUBERNETES - particule

KUBERNETES : DEPLOYMENTapiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80

8 . 10

Page 90: FORMATION KUBERNETES - particule

KUBERNETES : DAEMONSET

Assure que tous les noeuds exécutent une copie dupodNe connaît pas la notion de replicas.Utilisé pour des besoins particuliers comme :

l'exécution d'agents de collection de logscomme fluentd ou logstashl'exécution de pilotes pour du matériel commenvidia-pluginl'exécution d'agents de supervision commeNewRelic agent ou Prometheus node exporter

8 . 11

Page 91: FORMATION KUBERNETES - particule

KUBERNETES : DAEMONSETapiVersion: apps/v1kind: DaemonSetmetadata: name: fluentdspec: selector: matchLabels: name: fluentd template: metadata: labels: name: fluentd spec: containers: - name: fluentd image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2

8 . 12

Page 92: FORMATION KUBERNETES - particule

KUBERNETES : STATEFULSET

Similaire au DeploymentLes pods possèdent des identifiants uniques.Chaque replica de pod est créé par ordre d'indexNécessite un Persistent Volume et unStorage Class.Supprimer un StatefulSet ne supprime pas le PVassocié

8 . 13

Page 93: FORMATION KUBERNETES - particule

KUBERNETES : STATEFULSETapiVersion: apps/v1kind: StatefulSetmetadata: name: webspec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx 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:

8 . 14

Page 94: FORMATION KUBERNETES - particule

KUBERNETES : JOB

Crée des pods et s'assurent qu'un certain nombred'entre eux se terminent avec succès.Peut exécuter plusieurs pods en parallèleSi un noeud du cluster est en panne, les pods sontreschedulés vers un autre noeud.

8 . 15

Page 95: FORMATION KUBERNETES - particule

KUBERNETES : JOBapiVersion: batch/v1kind: Jobmetadata: name: pispec: parallelism: 1 completions: 1 template: metadata: name: pi spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: OnFailure

8 . 16

Page 96: FORMATION KUBERNETES - particule

KUBERNETES: CRON JOB

Un CronJob permet de lancer des Jobs de manièreplanifiée.la programmation des Jobs se définit au format Cronle champ jobTemplate contient la définition del'application à lancer comme Job.

8 . 17

Page 97: FORMATION KUBERNETES - particule

KUBERNETES : CRONJOBapiVersion: batch/v1beta1kind: CronJobmetadata: name: batch-job-every-fifteen-minutesspec: schedule: "0,15,30,45 * * * *" jobTemplate: spec: template: metadata: labels: app: periodic-batch-job spec: restartPolicy: OnFailure containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]

8 . 18

Page 98: FORMATION KUBERNETES - particule

KUBERNETES : NETWORKING

9 . 1

Page 99: FORMATION KUBERNETES - particule

KUBERNETES : NETWORK PLUGINS

Kubernetes n'implémente pas de solution de gestionde réseau par défautLe réseau est implémenté par des solutions tierces :

: IPinIP + BGP : eBPF : VXLAN

Bien

CalicoCiliumWeave

d'autres

9 . 2

Page 100: FORMATION KUBERNETES - particule

KUBERNETES : CNI

Projet dans la CNCFStandard pour la gestion du réseau enenvironnement conteneuriséLes solutions précédentes s'appuient sur CNI

Container Network Interface

9 . 3

Page 101: FORMATION KUBERNETES - particule

KUBERNETES : SERVICES

Abstraction des Pods sous forme d'une IP virtuelle deServiceRendre un ensemble de Pods accessibles depuisl'extérieur ou l'intérieur du clusterLoad Balancing entre les Pods d'un même ServiceSélection des Pods faisant parti d'un Service grâceaux labels

9 . 4

Page 102: FORMATION KUBERNETES - particule

KUBERNETES : SERVICES

9 . 5

Page 103: FORMATION KUBERNETES - particule

KUBERNETES : SERVICES CLUSTERIP

Exemple de Service (on remarque la sélection sur lelabel et le mode d'exposition):

apiVersion: v1kind: Servicemetadata: name: frontendspec: type: ClusterIP ports: - port: 80 selector: app: guestbook

9 . 6

Page 104: FORMATION KUBERNETES - particule

KUBERNETES : SERVICE NODEPORT

NodePort : chaque noeud du cluster ouvre un portstatique et redirige le trafic vers le port indiqué

9 . 7

Page 105: FORMATION KUBERNETES - particule

KUBERNETES : SERVICE LOADBALANCER

LoadBalancer : expose le Service en externe enutilisant le loadbalancer d'un cloud provider

AWS ELB/ALB/NLBGCP LoadBalancerAzure BalancerOpenStack Octavia

9 . 8

Page 106: FORMATION KUBERNETES - particule

KUBERNETES : SERVICE LOADBALANCER

9 . 9

Page 107: FORMATION KUBERNETES - particule

KUBERNETES : SERVICES

Il est aussi possible de mapper un Service avec un nom dedomaine en spécifiant le paramètre spec.externalName.

apiVersion: v1kind: Servicemetadata: name: my-service namespace: prodspec: type: ExternalName externalName: my.database.example.com

9 . 10

Page 108: FORMATION KUBERNETES - particule

KUBERNETES: INGRESS

L'objet Ingress permet d'exposer un Service àl'extérieur d'un cluster KubernetesIl permet de fournir une URL visible permettantd'accéder un Service KubernetesIl permet d'avoir des terminations TLS, de faire duLoad Balancing, etc...

9 . 11

Page 109: FORMATION KUBERNETES - particule

KUBERNETES: INGRESS

9 . 12

Page 110: FORMATION KUBERNETES - particule

KUBERNETES : INGRESSapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: particulespec: rules: - host: blog.particule.io http: paths: - path: / pathType: Prefix backend: service: name: frontend port: number: 80

9 . 13

Page 111: FORMATION KUBERNETES - particule

KUBERNETES : INGRESS CONTROLLER

Pour utiliser un Ingress, il faut un Ingress Controller. UnIngress permet de configurer une règle de reverse proxy

sur l'Ingress Controller.

Nginx Controller :

Traefik : Istio : Linkerd : Contour :

https://github.com/kubernetes/ingress-nginxhttps://github.com/containous/traefik

https://github.com/istio/istiohttps://github.com/linkerd/linkerdhttps://www.github.com/heptio/contour/

9 . 14

Page 112: FORMATION KUBERNETES - particule

KUBERNETES : SERVICE MESH

10 . 1

Page 113: FORMATION KUBERNETES - particule

PROBLÉMATIQUE

Découpage des applications en micro servicesCommunication inter service (est-west) accrue

10 . 2

Page 114: FORMATION KUBERNETES - particule

PROBLÉMATIQUE

Sans service mesh la logique de communication estcodée dans chaque serviceProblématiques de sécurité ? Commentimplémenter TLS entre les micro services ?Chaque micro service doit implémenter la logiquemétier ainsi les fonctions réseau, sécurité et fiabilitéAugmente la charge sur les équipes dedéveloppementDisparité des langages de programmation :implémentation de la même logique N fois

10 . 3

Page 115: FORMATION KUBERNETES - particule

PROBLÉMATIQUE

L'augmentation du nombre du nombre de micro servicespeut provoquer :

Une latence entre les servicesPeu de visibilité sur la santé des services individuelsPeu de visibilité sur l'inter dépendance des services

10 . 4

Page 116: FORMATION KUBERNETES - particule

KUBERNETES : SERVICE MINIMUM

L'objet Service supporte uniquement TCP/UDP ainsique de la répartition de charge basiqueL'objet Ingress utilise un point central decommunication : l'ingress contrôleurPas d'objets natifs pour faire du routage applicatifpousséNécessité d'augmenter les fonctionnalités par unservice tiers

10 . 5

Page 117: FORMATION KUBERNETES - particule

SERVICE MESH

Les service mesh déportent la logique de communicationau niveau de l'infrastructure et non plus au niveau de

l'application. Les service mesh sont en général composésde deux plans:

Un plan de données : effectue la communicationentre les micro services.Un plan de contrôle : Programme le data plane etfourni des outils de configuration et de visualisation(CLI/Dashboard)

10 . 6

Page 118: FORMATION KUBERNETES - particule

SERVICE MESH : PLAN DE DONNÉES

Se basent sur un réseau de proxyNe modifient pas l'applicationS'exécutent "à coté" : concept de sidecarsCes sidecars s'exécutent dans les même pods quel'application mais dans un conteneur différent

10 . 7

Page 119: FORMATION KUBERNETES - particule

SERVICE MESH : PLAN DE DONNÉES

10 . 8

Page 120: FORMATION KUBERNETES - particule

SERVICE MESH : PLAN DE CONTRÔLE

Pilote le plan de donnéePermet la configuration de règles de routageapplicativesCartographie la communication entre les microservicesFourni des métriques applicatives :

LatencesDéfaillancesLogique de retry (désengorgement du réseau)

10 . 9

Page 121: FORMATION KUBERNETES - particule

SERVICE MESH : AVANTAGES

Permettent aux développeurs de se focaliser surl'application et non pas sur la communication desservicesCouche commune de communication qui facilite ledébogage et l'identification des problèmesÉvite automatiquement certaines défaillances graceà du routage intelligent

10 . 10

Page 122: FORMATION KUBERNETES - particule

SERVICE MESH : INCONVÉNIENTS

Ajoute une surcouche à Kubernetes qui est déjàcomplexeDifficulté de migrer d'un service mesh à un autreAugmentent la nombre de conteneurs et deressources consommées sur un clusterParadoxalement les proxy rajoutent de la latence

10 . 11

Page 123: FORMATION KUBERNETES - particule

SERVICE MESH : LES SOLUTIONS

Aujourd'hui les solutions sont multiples et offrent toutesplus ou moins les même fonctionnalités :

Gestion du TLS mutuel et des certificatsAuthentification et autorisationMonitoring et traçage applicatifRoutage du trafic via des règles applicatives

10 . 12

Page 124: FORMATION KUBERNETES - particule

SERVICE MESH : LES SOLUTIONS

: Plus connu et le plus complexe, open sourcépar Google

: Hébergé dans la CNCF en incubation, opensourcé par Twitter

: Développé par Hashicorp : Développé par Traefik Lab

Istio

Linkerd

ConsulTraefik Maesh

10 . 13

Page 125: FORMATION KUBERNETES - particule

KUBERNETES : STOCKAGE

11 . 1

Page 126: FORMATION KUBERNETES - particule

KUBERNETES : VOLUMES

Fournir du stockage persistent aux podsFonctionnent de la même façon que les volumesDocker pour les volumes hôte :

EmptyDir ~= volumes dockerHostPath ~= volumes hôte

Support de multiples backend de stockage :GCE : PDAWS : EBSGlusterFS / NFSCephiSCSI

11 . 2

Page 127: FORMATION KUBERNETES - particule

KUBERNETES : VOLUMES

On déclare d'abord le volume et on l'affecte à un pod:

apiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: redis-persistent-storage mountPath: /data/redis volumes: - name: redis-persistent-storage emptyDir: {}

11 . 3

Page 128: FORMATION KUBERNETES - particule

KUBERNETES : STORAGE CLASS

Permet de définir les différents types de stockagedisponiblesUtilisé par les Persistent Volumes pour solliciter unespace de stockage au travers desPersistent Volume Claims

11 . 4

Page 129: FORMATION KUBERNETES - particule

KUBERNETES : STORAGE CLASSkind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: slowprovisioner: kubernetes.io/aws-ebsparameters: type: io1 zones: us-east-1d, us-east-1c iopsPerGB: "10"

11 . 5

Page 130: FORMATION KUBERNETES - particule

KUBERNETES : PERSISTENTVOLUMECLAIMS

Ressource utilisée et vue comme une requête poursolliciter du stockage persistantOffre aux PV une variété d'options en fonction du casd'utilisationUtilisé par les StatefulSets pour solliciter dustockage (Utilisation du champvolumeClaimTemplates)

11 . 6

Page 131: FORMATION KUBERNETES - particule

KUBERNETES : PERSISTENTVOLUMECLAIMSapiVersion: v1kind: PersistentVolumeClaimmetadata: name: storage-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: "slow"

11 . 7

Page 132: FORMATION KUBERNETES - particule

KUBERNETES : PERSISTENTVOLUME

Composant de stockage dans le cluster kubernetesStockage externe aux noeuds du clusterCycle de vie indépendant du pod qui le consommePeut être provisionné manuellement par unadministrateur ou dynamiquement grâce à uneStorageClass

11 . 8

Page 133: FORMATION KUBERNETES - particule

KUBERNETES : PERSISTENTVOLUMEapiVersion: v1kind: PersistentVolumemetadata: name: persistent-volume-1spec: storageClassName: slow capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/tmp/data"

11 . 9

Page 134: FORMATION KUBERNETES - particule

KUBERNETES : CSI

Équivalent de CNI mais pour les volumesAvant Kubernetes 1.13, tous les drivers de volumesétaient in treeLe but de la séparation est de sortir du code du corede KubernetesGA depuis Kubernetes 1.13

Container Storage Interface

11 . 10

Page 136: FORMATION KUBERNETES - particule

KUBERNETES : GESTION DE LA CONFIGURATION DESAPPLICATIONS

12 . 1

Page 137: FORMATION KUBERNETES - particule

KUBERNETES : CONFIGMAPS

Objet Kubernetes permettant de stocker séparémentles fichiers de configurationIl peut être créé d'un ensemble de valeurs ou d'unfichier resource Kubernetes (YAML ou JSON)Un ConfigMap peut sollicité par plusieurs pods

12 . 2

Page 138: FORMATION KUBERNETES - particule

KUBERNETES : CONFIGMAP ENVIRONNEMENT (1/2)apiVersion: v1data: username: admin url: https://api.particule.iokind: ConfigMapmetadata: name: web-config

12 . 3

Page 139: FORMATION KUBERNETES - particule

KUBERNETES : CONFIGMAP ENVIRONNEMENT (2/2)apiVersion: v1kind: Podmetadata: name: configmap-envspec: containers: - name: test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: USERNAME valueFrom: configMapKeyRef: name: web-config key: username - name: URL valueFrom: configMapKeyRef: name: web-config key: url restartPolicy: Never

12 . 4

Page 140: FORMATION KUBERNETES - particule

KUBERNETES : CONFIGMAP VOLUME (1/2)apiVersion: v1data: redis-config: | maxmemory 2mb maxmemory-policy allkeys-lrukind: ConfigMapmetadata: name: redis-config

12 . 5

Page 141: FORMATION KUBERNETES - particule

KUBERNETES : CONFIGMAP VOLUME (2/2)apiVersion: v1kind: Podmetadata: name: configmap-volumespec: containers: - name: test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "head -v /etc/config/*" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: redis-config restartPolicy: Never

12 . 6

Page 142: FORMATION KUBERNETES - particule

KUBERNETES : SECRETS

Objet Kubernetes de type secret utilisé pour stockerdes informations sensibles comme les mots de passe,les tokens, les clés SSH...Similaire à un ConfigMap, à la seule différence que lecontenu des entrées présentes dans le champ datasont encodés en base64.Il est possible de directement créer un Secretspécifique à l'authentification sur une registry Dockerprivée.Il est possible de directement créer un Secret àpartir d'un compte utilisateur et d'un mot de passe.

12 . 7

Page 143: FORMATION KUBERNETES - particule

KUBERNETS : SECRETS

S'utilisent de la même façon que les ConfigMapLa seule différence est le stockage en base643 types de secrets:Generic: valeurs arbitraire comme dans uneConfigMaptls: certificat et clé pour utilisation avec un serveurwebdocker-registry: utilisé en tant queimagePullSecret par un pod pour pouvoir pull lesimages d'une registry privée

12 . 8

Page 144: FORMATION KUBERNETES - particule

KUBERNETES : SECRETSkubectl create secret generic monSuperSecret --from-literal=username='monUser' --from-literal=password='monSuperPassword"

12 . 9

Page 145: FORMATION KUBERNETES - particule

KUBERNETES : SECRETS

Les valeurs doivent être encodées en base64.

apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm

12 . 10

Page 146: FORMATION KUBERNETES - particule

KUBERNETES : GESTION DES RESSOURCES

13 . 1

Page 147: FORMATION KUBERNETES - particule

PODS RESOURCES : REQUEST ET LIMITS

Permettent de gérer l'allocation de ressources ausein d'un clusterPar défaut, un pod/container sans request/limits esten best effortRequest: allocation minimum garantie (réservation)Limit: allocation maximum (limite)Se base sur le CPU et la RAM

13 . 2

Page 148: FORMATION KUBERNETES - particule

PODS RESOURCES : CPU

1 CPU est globalement équivalent à un cœurL'allocation se fait par fraction de CPU:1 : 1 vCPU entier100m : 0.1 vCPU0.5 : 1/2 vCPULorsqu'un conteneur atteint la limite CPU, celui ci estthrottled

13 . 3

Page 149: FORMATION KUBERNETES - particule

PODS RESOURCES : RAM

L'allocation se fait en unité de RAM:M : en base 10Mi : en base 2Lorsqu'un conteneur atteint la limite RAM, celui ci estOOMKilled

13 . 4

Page 150: FORMATION KUBERNETES - particule

PODS RESOURCES : REQUEST ET LIMITSapiVersion: v1kind: Podmetadata: name: frontendspec: containers: - name: db image: mysql env: - name: MYSQL_ROOT_PASSWORD value: "password" resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" - name: wp image: wordpress resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi"

13 . 5

Page 151: FORMATION KUBERNETES - particule

HORIZONTAL AUTOSCALING

Permet de scaler automatiquement le nombre depods d'un deploymentMétriques classiques (CPU/RAM): En fonction d'un %de la request CPU/RAMMétriques custom (Applicative)

13 . 6

Page 152: FORMATION KUBERNETES - particule

HORIZONTAL AUTOSCALINGapiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata: name: php-apache namespace: defaultspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50

13 . 7

Page 153: FORMATION KUBERNETES - particule

LIMITRANGES

l'objet LimitRange permet de définir les valeursminimales et maximales des ressources utilisées parles containers et les podsl'objet LimitRange s'applique au niveau dunamespaceles limites spécifiées s'appliquent à chaquepod/container créé dans le namespacele LimitRange ne limite pas le nombre total deressources disponibles dans le namespace

13 . 8

Page 154: FORMATION KUBERNETES - particule

LIMITRANGESapiVersion: v1kind: LimitRangemetadata: name: limit-examplespec: limits: - default: memory: 512Mi defaultRequest: memory: 256 Mi type: Container

13 . 9

Page 155: FORMATION KUBERNETES - particule

RESOURCEQUOTAS

un objet ResourceQuota limite le total des ressourcesde calcul consommées par les pods ainsi que le totalde l'espace de stockage consommé par lesPersistentVolumeClaims dans un namespaceil permet aussi de limiter le nombre de pods, PVC etautres objets qui peuvent être créés dans unnamespace

13 . 10

Page 156: FORMATION KUBERNETES - particule

RESOURCEQUOTASapiVersion: v1kind: ResourceQuotametadata: name: cpu-and-ramspec: hard: requests.cpu: 400m requests.memory: 200Mi limits.cpu: 600m limits.memory: 500Mi

13 . 11

Page 157: FORMATION KUBERNETES - particule

KUBERNETES: SCHEDULING

14 . 1

Page 158: FORMATION KUBERNETES - particule

AFFINITÉ / ANTI-AFFINITÉ

2 types de règles :

Affinité de nodesAffinité / Anti-affinité de pod

14 . 2

Page 159: FORMATION KUBERNETES - particule

AFFINITÉ DE NODES

Permets de scheduler des workloads sur un nœud enparticulierParamétrable en fonction de labels

14 . 3

Page 160: FORMATION KUBERNETES - particule

AFFINITÉ DE NODESpods/pod-with-node-affinity.yaml

apiVersion: v1kind: Podmetadata: name: with-node-affinityspec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers:

14 . 4

Page 161: FORMATION KUBERNETES - particule

AFFINITÉ / ANTI-AFFINITÉ

Permet de scheduler des pods en fonction des labelsSur un même nœud (collocation)Sur des nœuds différents

14 . 5

Page 162: FORMATION KUBERNETES - particule

AFFINITÉ / ANTI-AFFINITÉapiVersion: v1kind: Podmetadata: name: with-pod-affinityspec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S2 topologyKey: failure-domain.beta.kubernetes.io/zone

14 . 6

Page 163: FORMATION KUBERNETES - particule

TAINTS ET TOLERATIONS

Une taint permet l'inverse d'une affinitéPermet à un nœud de refuser des podsUtilisé pour dédier des nœuds à un certain usage

kubectl taint nodes node1 key=value:NoSchedule

14 . 7

Page 164: FORMATION KUBERNETES - particule

TAINTS AND TOLERATIONS

Aucun pod ne pourra être schedulé sur ce nœud à moinsde tolérer la taint:

apiVersion: v1kind: Podmetadata: name: nginx labels: env: testspec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent tolerations: - key: "key" operator: "Exists" effect: "NoSchedule"

14 . 8

Page 165: FORMATION KUBERNETES - particule

KUBERNETES : OBSERVABILITÉ ET MONITORING

15 . 1

Page 166: FORMATION KUBERNETES - particule

SONDES : READINESS AND LIVENESS

Permettent à Kubernetes de sonder l'état d'un pod etd'agir en conséquence2 types de sonde : Readiness et Liveness3 manières de sonder :TCP : ping TCP sur un port donnéHTTP: http GET sur une url donnéeCommand: Exécute une commande dans leconteneur

15 . 2

Page 167: FORMATION KUBERNETES - particule

SONDES : READINESS

Gère le trafic à destination du podUn pod avec une sonde readiness NotReady ne reçoitaucun traficPermet d'attendre que le service dans le conteneursoit prêt avant de router du traficUn pod Ready est ensuite enregistré dans lesendpoints du service associé

15 . 3

Page 168: FORMATION KUBERNETES - particule

SONDES : LIVENESS

Gère le redémarrage du conteneur en cas d'incidentUn pod avec une sonde liveness sans succès estredémarré au bout d'un intervalle définiPermet de redémarrer automatiquement les pods"tombés" en erreur

15 . 4

Page 169: FORMATION KUBERNETES - particule

SONDES : EXEMPLEapiVersion: v1kind: Podmetadata: name: goproxy labels: app: goproxyspec: containers: - name: goproxy image: k8s.gcr.io/goproxy:0.1 ports: - containerPort: 8080 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 20

15 . 5

Page 170: FORMATION KUBERNETES - particule

KUBERNETES : UTILISATION ET DÉPLOIEMENT DESRESSOURCES

16 . 1

Page 171: FORMATION KUBERNETES - particule

KUBERNETES : KUBECTL

Le seul (ou presque) outil pour interagir avec desclusters KubernetesUtilise un fichier de configuration (kubeconfig) pourcommuniquer avec l'API de KubernetesLe(s) fichier(s) se trouve(nt) par défaut dans~/.kube/configLe fichier de config. contient :

L'adresse(URI) de l'APIServerLes chemins des certificats TLS utilisés pourl'authentification

Fichier kubeconfig peut être passé en paramètre dekubectl avec le flag --kubeconfig

16 . 2

Page 172: FORMATION KUBERNETES - particule

KUBECONFIG

Un seul fichier pour gérer tous ses clusters avec troisinformations :

Serveurs (IP, CA Cert, Nom)Users (Nom, Certificat, Clé)Context, association d'un user et d'un serveur

Stocké par défaut dans ~/.kube/config

16 . 3

Page 173: FORMATION KUBERNETES - particule

KUBERNETES : KUBECTL

Afficher la liste des ressources API supportées par leserveur:

$ kubectl api-resourcesNAME SHORTNAMES APIGROUP NAMESPACED KINDconfigmaps cm true ConfigMaplimitranges limits true LimitRangenamespaces ns false Namespacenodes no false Nodepersistentvolumeclaims pvc true PersistentVolumeClaimpersistentvolumes pv false PersistentVolumepods po true Podsecrets true Secretservices svc true Servicedaemonsets ds apps true DaemonSetdeployments deploy apps true Deploymentreplicasets rs apps true ReplicaSetstatefulsets sts apps true StatefulSethorizontalpodautoscalers hpa autoscaling true HorizontalPodAutoscalercronjobs cj batch true CronJobjobs batch true Jobingresses ing extensions true Ingress

16 . 4

Page 174: FORMATION KUBERNETES - particule

KUBERNETES : KUBECTL

Afficher les noeuds du cluster :

Ces commandes sont équivalentes:

kubectl get nodes

kubectl get nokubectl get nodes

16 . 5

Page 175: FORMATION KUBERNETES - particule

KUBERNETES : KUBECTL

Afficher les namespaces

Par défaut, kubectl utilise le namespace defaultIl est possible de sélectionner un namespace avecl'option -n ou --namespace

kubectl get nskubectl get namespaces

kubectl -n kube-system get pods

16 . 6

Page 176: FORMATION KUBERNETES - particule

KUBERNETES : KUBECTL

Afficher les pods (pour le namespace default)kubectl get podskubectl get pod

16 . 7

Page 177: FORMATION KUBERNETES - particule

KUBERNETES : KUBECTL

Afficher les services (pour le namespace default):kubectl get serviceskubectl get svc

16 . 8

Page 178: FORMATION KUBERNETES - particule

KUBERNETES : CRÉATION D'OBJETS KUBERNETES

Les objets Kubernetes sont créés sous la forme defichiers JSON ou YAML et envoyés à l'APIServerPossible d'utiliser la commande kubectl run, maislimitée aux Deployments et aux JobsL'utilisation de fichiers YAML permet de les stockerdans un système de contrôle de version comme git,mercurial, etc...La documentation de référence pour l'APIKuberneteshttps://kubernetes.io/docs/reference/#api-reference

16 . 9

Page 179: FORMATION KUBERNETES - particule

KUBERNETES : CRÉATION D'OBJETS KUBERNETES

Pour créer un object Kubernetes depuis votre fichierYAML, utilisez la commande kubectl create :

Il est possible de créer des objets Kubernetes à partird'une URL :

kubectl create -f object.yaml

kubectl create -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/frontend-deployment.yaml

16 . 10

Page 180: FORMATION KUBERNETES - particule

KUBERNETES : CRÉATION D'OBJETS KUBERNETES

Pour les supprimer exécuter simplement :

Mettre à jour un objet Kubernetes en écrasant laconfiguration existante:

kubectl delete -f object.yaml

kubectl replace -f object.yaml

16 . 11

Page 181: FORMATION KUBERNETES - particule

KUBERNETES : KUBERNETES DASHBOARD

Interface graphique web pour les clustersKubernetesPermet de gérer les différents objets Kubernetescréés dans le(s) cluster(s).Installé par défaut dans minikube

16 . 12

Page 182: FORMATION KUBERNETES - particule

KUBERNETES : KUBERNETES DASHBOARD

Page 183: FORMATION KUBERNETES - particule

16 . 13

Page 184: FORMATION KUBERNETES - particule

KUBERNETES : KUBERNETES DASHBOARD

Pour déployer le Dashboard, exécuter la commandesuivante:

Pour accéder au Dashboard, il faut établir unecommunication entre votre poste et le clusterKubernetes :

L'accès se fait désormais sur :

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

$ kubectl proxy

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

16 . 14

Page 185: FORMATION KUBERNETES - particule

KUBERNETES : HELM

17 . 1

Page 186: FORMATION KUBERNETES - particule

QU'EST-CE QUE HELM ?

Outil de packaging d'application KubernetesDeveloppé en GoActuellement en v3Projet graduated de la CNCF

https://github.com/helm/helm

17 . 2

Page 187: FORMATION KUBERNETES - particule

POURQUOI HELM ?

Applique le principe DRY (Don't Repeat Yourself)Mécanisme de templating (Go templating)Variabilisation des ressources générées

Facilité de versionnement et de partage (repositoryHelm)Helm permet d'administrer les Releases

Rollbacks / upgrades d'applications

17 . 3

Page 188: FORMATION KUBERNETES - particule

CONCEPTS

ConceptConcept DescriptionDescription

Chart Ensemble de ressources permettant dedefinir une application Kubernetes

ConfigValeurs permettant de configurer un Chart(values.yaml)

Release Chart deployé avec une Config

17 . 4

Page 189: FORMATION KUBERNETES - particule

COMPARAISON AVEC DES MANIFESTS YAML

Permet de mettre en place le DRY (Don't RepeatYourself)

customisation via fichier de configuration YAMLDéfinition d'une seule source de vérité

Les ressources sont packagéesPackages déployés via des Releases

17 . 5

Page 190: FORMATION KUBERNETES - particule

STRUCTURE D'UN CHART

Chart.yaml pour définir le chart ainsi que sesmetadatasvalues.yaml sert à definir les valeurs de configurationdu Chart par défautcrds/: Dossier qui recense les CRDstemplates/: les templates de manifeste Kubernetesen YAML

17 . 6

Page 191: FORMATION KUBERNETES - particule

CHART.YAML

Le fichier de configuration du Chart dans lequel sontdéfinies ses metadatas.

---apiVersion: v2description: Hello World Chart.name: hello-world-examplesources: - https://github.com/prometheus-community/helm-chartsversion: 1.3.2appVersion: 0.50.3dependencies: []

17 . 7

Page 192: FORMATION KUBERNETES - particule

STRUCTURE DU VALUES.YAML

Chaque attribut est ensuite disponible au niveau destemplates

---### Provide a name in place of kube-prometheus-stack for `app:` labels##applicationName: ""

### Override the deployment namespace##namespaceOverride: ""

### Apply labels to the resources##commonLabels: {}

17 . 8

Page 193: FORMATION KUBERNETES - particule

SURCHARGE DU VALUES.YAML---# values-production.yamlcommonLabels: env: prod

tree.├── Chart.yaml├── templates│ ├── application.yaml│ ├── configuration.yaml│ └── secrets.yaml├── values-production.yaml├── values-staging.yaml└── values.yaml

17 . 9

Page 194: FORMATION KUBERNETES - particule

TEMPLATES

Helm permet de variabiliser les manifestes Kubernetes,permettant de créer et configurer des ressources

dynamiquement. Le langage Go Template est utilisé.apiVersion: apps/v1kind: Podmetadata: name: {{ .Chart.Name }} labels: app.kubernetes.io/managed-by: "Helm" chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" release: {{ .Release.Name | quote }} version: 1.0.0spec: containers: - image: "{{ .Values.helloworld.image.name }}:{{ .Values.helloworld.image.tag }}" name: helloworld

17 . 10

Page 195: FORMATION KUBERNETES - particule

GESTION DES REPOSITORIES

Un Repository Helm permet de distribuer etversionner des ChartsContient un index.yaml listant les Charts packagésdisponibles par versionDeux méthodes de déploiement possibles

Via HTTP en tant que fichiers statiquesVia OCI en utilisant une Registry (depuis Helmv3)

17 . 11

Page 196: FORMATION KUBERNETES - particule

COMMANDES COMMUNES$ helm repo add stable https://charts.helm.sh/stable"stable" has been added to your repositories$ helm repo update$ helm install stable/airflow --generate-namehelm install stable/airflow --generate-nameNAME: airflow-1616524477NAMESPACE: defaul...$ helm upgrade airflow-1616524477 stable/airflowhelm upgrade airflow-1616524477 stable/airflowRelease "airflow-1616524477" has been upgraded. Happy Helming!$ helm rollback airflow-1616524477Rollback was a success! Happy Helming!$ helm uninstall airflow-1616524477release "airflow-1616524477" uninstalled

17 . 12

Page 197: FORMATION KUBERNETES - particule

KUBECTL : ADVANCED USAGE

Il est possible de mettre à jour un service sansincident grâce ce qui est appelé le rolling-update.Avec les rolling updates, les ressources qu'expose unobjet Service se mettent à jour progressivement.Seuls les objets Deployment, DaemonSet etStatefulSet support les rolling updates.Les arguments maxSurge et maxUnavailabedéfinissent le rythme du rolling update.La commande kubectl rollout permet de suivreles rolling updates effectués.

17 . 13

Page 198: FORMATION KUBERNETES - particule

KUBECTL : ADVANCED USAGEapiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: selector: matchLabels: app: frontend replicas: 2 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate template: metadata: name: nginx labels: app: frontend spec: containers: - image: nginx:1.9.1 name: nginx

17 . 14

Page 199: FORMATION KUBERNETES - particule

KUBECTL : ADVANCED USAGE$ kubectl create -f nginx.yaml --recorddeployment.apps/nginx created

17 . 15

Page 200: FORMATION KUBERNETES - particule

KUBECTL : ADVANCED USAGE

Il est possible d'augmenter le nombre de pods avecla commande kubectl scale :

Il est possible de changer l'image d'un containerutilisée par un Deployment :

kubectl scale --replicas=5 deployment nginx

kubectl set image deployment nginx nginx=nginx:1.15

17 . 16

Page 201: FORMATION KUBERNETES - particule

KUBECTL : ADVANCED USAGE

Dry run. Afficher les objets de l'API correspondantsans les créer :

kubectl run nginx --image=nginx --dry-runDémarrer un container en utiliser une commandedifférente et des arguments différents :

Démarrer un Cron Job qui calcule π et l'affiche toutesles 5 minutes :

kubectl run nginx --image=nginx \--command -- <cmd> <arg1> ... <argN>

kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure \-- perl -Mbignum=bpi -wle 'print bpi(2000)'

17 . 17

Page 202: FORMATION KUBERNETES - particule

KUBECTL : ADVANCED USAGE

Se connecter à un container:

S'attacher à un container existant :

Accéder à un service via un port :

kubectl run -it busybox --image=busybox -- sh

kubectl attach my-pod -i

kubectl port-forward my-svc 6000

17 . 18

Page 203: FORMATION KUBERNETES - particule

KUBECTL : LOGGING

Utiliser kubectl pour diagnostiquer les applicationset le cluster kubernetes :

kubectl cluster-infokubectl get eventskubectl describe node <NODE_NAME>kubectl logs [-f] <POD_NAME>

17 . 19

Page 204: FORMATION KUBERNETES - particule

KUBECTL : MAINTENANCE

Obtenir la liste des noeuds ainsi que les informationsdétaillées :

kubectl get nodeskubectl describe nodes

17 . 20

Page 205: FORMATION KUBERNETES - particule

KUBECTL : MAINTENANCE

Marquer le noeud comme unschedulable (+ drainerles pods) et schedulable :

kubectl cordon <NODE_NAME>kubectl drain <NODE_NAME>kubectl uncordon <NODE_NAME>

17 . 21

Page 206: FORMATION KUBERNETES - particule

KUBERNETES: OÙ DEPLOYER ET COMMENT ?

18 . 1

Page 207: FORMATION KUBERNETES - particule

BARE METAL, PRIVATE ET PUBLIC CLOUDS

Managed - Kops - Kubespray - Kubeadm - Kube-aws -Symplegma

Cluster Deployment

Cluster Lifecycle

18 . 2

Page 208: FORMATION KUBERNETES - particule

INFRASTUCTURE AS CODE

IaC : Infrastructure as Code

Terraform - CloudFormation - Cloud DeploymentManager - OpenStack Heat - Azure Resource Manager

Infrastructure déclarée

Infrastructure immuable

18 . 3

Page 209: FORMATION KUBERNETES - particule

IMPLÉMENTATION DE RÉFÉRENCE

18 . 4

Page 210: FORMATION KUBERNETES - particule

QUE CHOISIR ?

Je veux utiliser KubernetesJe veux utiliser Kubernetes

Cloud ?

Cloud public ou privé ?

Configuration particulière ?

Multiple cloud providers ?

Homogénéité des outils ?

18 . 5

Page 211: FORMATION KUBERNETES - particule

LOCAL KUBERNETES

: Machine virtuelle locale: Kubernetes in Docker

: Kubernetes léger

MinikubeKindk3sDocker for Mac/Windows

18 . 6

Page 212: FORMATION KUBERNETES - particule

KUBERNETES MANAGÉ

18 . 7

Page 213: FORMATION KUBERNETES - particule

AWS EKS

Control plane managé par AWSAmazon Linux / UbuntuCloudFormation / / Terraform eksctl

18 . 8

Page 214: FORMATION KUBERNETES - particule

GKE

Control plane managé par GCPPremier sur le marchéCOS / UbuntuTerraform / Google Cloud SDK

18 . 9

Page 215: FORMATION KUBERNETES - particule

AZURE AKS

Control plane managé par Azure

18 . 10

Page 216: FORMATION KUBERNETES - particule

OPENSTACK MAGNUM

Control plane managé par OpenStackBasé sur OpenStack HeatProposé sur certains public cloud basés surOpenStack

18 . 11

Page 217: FORMATION KUBERNETES - particule

OUTILS DE DÉPLOIEMENTS AGNOSTIQUES

18 . 12

Page 218: FORMATION KUBERNETES - particule

KUBEADM

Outil officielofficiel de la communautéStable depuis v1.13.0Ne provisionne pas de machineFacilement personnalisabeRespect des best practicesPeut être utilisé par d'autres outils

18 . 13

Page 219: FORMATION KUBERNETES - particule

KUBESPRAY

Basé sur AnsibleDense, permet d'installer un nombre important depluginsMultiples OSSupport Kubeadm

18 . 14

Page 220: FORMATION KUBERNETES - particule

SYMPLEGMA

Basé sur AnsibleInspiré de Kubespray en plus légerCoreOS/UbuntuFull Kubeadm

18 . 15

Page 221: FORMATION KUBERNETES - particule

OUTILS DE DÉPLOIEMENTS SPÉCIFIQUES

18 . 16

Page 222: FORMATION KUBERNETES - particule

KUBE-AWS

Pure AWS CloudFormation StackCycle de release lentFacilement personnalisableCoreOS ❤

18 . 17

Page 223: FORMATION KUBERNETES - particule

KOPS

Déploie sur AWS/GCP/OpenStack et Digital OceanCycle de release lentFacilement personnalisableMultiples OSSupporte Cloudformation and Terraform

18 . 18

Page 224: FORMATION KUBERNETES - particule

KUBERNETES : SECURITÉ ET CONTROLE D'ACCÈS

19 . 1

Page 225: FORMATION KUBERNETES - particule

AUTHENTICATION & AUTORISATION

RBAC (Role Based Access Control)ABAC (Attribute-based access control)WebHookCertificatesToken

19 . 2

Page 226: FORMATION KUBERNETES - particule

RBAC

3 entités sont utilisées :

Utilisateurs représentés par les Users ou lesServiceAccountsRessources représentées par les Deployments, Pods,Services, etc...les différentes opérations possibles :create, list, get, delete, watch, patch

19 . 3

Page 227: FORMATION KUBERNETES - particule

RBAC

19 . 4

Page 228: FORMATION KUBERNETES - particule

SERVICE ACCOUNTS

Objet Kubernetes permettant d'identifier uneapplication s'éxecutant dans un podPar défaut, un ServiceAccount par namespaceLe ServiceAccount est formatté ainsi :

system:serviceaccount:<namespace>:<service_account_name>

19 . 5

Page 229: FORMATION KUBERNETES - particule

SERVICE ACCOUNTSapiVersion: v1kind: ServiceAccountmetadata: name: default namespace: default

19 . 6

Page 230: FORMATION KUBERNETES - particule

ROLE

L'objet Role est un ensemble de règles permettantde définir quelle opération (ou verbe) peut êtreeffectuée et sur quelle ressourceLe Role ne s'applique qu'à un seul namespace et lesressources liées à ce namespace

19 . 7

Page 231: FORMATION KUBERNETES - particule

ROLEkind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: namespace: default name: pod-readerrules:- apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"]

19 . 8

Page 232: FORMATION KUBERNETES - particule

ROLEBINDING

L'objet RoleBinding va allouer à un User,ServiceAccount ou un groupe les permissions dansl'objet Role associéUn objet RoleBinding doit référencer un Role dansle même namespace.L'objet roleRef spécifié dans le RoleBinding estcelui qui crée le liaison

19 . 9

Page 233: FORMATION KUBERNETES - particule

ROLEBINDINGkind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: read-pods namespace: defaultsubjects:- kind: User name: jane apiGroup: rbac.authorization.k8s.ioroleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io

19 . 10

Page 234: FORMATION KUBERNETES - particule

CLUSTERROLE

L'objet ClusterRole est similaire au Role à ladifférence qu'il n'est pas limité à un seul namespaceIl permet d'accéder à des ressources non limitées àun namespace comme les nodes

19 . 11

Page 235: FORMATION KUBERNETES - particule

CLUSTERROLEkind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: secret-readerrules:- apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]

19 . 12

Page 236: FORMATION KUBERNETES - particule

CLUSTERROLEBINDINGkind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: salme-reads-all-podssubjects:- kind: User name: jsalmeron apiGroup: rbac.authorization.k8s.ioroleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io

19 . 13

Page 237: FORMATION KUBERNETES - particule

RBACkubectl auth can-i get pods /--namespace=default /[email protected]

19 . 14

Page 238: FORMATION KUBERNETES - particule

NETWORKPOLICIES

La ressource NetworkPolicy est une spécificationpermettant de définir comment un ensemble depods communiquent entre eux ou avec d'autresendpointsLe NetworkPolicy utilisent les labels poursélectionner les pods sur lesquels s'appliquent lesrègles qui définissent le trafic alloué sur les podssélectionnésLe NetworkPolicy est générique et fait partie de l'APIKubernetes. Il est nécessaire que le plugin réseaudéployé supporte cette spécification

19 . 15

Page 239: FORMATION KUBERNETES - particule

NETWORKPOLICIES

DENY tout le trafic sur une applicationLIMIT le trafic sur une applicationDENY le trafic all non alloué dans un namespaceDENY tout le trafic venant d'autres namespacesexemples de Network Policies :https://github.com/ahmetb/kubernetes-network-policy-recipes

19 . 16

Page 240: FORMATION KUBERNETES - particule

NETWORKPOLICIES

Exemple de NetworkPolicy permettant de blocker letrafic entrant :

kind: NetworkPolicyapiVersion: networking.k8s.io/v1metadata: name: web-deny-allspec: podSelector: matchLabels: app: web ingress: []

19 . 17

Page 241: FORMATION KUBERNETES - particule

PODSECURITYPOLICIES

Permet de contrôler les privilèges d'un podPermet de définir ce qui est autorisé pendantl'exécution du podA utiliser dans un contexte multi-tenant et quand lespods ne viennent pas d'un tiers de confiancePeut-être combiné avec le RBACAttention: Activer cette fonctionnalité peutendommager votre environnementIl faut une PSP par défaut

19 . 18

Page 242: FORMATION KUBERNETES - particule

PODSECURITYPOLICIESapiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: name: restrictedspec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: 'MustRunAsNonRoot' readOnlyRootFilesystem: false

19 . 19

Page 243: FORMATION KUBERNETES - particule

ADMISSION CONTROLLERS

Interceptent les requêtes sur l'API KubernetesPeut effectuer des modifications si nécessairesConception personnalisée possible

19 . 20

Page 244: FORMATION KUBERNETES - particule

ADMISSION CONTROLLERS

DenyEscalatingExecImagePolicyWebhookNodeRestrictionPodSecurityPolicySecurityContextDenyServiceAccount

19 . 21

Page 245: FORMATION KUBERNETES - particule

CONCLUSION

20 . 1