229
#DevoxxFR Kubernetes University Cap sur l’orchestration ! Cédric Hauber @cedboss Gérôme Egron @geromeegron Jean-Baptiste Claramonte @jbclaramonte 1

Kubernetes University, Cap sur l’orchestration Docker

Embed Size (px)

Citation preview

#DevoxxFR

Kubernetes UniversityCap sur l’orchestration !

Cédric Hauber @cedbossGérôme Egron @geromeegronJean-Baptiste Claramonte @jbclaramonte

1

#DevoxxFR 2

#DevoxxFR

Présentation des speakers

3

#DevoxxFR

Gérôme

@geromeegron

4

#DevoxxFR

Rejoignez-nous ☺

[email protected]

blog.xebia.fr

5

#DevoxxFR

Jean-Baptiste

@jbclaramonte

6

#DevoxxFR

Cedric

@cedboss

7

#DevoxxFR

Echangeons !

[email protected]

8

Cloud Designer Cloud Builder Cloud Runner

#DevoxxFR

Mais pourquoi Docker ?

9

#DevoxxFR

Il y a eu du changement

10

#DevoxxFR

Product Backlog Tâches du sprint

Planification de sprint

Revue de sprint

Sprint2 à 4

semaines

Produit enrichi

Les équipes sont devenues agiles

11

#DevoxxFR

Backend

DB

Frontend

Les architectures micro-services se sont répandues

12

#DevoxxFR

Backend

DB

Frontend

Gateway

DB

Frontend

Module 1 Module 2 Module 3

Les architectures micro-services se sont répandues

13

#DevoxxFR

Agilité Augmentation du nombre de livraisons

Micro-service

Augmentation du nombre de modules à livrer

14

#DevoxxFR

Amélioration des livraisons

15

#DevoxxFR

Scalabilité

16

#DevoxxFR

Et Docker est arrivé

17

#DevoxxFR

VM vs conteneurs

Guest OS

Bins /Libs

App#1

Hyperviseur

Host OS

Server

Guest OS

Bins /Libs

App#1

Guest OS

Bins /Libs

App#1

Bins /Libs

App#1

Host OS

Server

Bins /Libs

App#1

Bins /Libs

App#1

Docker engine

VM Container

18

#DevoxxFR

Raison de son succès

19

#DevoxxFR

Livraison

● Lorsque je livre mon application, je la livre avec son contexte d’exécution

● Je peux placer mon conteneur sur n’importe quelle machine où Docker est installé

20

#DevoxxFR

Démo

21

#DevoxxFR

Les premiers problèmes

22

#DevoxxFR

Application découpée en plusieurs conteneurs

Application Rethink db

23

#DevoxxFR

En local

● Partage du réseau hôte

● Utilisation de l’option Link de Docker

● Utilisation de l’API X-Networking

24

#DevoxxFR

Démo

25

#DevoxxFR

Sur un cluster ?

Nouvelles problématiques :

- Comment savoir où se trouvent les conteneurs- Que faire si un noeud tombe- Comment correctement allouer les ressources

26

#DevoxxFR

Comment les résoudre ?

27

Orchestrateur

28

#DevoxxFR

- Fleet- Swarm- Cattle (Rancher)- Mesos- Kubernetes

Lequel choisir ?

29

#DevoxxFR

Fleet

+

- Partie intégrante de CoreOS- Repose sur Etcd- Permet de maintenir des services systemd dans le cluster

-

- Orchestrateur bas niveau → Fonctions limitées

30

#DevoxxFR

Swarm

+

- Créé par Docker pour Docker- Repose sur Consul- Très simple d’utilisation

-

- Forte adhérence à l’API Docker- Pas de Health-Check, pas de LoadBalancing...

31

#DevoxxFR

Rancher

+

- Image minimaliste- OS orienté tout-conteneur- Interface de management- Kubernetes / Swarm / Cattle out of the box

-

- Installation parfois compliquée- Supporte uniquement Docker

32

