kubernetes-userglusterfs / nfs ceph iscsi 7.2 kubernetes : volumes on déclare d'abord le...

117
KUBERNETES-USER 1

Upload: others

Post on 30-May-2020

34 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES-USER

1

Page 2: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

CONCERNANT CES SUPPORTS DE COURS

2 . 1

Page 3: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

SUPPORTS DE COURS RÉALISÉS PAR ALTER WAY CLOUDCONSULTING

ex Osones -

Copyright © 2014 - 2019 alter way CloudConsultingLicence : Sources : HTML/PDF :

Licence Creative Commons BY-SA 4.0

https://cloud-consulting.alterway.fr

Creative Commons BY-SA 4.0https://github.com/Alterway/formations/

https://osones.com/formations/

2 . 2

Page 4: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PROJET, GOUVERNANCE ETCOMMUNAUTÉ

3 . 1

Page 5: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

3 . 2

Page 6: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

CNCFThe Foundation’s mission is to create and drive the adoption of

a new computing paradigm that is optimized for moderndistributed systems environments capable of scaling to tens of

thousands of self healing multi-tenant nodes.

3 . 3

Page 7: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

CNCF : PRÉREQUISDistribuer sous forme de conteneursGestion dynamique de laconfigurationOrienté micro services

3 . 4

Page 8: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

CNCF : LES RÔLESIntendance des projetsFaire grossir et évoluer l'écosystèmeRendre la technologie accessiblePromouvoir la technologie

3 . 5

Page 9: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

OCICréé sous la Linux FondationBut : Créer un standard Open Source concernant la manièrede "runner" et le format des conteneurs et imagesNon lié à des produitsNon lié à des COErunC a été donné par Docker à l'OCI comme implémentionsde base

3 . 6

Page 10: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PROJETDocs : 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

3 . 7

Page 11: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PROJETHébergé sur Github :

:Issues : Pull Requests

Releases :

Projets en incubation : (Deprécié)

https://github.com/kubernetes/kuberneteshttps://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/

3 . 8

Page 12: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CYCLE DE DÉVELOPPEMENTChaque release a son propre planning, pour exemple :

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

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

3 . 9

Page 13: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

3 . 10

Page 14: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECONLa CNCF organise trois KubeCon par an :

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

3 . 11

Page 15: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : ARCHITECTURE

4 . 1

Page 16: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

4 . 2

Page 17: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : COMPOSANTS DU CONTROL PLANEetcd: Base de donnéeskube-apiserver : API server qui permet la configurationd'objets Kubernetes (Pod, Service, Deployment, etc.)kube-proxy : Permet le forwarding TCP/UDP et le loadbalancing entre les services et les backends (Pods)kube-scheduler : Implémente les fonctionnalités deschedulingkube-controller-manager : Responsable de l'état du cluster,boucle infinie qui régule l'état du cluster afin d'atteindre unétat désiré

4 . 3

Page 18: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : ETCDBase 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

4 . 4

Page 19: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBE-APISERVERLes configurations d'objets (Pods, Service, RC, etc.) se font vial'API serverUn point d'accès à l'état du cluster aux autres composantsvia une API RESTTous les composants sont reliés à l'API server

4 . 5