#DevoxxFR

Kubernetes

+

- Profite du savoir-faire de Google en matière de Conteneurs- Repose sur Etcd- Compatible avec Docker & Rocket- Une communauté très établie- Regorge de fonctionnalités

-

- Mise en place parfois ardue

33

#DevoxxFR

Mesos - Marathon

+

- Déploiement rapide sur AWS / GCP / Azure- A fait ses preuves- Supporte plusieurs frameworks

-

- Une couche supplémentaire qui n’est pas nécessaire dans 90% des cas

34

“When you are not using Kubernetes to orchestrate Docker containers”Chris Baun

35

#DevoxxFR

Pourquoi Kubernetes

● La solution la plus aboutie● Preuve d’une expérience de plus de 10 ans● Grosse communauté● Opinionated● Cloud-Provider Aware :)● Production-Ready !● C’est super cool !

36

#DevoxxFR

Démo

37

#DevoxxFR

Cluster Kubernetes

38

#DevoxxFR 39

#DevoxxFR

node

(physical or virtual machine)

cluster

node

(physical or virtual machine)

node

(physical or virtual machine)

node

(physical or virtual machine)

node

(physical or virtual machine)

node

(physical or virtual machine)

40

#DevoxxFR

node

(physical or virtual machine)

cluster

Masternode

(physical or virtual machine)

Workernode

(physical or virtual machine)

Worker

node

(physical or virtual machine)

Workernode

(physical or virtual machine)

Workernode

(physical or virtual machine)

Worker

41

#DevoxxFR

Demo

42

#DevoxxFR

Kubernetes Binaries

43

#DevoxxFR

node (Master)

API-Server

Scheduler

Controller-Manager

Etcd

Kubernetes Binaries

44

#DevoxxFR

Etcd

● Développé par CoreOs● BDD Clé/Valeur distribuée ● Stocke l’état du cluster Kubernetes

45

#DevoxxFR

API-Server

● Point d’interface avec le cluster○ CLI: kubectl○ REST API

● Stateless○ Utilise etcd comme stockage

46

#DevoxxFR

API-Server

API-Server

SchedulerController-Manager

kubectl / http client

node (Master) node (Worker)

47

#DevoxxFR

Scheduler

● Vision globale des ressources du cluster

● Distribue les conteneursd’applications dans le cluster

48

#DevoxxFR

Scheduler

API-Server

SchedulerController-Manager

node (Master) node (Worker)

Pod

49

#DevoxxFR

Controller-Manager

● C’est la boucle de contrôle pour toutes les ressources Kubernetes

● Assure l’état du cluster

50

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Kubernetes Binaries

51

#DevoxxFR

Kubelet

● Agent principal sur chaque Node● Reçoit les demandes de création

de Pod● Monte les Volumes des Pods● Lance les conteneurs● Rapporte l’état des

pods/conteneurs à l’API-Server

52

#DevoxxFR

Kubelet

API-Server

Kubelet

Kube-Proxy

node (Master) node (Worker)

Pod

53

#DevoxxFR

Kube-Proxy

● Observe l’ajout/suppression de Services et Endpoints

● Met à jour iptables

54

#DevoxxFR

API-Server

Kubelet

Kube-Proxy

node (Master) node (Worker)

watch

Kube-Proxy

55

#DevoxxFR

Démo

56

#DevoxxFR

Pod

57

#DevoxxFR

Pod

● Plus petite unité logique

● Encapsule un ou plusieurs conteneurs

○ Partage de contexte

● Unité pouvant être répliquée

● Lié à un node

● Existence temporaire

58

#DevoxxFR

IP

node Worker

kubernetes binaries

Virtual IP

Pod

Virtual IP

Pod

59

#DevoxxFR

Labels

60

#DevoxxFR

Labels (everywhere)

61

#DevoxxFR

Labels

• Pairs clé/valeur

• Attachable à tous les éléments de kubernetes

• Donner du sens aux objets de kubernetes

62

#DevoxxFR

node node node

node node node

disk: ssddisk: ssd

disk: ssd

gpu: true

disk: ssd

gpu: true

disk: ssd

63

#DevoxxFR

node Worker

Pod

Pod

role: database

role: webfront

fwk: angular2

pods can have labels

64

#DevoxxFR

kubectl get pods -l release=stable, tier=frontend

kubectl get pods -l release in stable, tier in (frontend)’

kubectl get pods -l release in (stable, canary)’

kubectl get pods -l ‘release notin (stable)

Requêtage évolué

65

#DevoxxFR

Replication controller

66

#DevoxxFR

node Worker

Pod

role: database

selector

Replication controller

templatereplicas: 2

Pod

role: database

67

#DevoxxFR

node Worker

Pod

role: database

selector

Replication controller

templatereplicas: 2

Pod

role: database

68

#DevoxxFR

node Worker

Pod

role: database

selector

Replication controller

templatereplicas: 2

69

#DevoxxFR

node Worker

Pod

role: database

selector

Replication controller

templatereplicas: 2

Pod

role: database

70

#DevoxxFR

node Worker

Pod

role: database

selector

Replication controller

templatereplicas: 2

Pod

role: database

71

#DevoxxFR

Replica Sets

72

#DevoxxFR

node Worker

Pod

Pod

Create & healthcheck

ReplicaSet

73

#DevoxxFR

Service

74

#DevoxxFR

node Worker

Pod

Load balancing Service

role: database

Pod

role: database

75

node Worker node Worker

Pod

role: application

#DevoxxFR

Démo

76

#DevoxxFR 77

node Worker

PodService

rethinkdbdb: rethinkdbrole: replica

node Worker

Servicetodo-app

Pod

app: todo

#DevoxxFR

La communication inter-noeud

78

#DevoxxFR

Plusieurs solutions

79

- Google Compute Advanced Routing- Flannel- OpenVSwitch- Weave- Calico- Romana

#DevoxxFR

node

(physical or virtual machine)

Masternode

(physical or virtual machine)

Workernode

(physical or virtual machine)

Worker

node

(physical or virtual machine)

Workernode

(physical or virtual machine)

Workernode

(physical or virtual machine)

Worker

80

#DevoxxFR

node

(physical or virtual machine)

Flannel

Masternode

(physical or virtual machine)

Workernode

(physical or virtual machine)

Worker

node

(physical or virtual machine)

Workernode

(physical or virtual machine)

Workernode

(physical or virtual machine)

Worker

81

#DevoxxFR

Pod

82

#DevoxxFR

Virtual IP

Pod

ContainerContainer

Container

83

#DevoxxFR

Virtual IP

Pod

ContainerContainer

Container

84

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

85

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

86

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

MAC

Node IP

Container / Pod IP

Packet

Packet Flannel

87

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

MAC

Node IP

Container / Pod IP

Packet

Packet Flannel

88

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

MAC

Node IP

Container / Pod IP

Packet

Packet Flannel

89

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

90

#DevoxxFR

Pod

rethinkdb1

Pod

app2

Pod

rethinkdb2

Pod

app1

10.2.1.2

10.2.1.5

10.2.2.3

10.2.2.2

Doc

ker

10.2

.1.1

/24

Flan

nel

10.2

.1.0

/16

Doc

ker

10.2

.2.1

/24

Flan

nel

10.2

.2.0

/16

Eth

erne

t19

2.16

8.0.

100

Eth

erne

t19

2.16

8.0.

100

91

#DevoxxFR

Démo

92

#DevoxxFR

Service

93

#DevoxxFR

ServiceProblème :

un Pod est éphémèreson adresse IP également

Solution : le service joue le rôle d’ambassadeur en fournissant une adresse ip durable Il joue également le rôle de load balancer

94

#DevoxxFR

Différents types de Service

• ClusterIP• NodePort• LoadBalancer

95

#DevoxxFR

ClusterIP