Page 20: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBE-SCHEDULERPlanifie les ressources sur le clusterEn fonction de règles implicites (CPU, RAM, stockagedisponible, etc.)En fonction de règles explicites (règles d'affinité et anti-affinité, labels, etc.)

4 . 6

Page 21: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBE-PROXYResponsable de la publication de servicesUtilise iptablesRoute les paquets à destination des PODs et réalise le loadbalancing TCP/UDP

4 . 7

Page 22: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBE-CONTROLLER-MANAGERBoucle infinie qui contrôle l'état d'un clusterEffectue des opérations pour atteindre un état donnéDe base dans Kubernetes : replication controller, endpointscontroller, namespace controller et serviceaccountscontroller

4 . 8

Page 23: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : AUTRES COMPOSANTSkubelet : Service "agent" fonctionnant sur tous les nœuds etassure le fonctionnement des autres serviceskubectl : Ligne de commande permettant de piloter uncluster Kubernetes

4 . 9

Page 24: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBELETService principal de KubernetesPermet à Kubernetes de s'auto configurer :

Surveille un dossier contenant les manifests (fichiers YAMLdes différents composant de Kubernetes).Applique les modifications si besoin (upgrade, rollback).

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

4 . 10

Page 25: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES: NETWORKKubernetes n'implémente pas de solution réseau par dé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 sans NAT

4 . 11

Page 26: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : AUJOURD'HUIVersion 1.16.x : stable en productionSolution complète et une des plusutiliséesÉprouvée par Google

4 . 12

Page 27: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CONCEPTS ET OBJETS

5 . 1

Page 28: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : API RESOURCESNamespacesPodsDeploymentsDaemonSetsJobsCronjobs

5 . 2

Page 29: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : NAMESPACESFournissent une séparation logique des ressources :

Par utilisateursPar projet / applicationsAutres...

Les objets existent uniquement au sein d'un namespacedonnéÉvitent la collision de nom d'objets

5 . 3

Page 30: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : LABELSSystème de clé/valeurOrganisent les différents objets de Kubernetes (Pods, RC,Services, etc.) d'une manière cohérente qui reflète lastructure de l'applicationCorrèlent des éléments de Kubernetes : par exemple unservice vers des Pods

5 . 4

Page 31: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : LABELSExemple de label :

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

5 . 5

Page 32: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : LABELSLa commande kubectl get pods, par défaut, ne liste pasles labels. Il est possible de les voir en utilisant--show-labels:

$ kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSnginx 1/1 Running 0 31s app=nginx,env=prod

5 . 6

Page 33: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PODEnsemble logique composé de un ou plusieurs conteneursLes conteneurs d'un pod fonctionnent ensemble(instanciation et destruction) et sont orchestrés sur un mêmehôteLes conteneurs partagent certaines spécifications du Pod :

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

C'est la plus petite et la plus simple unité dans Kubernetes

5 . 7

Page 34: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

apiVersion: v1kind: Podmetadata: name: nginxspec: containers: - name: nginx image: nginx ports: - containerPort: 80

5 . 8

Page 35: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : DEPLOYMENTPermet d'assurer le fonctionnement d'un ensemble dePodsVersion, Update et RollbackSouvent combiné avec un objet de type service

5 . 9

Page 36: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : DEPLOYMENTapiVersion: apps/v1kind: Deploymentmetadata: name: my-nginxspec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80

5 . 10

Page 37: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : DAEMONSETAssure que tous les noeuds exécutent une copie du pod surtous les noeuds du clusterNe connaît pas la notion de replicas.Utilisé pour des besoins particuliers comme :

l'exécution d'agents de collection de logs comme fluentdou logstashl'exécution de pilotes pour du matériel commenvidia-pluginl'exécution d'agents de supervision comme NewRelicagent, Prometheus node exporter

5 . 11

Page 38: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : DAEMONSETapiVersion: apps/v1kind: DaemonSetmetadata: name: ssd-monitor spec: selector: matchLabels: app: ssd-monitor template: metadata: labels: app: ssd-monitor spec: nodeSelector: disk: ssd containers: - name: main image: luksa/ssd-monitor

5 . 12

Page 39: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : STATEFULSETSimilaire au DeploymentLes pods possèdent des identifiants uniques.Chaque replica de pod est créé par ordre d'indexNécessite un Persistent Volume et un Storage Class.Supprimer un StatefulSet ne supprime pas le PV associé

5 . 13

Page 40: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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: nginx ports:

5 . 14

Page 41: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : JOBCrée des pods et s'assurent qu'un certain nombre d'entre euxse terminent avec succès.Peut éxécuter plusieurs pods en parallèleSi un noeud du cluster est en panne, les pods sontreschedulés vers un autre noeud.

5 . 15

Page 42: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

5 . 16

Page 43: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES: CRON JOBUn CronJob permet de lancer des Jobs de manière planifiée.la programmation des Jobs se définit au format Cronle champ jobTemplate contient la définition del'application à lancer comme Job.

5 . 17

Page 44: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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)"]

5 . 18

Page 45: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : NETWORKING

6 . 1

Page 46: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : NETWORK PLUGINSKubernetes n'implémente pas de solution de gestion deréseau par défautLe réseau est implémenté par des solutions tierces:

: IPinIP + BGP: eBPF

Bien

CalicoCiliumWeave

d'autres

6 . 2

Page 47: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CNI

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

Container Network Interface

6 . 3

Page 48: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SERVICESAbstraction des pods sous forme d'une IP virtuelle de serviceRendre un ensemble de pods accessibles depuis l'extérieurLoad Balancing entre les pods d'un même service

6 . 4

Page 49: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SERVICESLoad Balancing : intégration avec des cloud provider :

AWS ELBGCPAzure Kubernetes ServiceOpenStack

NodePort : chaque noeud du cluster ouvre un port statiqueet redirige le trafic vers le port indiquéClusterIP : IP dans le réseau privé Kubernetes (VIP)LoadBalancer : expose le service à l'externe en utilisant leloadbalancer d'un cloud provider (AWS, Google, Azure)