• Par défaut• IP Uniquement accessible depuis le cluster

• Virtual IP

96

#DevoxxFR

node Worker

Virt IP

Pod my-app

node Worker

IPIP

97

#DevoxxFR

node Worker

Virt IP

Pod my-app

node Worker

IPIP Pod another-app

98

#DevoxxFR

node Worker

Virt IP

Pod my-app

node Worker

IPIP Pod another-app

99

#DevoxxFR

node Worker

Virt IP

Pod my-app

Virt IPService my-app

node Worker

IPIP

100

#DevoxxFR

node Worker

Virt IP

Pod my-app

Virt IPService my-app

node Worker

IPIP Pod another-app

101

#DevoxxFR

node Worker

Virt IP

Pod my-app

Virt IPService my-app

node Worker

IPIP Pod another-app

102

#DevoxxFR

HOME=/rootHOSTNAME=another-app-a6nvu-ws5i4KUBERNETES_PORT_443_TCP_PORT=443KUBERNETES_PORT=tcp://10.0.0.1:443KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_HOST=10.0.0.1KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443MY_APP_PORT_80_TCP=tcp://10.0.0.242:80MY_APP_SERVICE_PORT=80MY_APP_SERVICE_HOST=10.0.0.242MY_APP_PORT_80_TCP_PORT=80MY_APP_PORT=tcp://10.0.0.242:80MY_APP_PORT_80_TCP_PROTO=tcpMY_APP_PORT_80_TCP_ADDR=10.0.0.242NGINX_VERSION=1.9.14-1~jessiePATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPWD=/SHLVL=1

Dans le pod another-app

103

#DevoxxFR

Accès via DNS

• Utilise le addon Kubernetes “SkyDNS”

<service-name>.<namespace>.svc.cluster.local

Ou tout simplement

<service-name>

104

#DevoxxFR

Démo

105

#DevoxxFR

NodePort

• Kubernetes alloue un port :• [30 000 - 32 767]

• Tous les Nodes du cluster vont exposer ce port

• Kubernetes expose alors le service :• <Node IP>:<NodePort>

106

#DevoxxFR

node Worker

Pod my-app

Service my-app

node WorkerLabel selector

107

#DevoxxFR

node Worker

Pod my-app

Service my-app

node Worker

IP:<NodePort>IP:<NodePort>

Label selector

108

#DevoxxFR

node Worker

Pod my-app

Service my-app

node Worker

IP:<NodePort>IP:<NodePort>

Label selector

109

#DevoxxFR

node Worker

Pod my-app

Service my-app

node Worker

IP:<NodePort>IP:<NodePort>

Label selector

110

#DevoxxFR

node Worker

Pod my-app

Service my-app

node Worker

IP:<NodePort>IP:<NodePort>

Label selector

111

#DevoxxFR

node Worker

Pod my-app

Service my-app

node Worker

IP:<NodePort>IP:<NodePort>

Label selector

112

#DevoxxFR

Différences ClusterIP / NodePort

# type=NodePort

Name: my-app-node-portNamespace: defaultLabels: run=my-appSelector: run=my-appType: NodePortIP: 10.0.0.246Port: <unset> 80/TCPNodePort: <unset> 30084/TCPEndpoints: 172.17.0.2:80Session Affinity: None

# type=ClusterIP

Name: my-appNamespace: defaultLabels: run=my-appSelector: run=my-appType: ClusterIPIP: 10.0.0.242Port: <unset> 80/TCP

Endpoints: 172.17.0.2:80Session Affinity: None

113

#DevoxxFR

Service load balancer

• Fonctionne uniquement pour certains Cloud Providers• GCP• AWS• RackSpace• OpenStack

114

#DevoxxFR

node W

orker

Pod my-app

Cluster kubernetes

Cloud provider

node W

orkerPod my-app

node W

orker

Pod my-app

Load balancer

115

#DevoxxFR

Démo

116

#DevoxxFR

Deployments

- Permet de déployer facilement des applications- Supporte plusieurs types de mises à jour :

- Rolling Update- Replace- A/B Deployment

- Il n’a pas vocation à remplacer le ReplicationController

117

#DevoxxFR

Rolling Update

● Une application sera mise à jour de multiples fois au cours de son existence

● Cette procédure de mise à jour doit donc être simple et automatisée

● C’est d’autant plus vrai dans un cluster● Kubernetes a pensé à vous

118

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1

119

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1 Pod v.2

120

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.2

121

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1 Pod v.2

node Worker

Pod v.2

122

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.2

node Worker

Pod v.2

123

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

Pod v.2

ReplicaSet

node Worker

Pod v.2

node Worker

Pod v.2

124

#DevoxxFR

node Worker

ReplicaSet

Pod v.2

ReplicaSet

node Worker

Pod v.2

node Worker

Pod v.2

125

#DevoxxFR

node Worker

Pod v.2

ReplicaSet

node Worker

Pod v.2

node Worker

Pod v.2

126

#DevoxxFR

Démo

127

#DevoxxFR

A/B Deployment

● Nous déployons une nouvelle version de l’application● Une fois testée, nous redirigons le trafic sur celle-ci

128

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1

Service

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

129

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1 Pod v.2

Service

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v2

130

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1 Pod v.2Pod v.2

Service

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v2

app: todoversion: v2

131

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1 Pod v.2Pod v.2Pod v.2

Service

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

132

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1 Pod v.2Pod v.2Pod v.2

Service

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

133

#DevoxxFR

node Worker

ReplicaSet

node Worker node Worker

Pod v.2Pod v.2Pod v.2

Service

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

134

#DevoxxFR

Démo

135

#DevoxxFR

Replace

● L’ancienne version de l’application est supprimée● La nouvelle version nest déployée

136

#DevoxxFR

node Worker

Pod v.1

ReplicaSet

ReplicaSet

node Worker

Pod v.1

node Worker

Pod v.1

Service

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

app: todoversion: v1

137

#DevoxxFR

node Worker

ReplicaSet

node Worker node Worker

Pod v.2

Service

app: todoversion: v2

app: todoversion: v2

138

#DevoxxFR

node Worker

ReplicaSet

node Worker node Worker

Pod v.2Pod v.2

Service

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

139

#DevoxxFR

node Worker

ReplicaSet

node Worker node Worker

Pod v.2Pod v.2Pod v.2

Service

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

app: todoversion: v2

140

#DevoxxFR

Démo

141

#DevoxxFR

Health checking

142

#DevoxxFR

Cycle de vie

Pending

143

#DevoxxFR

Cycle de vie

Pending Running

144

#DevoxxFR

Cycle de vie

Pending Running

Failed

Succeeded

145

#DevoxxFR

Cycle de vie

Pending Running

Failed

Succeeded

Unknown

146

#DevoxxFR

Connaître l’état d’un conteneur

Rôle de l’agent Kubelet qui est présent sur chacun des nodes.

Est-ce que mon conteneur est prêt ?

→ Readiness probe

Est-ce que mon conteneur est vivant ?

→ Liveness probe

147

#DevoxxFR

Handlers disponibles

- HTTP Health checks

- Container exec

- TCP Socket

148

#DevoxxFR

Résultats possibles

- Success

- Failure

- Unknown

149

#DevoxxFR

Et la réaction ?

Readiness échoue → le pod garde son état mais n’est plus accessible

Liveness échoue → dépend de la politique de redémarrage

150

#DevoxxFR

Politique de redémarrage

- Always

- On failure

- Never

151

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Pod

152

running

Conteneur

Restart policy : never

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Pod

153

running

Conteneur

Restart policy : never

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Pod

154

failed

Conteneur

Restart policy : never

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Pod

155

running

Conteneur

Restart policy : Always ou onFailure

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Pod

156

running

Conteneur

Restart policy : Always ou onFailure

#DevoxxFR

node (Worker)