6 . 5

Page 50: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SERVICES

6 . 6

Page 51: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SERVICESExemple de service (on remarque la sélection sur le label et lemode d'exposition):

apiVersion: v1kind: Servicemetadata: name: frontend labels: app: guestbook tier: frontendspec: type: NodePort ports: - port: 80 selector: app: guestbook tier: frontend

6 . 7

Page 52: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SERVICESIl est aussi possible de mapper un service avec un nom de

domaine en spécifiant le paramètre spec.externalName.

kind: ServiceapiVersion: v1metadata: name: my-service namespace: prodspec: type: ExternalName externalName: my.database.example.com

6 . 8

Page 53: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES: INGRESSL'objet Ingress permet d'exposer un service à l'extérieurd'un cluster KubernetesIl permet de fournir une URL visible permettant d'accéder unService KubernetesIl permet d'avoir des terminations TLS, de faire du LoadBalancing, etc...

6 . 9

Page 54: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : INGRESSapiVersion: extensions/v1beta1kind: Ingressmetadata: name: osonesspec: rules: - host: blog.osones.com http: paths: - path: / backend: serviceName: osones-nodeport servicePort: 80

6 . 10

Page 55: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : INGRESS CONTROLLERPour utiliser un Ingress, il faut un Ingress Controller. Il existe

plusieurs offres sur le marché :

Traefik : Istio : Linkerd : Contour : Nginx Controller :

https://github.com/containous/traefikhttps://github.com/istio/istio

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

https://github.com/kubernetes/ingress-nginx

6 . 11

Page 56: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : STOCKAGE

7 . 1

Page 57: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : VOLUMESFournir du stockage persistent aux PODsFonctionnent de la même façon que les volumes Docker pourles volumes hôte :

EmptyDir ~= volumes dockerHostPath ~= volumes hôte

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

7 . 2

Page 58: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : VOLUMESOn déclare d'abord le volume et on l'affecte à un service :

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

7 . 3

Page 59: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : STORAGE CLASSPermet de définir les différents types de stockage disponiblesUtilisé par les Persistent Volumes pour solliciter unespace de stockage au travers desPersistent Volume Claims

7 . 4

Page 60: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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"

7 . 5

Page 61: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PERSISTENTVOLUMECLAIMSRessource utilisée et vue comme une requête pour solliciterdu stockage persistantOffre aux PV une variété d'options en fonction du casd'utilisationUtilisé par les StatefulSets pour solliciter du stockage(Utilisaltion du champ volumeClaimTemplates)

7 . 6

Page 62: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PERSISTENTVOLUMECLAIMSapiVersion: v1kind: PersistentVolumeClaimmetadata: name: storage-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: "slowl" selector: matchLabels: release: "stable" matchExpressions: - {key: capacity, operator: In, values: [10Gi, 20Gi]}

7 . 7

Page 63: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : PERSISTENTVOLUMEComposant de stockage dans le cluster kubernetesStockage externe aux noeuds du clusterCycle de vie d'indépendant du pod qui le consommePeut être provisionné manuellement par un administrateurou dynamiquement grâce un StorageClass

7 . 8

Page 64: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

7 . 9

Page 65: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CSI

Équivalent de CNI mais pour les volumesAvant Kubernetes 1.13, tous les drivers de volumes étaient intreeLe but de la séparation est de sortir du code du core deKubernetesGA depuis Kubernetes 1.13

Container Storage Interface

7 . 10

Page 67: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : GESTION DE LA CONFIGURATIONDES APPLICATIONS

8 . 1

Page 68: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CONFIGMAPSObjet Kubernetes permettant stocker séparer les fichiers deconfigurationIl peut être créé d'un ensemble de valeurs ou d'un fichierresource Kubernetes (YAML ou JSON)Un ConfigMap peut sollicité par plusieurs pods

8 . 2

Page 69: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CONFIGMAPSapiVersion: v1data: redis-config: | maxmemory 2mb maxmemory-policy allkeys-lrukind: ConfigMapmetadata: name: redis-config namespace: default

8 . 3

Page 70: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CONFIGMAP ENVIRONNEMENTapiVersion: v1kind: Podmetadata: name: dapi-test-podspec: containers: - name: test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: LOG_LEVEL valueFrom: configMapKeyRef: name: env-config

8 . 4

Page 71: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES: CONFIGMAP VOLUMEapiVersion: v1kind: Podmetadata: name: dapi-test-podspec: containers: - name: test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "ls /etc/config/" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: # Provide the name of the ConfigMap containing the files you want # to add to the container name: special-config restartPolicy: Never

8 . 5

Page 72: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SECRETSObjet Kubernetes de type secret utilisé pour stocker desinformations 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 data sontencodés en base64.Il est possible de directement créer un Secret spécifique àl'authentification sur un registre Docker privé.Il est possible de directement créer un Secret à partir d'uncompte utilisateur et d'un mot de passe.

8 . 6

Page 73: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETS : SECRETSS'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 une ConfigMaptls: certificat et clé pour utilisation avec un serveur webdocker-registry: utilisé en tant que imagePullSecret parun pod pour pouvoir pull les images d'une registry privée

8 . 7

Page 74: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SECRETS$ kubectl create secret docker-registry mydockerhubsecret \--docker-username="employeeusername" --docker-password="employeepassword" \--docker-email="[email protected]"

kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb'

8 . 8

Page 75: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : SECRETSapiVersion: v1kind: Secretmetadata: creationTimestamp: 2016-01-22T18:41:56Z name: mysecret namespace: default resourceVersion: "164619" uid: cfee02d6-c137-11e5-8d73-42010af00002type: Opaquedata: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm

8 . 9

Page 76: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : GESTION DES RESSOURCES

9 . 1

Page 77: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

PODS RESOURCES : REQUEST ET LIMITSPermettent de gérer l'allocation de ressources au sein d'unclusterPar défaut, un pod/container sans request/limits est en besteffortRequest: allocation minimum garantie (réservation)Limit: allocation maximum (limite)Se base sur le CPU et la RAM

9 . 2

Page 78: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

PODS RESOURCES : CPU1 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

9 . 3

Page 79: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

9 . 4

Page 80: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

9 . 5

Page 81: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

LIMITRANGESl'objet LimitRange permet de définir les valeurs minimaleset maximales des ressources utilisées par les containers et lespodsl'objet LimitRange s'applique au niveau du namespaceles limites spécifiées s'appliquent à chaque pod/containercréé dans le namespacele LimitRange ne limite pas le nombre total de ressourcesdisponibles dans le namespace

9 . 6

Page 82: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

9 . 7

Page 83: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

RESOURCEQUOTASun objet ResourceQuota limite le total des ressources decalcul consommées par les pods ainsi que le total de l'espacede stockage consommé par les PersistentVolumeClaimsdans un namespaceil permet aussi de limiter le nombre de pods, PVC et autresobjets qui peuvent être créés dans un namespace

9 . 8

Page 84: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

9 . 9

Page 85: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : OBSERVABILITÉ ET MONITORING

10 . 1

Page 86: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

SONDES : READINESS AND LIVENESSPermettent à Kubernetes de sonder l'état d'un pod et d'agiren 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 le conteneur

10 . 2

Page 87: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

SONDES : READINESSGère le trafic à destination du podUn pod avec une sonde readiness NotReady ne reçoit aucuntraficPermet d'attendre que le service dans le conteneur soit prêtavant de router du traficUn pod Ready est ensuite enregistrer dans les endpoints duservice associé

10 . 3

Page 88: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

SONDES : LIVENESSGère le redémarrage du conteneur en cas d'incidentUn pod avec une sonde liveness sans succès est redémarré aubout d'un intervalle définiPermet de redémarrer automatiquement les pods "tombés"en erreur

10 . 4

Page 89: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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:

10 . 5

Page 90: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : UTILISATION ET DÉPLOIEMENTDES RESSOURCES

11 . 1

Page 91: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECTLLe seul (ou presque) outil pour interagir avec des clustersKubernetesUtilise 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 de kubectlavec le flag --kubeconfig

11 . 2

Page 92: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECONFIGUn seul fichier pour gérer tous ses clusters avec trois

informations :

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

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

11 . 3

Page 93: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECTLAfficher 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

11 . 4

Page 94: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECTLAfficher les noeuds du cluster :

Ces commandes sontéquivalentes:

kubectl get nodes

kubectl get nokubectl get nodes

11 . 5

Page 95: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECTLAfficher les namespaces

Par défaut, kubectl utilise le namespace defaultIl est possible de sélectionner un namespace avec l'option -nou --namespace

kubectl get nskubectl get namespaces

kubectl -n kube-system get pods

11 . 6

Page 96: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECTLAfficher les pods (pour le namespacedefault)

kubectl get podskubectl get pod

11 . 7

Page 97: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBECTLAfficher les services (pour le namespacedefault):

kubectl get serviceskubectl get svc

11 . 8

Page 98: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CRÉATION D'OBJETS KUBERNETESLes objets Kubernetes sont créés sous la forme de fichiersJSON ou YAML et envoyés à l'APIServerPossible d'utiliser la commande kubectl run, mais limitéeaux Deployments et aux JobsL'utilisation de fichiers YAML permet de les stocker dans unsystème de contrôle de version comme git, mercurial, etc...La documentation de référence pour l'API Kuberneteshttps://kubernetes.io/docs/reference/#api-reference

11 . 9

Page 99: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CRÉATION D'OBJETS KUBERNETESPour créer un object Kubernetes depuis votre fichier YAML,utilisez la commande kubectl create :

Il est possible de créer des objets Kubernetes à partir d'uneURL :

kubectl create -f object.yaml

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

11 . 10

Page 100: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : CRÉATION D'OBJETS KUBERNETESPour les supprimer exécuter simplement :

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

kubectl delete -f object.yaml

kubectl replace -f object.yaml

11 . 11

Page 101: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBERNETES DASHBOARDInterface graphique web pour les clusters KubernetesPermet de gérer les différents objets Kubernetes créés dansle(s) cluster(s).Installé par défaut dans minikube

11 . 12

Page 102: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBERNETES DASHBOARD

Page 103: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

11 . 13

Page 104: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : KUBERNETES DASHBOARDPour déployer le Dashboard, exécuter la commandesuivante:

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

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/

11 . 14

Page 105: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : INTRODUCTION TO HELMUne application conçue pour faciliter l'installation et lagestion des applications sur Kubernetes.Il utilise un format de paquetage appelé Charts.Il est comparable à apt/yum/homebrew.Plusieurs charts existent déjà sur le répertoire officiel :https://github.com/kubernetes/charts.

11 . 15

Page 106: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : INTRODUCTION TO HELMTiller : Serveur Helm. Il interagit avec l'APIServer deKubernetes pour installer, mettre à jour et supprimer lesressources Kubernetes.Chart : Contient toutes les ressources définies et nécessairespour éxecuter une application ou un service à l'intérieur decluster Kubernetes. Un chart est pratiquement unregroupement de ressources Kubernetes pré-configurées.Release : Une instance d'un chart helm s'éxécutant dans uncluster Kubernetes.Repository : répertoire ou espace (public ou privé) où sontregroupés les charts.

11 . 16

Page 107: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBERNETES : INTRODUCTION TO HELMInstaller Helm (sur une distribution Linux):Deployer tiller : helm initVoir la liste des charts disponibles sur les répertoire officiel :helm searchAfficher la liste des charts disponibles pour prometheus :helm search prometheusAfficher les options disponibles dans un chart Helm:helm inspect stable/prometheus

11 . 17

Page 108: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECTL : ADVANCED USAGEIl est possible de mettre à jour un service sans incident grâcece qui est appelé le rolling-update.Avec les rolling updates, les ressources qu'expose un objetService se mettent à jour progressivement.Seuls les objets Deployment, DaemonSet etStatefulSet support les rolling updates.Les arguments maxSurge et maxUnavailabe définissentle rythme du rolling update.La commande kubectl rollout permet de suivre les rollingupdates effectués.

11 . 18

Page 109: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

11 . 19

Page 110: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

11 . 20

Page 111: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECTL : ADVANCED USAGEIl est possible d'augmenter le nombre de pods avec lacommande kubectl scale :

Il est possible de changer l'image d'un container utilisée parun Deployment :

kubectl scale --replicas=5 deployment nginx

kubectl set image deployment nginx nginx=nginx:1.15

11 . 21

Page 112: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECTL : ADVANCED USAGEDry run. Afficher les objets de l'API correspondant sans lescréer :

Démarrer un container en utiliser une commande différenteet des arguments différents :

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

kubectl run nginx --image=nginx --dry-run

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)'

11 . 22

Page 113: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECTL : ADVANCED USAGESe 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

11 . 23

Page 114: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECTL : LOGGINGUtiliser kubectl pour diagnostiquer les applications et lecluster kubernetes :

kubectl cluster-infokubectl get eventskubectl describe node <NODE_NAME>kubectl logs (-f) <POD_NAME>

11 . 24

Page 115: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

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

kubectl get nodeskubectl describe nodes

11 . 25

Page 116: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

KUBECTL : MAINTENANCEMarquer le noeud comme unschedulable (+ drainer les pods)et schedulable :

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

11 . 26

Page 117: KUBERNETES-USERGlusterFS / NFS Ceph iSCSI 7.2 KUBERNETES : VOLUMES On déclare d'abord le volume et on l'affecte à un service : apiVersion: v1 kind: Pod metadata: name: redis spec:

CONCLUSION

12 . 1