Kube-ProxyKubelet

Docker

Pod

157

running

Conteneur

Restart policy : Always ou onFailure

#DevoxxFR

Volumes

158

#DevoxxFR

Le problème

Les Pods sont éphémères

Quand ils disparaissent leurs données disparaissent également

159

#DevoxxFR

La Solution

Les Volumes

Un Volume permet de créer un point de montage dans le conteneur d’un pod

160

#DevoxxFR

Plusieurs types de Volumes

● emptyDir● hostPath● gitRepo● Secret

● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)

● gcePersistentDisk● awsElasticBlockStore● azureFileVolume

● persistentVolumeClaim

Sur le NodeNon persistent

161

#DevoxxFR

Plusieurs types de Volumes

● emptyDir● hostPath● gitRepo● Secret

● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)

● gcePersistentDisk● awsElasticBlockStore● azureFileVolume

● persistentVolumeClaim

Sur le NodeNon persistant

Partage RéseauPersistant

162

#DevoxxFR

Plusieurs types de Volumes

● emptyDir● hostPath● gitRepo● Secret

● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)

● gcePersistentDisk● awsElasticBlockStore● azureFileVolume

● persistentVolumeClaim

Sur le NodeNon persistant

Partage RéseauPersistant

Accès stockage Cloud ProviderPersistant

163

#DevoxxFR

Plusieurs types de Volumes

● emptyDir● hostPath● gitRepo● Secret

● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)

● gcePersistentDisk● awsElasticBlockStore● azureFileVolume

● persistentVolumeClaim

Sur le NodeNon persistant

Partage RéseauPersistant

Accès stockage Cloud ProviderPersistant

Représente une demande d’espace de stockage

164

#DevoxxFR

emptyDir

Répertoire créé sur le host et alloué au conteneur

Survit au crash du conteneur

Peut être associé à de la RAM

Supprimé lors de l’arrêt/déplacement du Pod

A utiliser typiquement comme espace de travail temporaire

165

#DevoxxFR

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

La déclaration du volume

166

#DevoxxFR

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

La déclaration du volume

Montage du volume dans le conteneur

167

#DevoxxFR

hostPath

Accès à un répertoire spécifique du Node

Suppose que tous les Nodes ont la même arborescence

En général utilisation déconseillée sauf si vous savez ce que vous faites

168

#DevoxxFR

Secret

- Permettent de stocker des informations sensibles:- Mot de passe- Clés SSH- Information d’authentification- …

- Stockés en clair dans Etcd- Ne sont pas cryptés- Ne sont pas stockés sur les noeuds

169

#DevoxxFR

Secret$ echo "1f2d1e2e67df" | base64MWYyZDFlMmU2N2RmCg==

$ echo "admin" | base64YWRtaW4K

170

apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2RmCg== username: YWRtaW4K

#DevoxxFR

Secret

171

apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2RmCg== username: YWRtaW4K

apiVersion: v1kind: Podmetadata: name: mysql labels: name: mysqlspec: containers: - image: mysql:5.6 name: mysql volumeMounts: - name: mysql-secret mountPath: /etc/mysql reaOnly: true volumes: - name: mysql-secret secret: secretName: mysecret

Récupération comme un Volume

#DevoxxFR

Secret

172

apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2RmCg== username: YWRtaW4K

apiVersion: v1kind: Podmetadata: name: mysql labels: name: mysqlspec: containers: - image: mysql:5.6 name: mysql env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password

Récupération dans des variables d’environnement

#DevoxxFR

nfs

Permet de monter un partage NFS

Pour pré-charger des données utilisées par le Pod

Pour persister les données au delà de la vie du Pod

173

#DevoxxFR

nfsapiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: nfs-redis-storage mountPath: /data/redis volumes: - name: nfs-redis-storage nfs: 192.168.10.3 path: /export/redis

La déclaration du volume nfs

174

#DevoxxFR

nfsapiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: nfs-redis-storage mountPath: /data/redis volumes: - name: nfs-redis-storage nfs: 192.168.10.3 path: /exports/redis

La déclaration du volume

Montage du volume dans le conteneur

175

#DevoxxFR

Plusieurs types de Volumes

● emptyDir● hostPath● gitRepo● Secret

● nfs● iscsi● flocker● glusterfs● Rbd (Ceph)

● gcePersistentDisk● awsElasticBlockStore● azureFileVolume

● persistentVolumeClaim

Celui-ci est particulier !

176

#DevoxxFR

persistentVolumeClaim

Permet une abstraction du type de volume utilisé

Sépare l’offre et la demande d’utilisation d’espace de stockage

177

#DevoxxFR

1. L’admin créee un PV

nfs-pv

NFSStockage Réseau:

Persistent Volume:

Provisionning

178

#DevoxxFR

nfs-pv.yaml

apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"

Provisioningpar l’admin du cluster de 1 Go

179

#DevoxxFR

nfs-pv.yaml

apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"

Le PV autorise ici la lecture et l’écriture par un seul container

180

#DevoxxFR

nfs-pv.yaml

apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"

Possible aussi:● ReadOnlyMany● ReadWriteMany

181

#DevoxxFR

my-redis-persistence-volume-claim2. Le Dev “claims” des PV

nfs-pv

NFSStockage Réseau:

Persistent Volume:

Binding

182

#DevoxxFR

apiVersion: v1kind: PersistentVolumeClaimapiVersion: v1metadata: name: my-redis-persistence-volume-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi

my-redis-persistence-volume-claim.yamlapiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"

Bindingpar un développeur

ReadWriteOnceReadOnlyManyReadWriteMany

183

#DevoxxFR

my-redis-persistence-volume-claim

3. Le Dev utilise le claim dans un pod

nfs-pv

NFSStockage Réseau:

Persistent Volume:

Poddb

node (Worker) Using

184

#DevoxxFR

apiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: my-redis-persistence-volume mountPath: "/data/redis volumes: - name: my-redis-persistence-volume persistentVolumeClaim: claimName: my-redis-persistence-volume-claim

apiVersion: v1kind: PersistentVolumeClaimapiVersion: v1metadata: name: my-redis-persistence-volume-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi

my-redis-pod.yamlapiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"

185

#DevoxxFR

apiVersion: v1kind: Podmetadata: name: redisspec: containers: - name: redis image: redis volumeMounts: - name: my-redis-persistence-volume mountPath: "/data/redis volumes: - name: my-redis-persistence-volume persistentVolumeClaim: claimName: my-redis-persistence-volume-claim

apiVersion: v1kind: PersistentVolumeClaimapiVersion: v1metadata: name: my-redis-persistence-volume-claimspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi

my-redis-pod.yamlapiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: server: 10.20.23.43 path: "/some/path"

Montage

186

#DevoxxFR

my-redis-persistence-volume-claim4. Le Dev supprime le Pod et le PVC

nfs-pv

NFSStockage Réseau:

Persistent Volume:

Releasing

Poddb

node (Worker)

187

#DevoxxFR

Le Persistent Volume passe à l’état “released”

nfs-pv

NFSStockage Réseau:

Persistent Volume:

node (Worker) Releasing

188

#DevoxxFR

La “reclaim policy” utilisée lors de la création du PV indique la strategie de remise dans le pool:

Retain : opération manuelleRecycle : nettoyage auto (rm -rf /thevolume/*)

nfs-pv

NFSStockage Réseau:

Persistent Volume:

node (Worker) Reclaiming

189

#DevoxxFR

PV concernés

● GCEPersistentDisk● AWSElasticBlockStore● NFS● iSCSI● RBD (Ceph Block Device)● Glusterfs● HostPath

190

#DevoxxFR

Namespace

191

#DevoxxFR

A quoi ça sert ?

Différents environnements

Cloisonnement

192

#DevoxxFR

nodePod nodePod node PodPodPod

Node 1 Node 2 Node 3

Namespace A

Namespace B

193

#DevoxxFR

nodePod nodePod node PodPodPod

Node 1 Node 2 Node 3

Namespace A

Namespace B

194

#DevoxxFR

nodePod nodePod node PodPodPod

Node 1 Node 2 Node 3

Namespace A

Namespace B

195

#DevoxxFR

nodePod nodePod node PodPodPod

Node 1 Node 2 Node 3

Namespace A

Namespace B

196

#DevoxxFR

Démo

197

#DevoxxFR

D’autres possibilités de Kubernetes

198

#DevoxxFR

Limiter l’utilisation des ressources par un Pod

199

#DevoxxFR

Limitations

Limitation du CPU

Limitation de la mémoire

Configuration par conteneur

200

#DevoxxFR

resourcesapiVersion: v1kind: Podmetadata: labels: run: my-nginx name: my-nginx namespace: default spec: containers: - image: nginx name: my-nginx resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80 protocol: TCP

201

#DevoxxFR

Horizontal scaling

202

#DevoxxFR

Horizontal scaling

Ajuste automatiquement le nombre de réplicas pour satisfaire la demande

Utilise l’utilisation de CPU comme mesure pour déterminer le nombre de réplicas nécessaires

203

#DevoxxFR

Pod

ReplicaSet

Pod

Pod

204

HorizontalPod

Autoscaler Scale

#DevoxxFR

Stratégie de placement des pods

205

#DevoxxFR

• Par défaut : “n’importe où dans le cluster”• Il est possible d’orienter le scheduler avec

l’attribut• nodeSelector + l’utilisation des labels

206

#DevoxxFR

apiVersion: v1kind: Podmetadata: labels: run: my-nginx name: my-nginx namespace: default spec: containers: - image: nginx name: my-nginx ports: - containerPort: 80 protocol: TCP nodeSelector: disktype: ssd

nodeSelector

207

#DevoxxFR

Daemon Sets

208

#DevoxxFR

Daemon Sets

- S’assure que tous les nodes exécute un Pod définit en tant que template

- Très utile pour des services de supervision

209

#DevoxxFR

Jobs

210

#DevoxxFR

Jobs

- Lance un ou plusieurs Pods et renvoie le résultat (success, fail) d’exécution de ceux-ci

- Il nettoie ensuite les Pods et garde en mémoire une trace des exécutions

211

#DevoxxFR

Je veux tester !

Kubernetes.io

kmachine

Google Container Engine

Open Shift v3

212

#DevoxxFR

Haute disponibilité

213

#DevoxxFR

3 règles

214

- Un cluster Etcd

- Volume durable

- Un master par zone

#DevoxxFR 215

nodeMaster

Zone A

nodeWorker

nodeMaster

Zone B

nodeWorker

nodeMaster

Zone C

nodeWorker

podmaster podmaster podmaster

#DevoxxFR

Kubernetes dans la vraie vie ?

216

#DevoxxFR

Bi-Sam

- Solution BI à destination des fonds d’investissements- Hébergée chez RackSpace (Openstack)- Base de données Oracle → Cloud hybride- Besoin

- Haute disponibilité- Cloisonnement entre les clients- Scaling rapide

217

#DevoxxFR

Episode I

Docker, en avant toute !

218

#DevoxxFR

Episode II

CoreOS, Fleet, Etcd → Mes conteneurs tu protègeras

219

#DevoxxFR

Episode III

Par l’orchestration du vainqueras

220

#DevoxxFR

Episode IV

À mon environnement tu t’adapteras

221

#DevoxxFR

Episode V

Des statistiques et des logs tu m’enseigneras

222

#DevoxxFR

Episode VI

À la production tu survivras

223

#DevoxxFR

Démos raspberry

224

#DevoxxFR 225

#DevoxxFR

#DevoxxFR 227

Disclaimer

#DevoxxFR

Questions ?

228

#DevoxxFR

Merci

229