-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathkubernetes.php
More file actions
481 lines (431 loc) · 23.6 KB
/
Copy pathkubernetes.php
File metadata and controls
481 lines (431 loc) · 23.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
<!DOCTYPE html>
<html lang="it" class="theme-auto">
<head>
<script defer src="https://analytics.morrolinux.it/script.js" data-website-id="a24a12a5-ee97-49b1-8fb0-ff80b73816f1"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap core CSS -->
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/style.css" rel="stylesheet">
<!-- Chrome Mobile Top Bar Color-->
<meta name="theme-color" content="#343a40" />
<meta name="description" content="Kubernetes Per Comuni Mortali è il modo più semplice per passare da Docker all'orchestrazione dei container, senza essere sopraffatti dalla complessità.">
<link rel="canonical" href="https://corsolinux.com/kubernetes">
<title>Kubernetes Per Comuni Mortali | Corso Linux</title>
<?php include 'snippets/theme-init.php';?>
</head>
<body id="page-top" class="landing-page" style="--accent: #326ce5;">
<?php
// Statistiche pubbliche del corso su Udemy. Finché non c'è un id in
// data/corsi.php il catalogo restituisce zero e la fascia dei contatori
// resta nascosta.
include_once 'snippets/catalogo.php';
$stats = catalogo_statistiche(null, array('kubernetes'));
$subs = $stats['subs'];
$lessons = $stats['lessons'];
$reviews = $stats['reviews'];
$show_counters = ($subs > 0 || $lessons > 0 || $reviews > 0);
?>
<?php include 'snippets/promo-banner.php';?>
<?php include 'snippets/udemy-coupons.php';?>
<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top" id="mainNav">
<div class="container">
<a class="navbar-brand js-scroll-trigger font-weight-light" href="index.php"><b>CorsoLinux</b>.com</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a data-umami-event="kubernetes_navbar_corsi" class="nav-link js-scroll-trigger" href="#kubernetes">Kubernetes</a>
</li>
<li class="nav-item">
<a data-umami-event="kubernetes_navbar_programma" class="nav-link js-scroll-trigger" href="#programma">Programma</a>
</li>
<li class="nav-item">
<a data-umami-event="kubernetes_navbar_faq" class="nav-link js-scroll-trigger" href="#faq">FAQ</a>
</li>
<li class="nav-item">
<a data-umami-event="kubernetes_navbar_altri_corsi" class="nav-link js-scroll-trigger" href="#corsi">Corsi</a>
</li>
<li class="nav-item">
<a data-umami-event="kubernetes_navbar_docente" class="nav-link js-scroll-trigger" href="#docente">Docente</a>
</li>
</ul>
</div>
</div>
</nav>
<?php include 'snippets/theme-toggle.php';?>
<?php /* Hero: il logo che gira è un velo sopra al teaser. Col mouse la
"torcia" lo buca e scopre il video (js/common.js); su touch la
torcia non esiste e resta il solo logo, senza scaricare il video. */ ?>
<header class="landing landing--logo landing--torch">
<video data-src="assets/teaser-kpcm.mp4" autoplay loop muted playsinline></video>
<div class="veil" aria-hidden="true">
<div class="bg"></div>
<div class="wheel">
<img src="assets/kubernetes-logo-white.svg" alt="">
</div>
</div>
<div class="container h-100">
<div class="row h-100 align-items-center">
<div class="col-12 text-center text-white">
<h1 class="font-weight-light">Impara Kubernetes divertendoti</h1>
<p class="lead">Dal singolo container all'orchestrazione vera e propria!</p>
<?php if($show_promo): ?>
<a data-umami-event="kubernetes_header_button_SPECIAL_OFFER" id="promo" class="js-scroll-trigger banner" href="#kubernetes"><div><?php echo $promo_str; ?></div></a>
<?php else: ?>
<a data-umami-event="kubernetes_header_button_scopri" class="btn btn-lg btn-outline-light js-scroll-trigger" href="#kubernetes">Scopri</a>
<?php endif ?>
</div>
</div>
</div>
</header>
<section>
<div class="container">
<h2 id="kubernetes" class="section-title">Perché imparare Kubernetes</h2>
<p class="section-note text-justify">
Kubernetes è la piattaforma di <b>orchestrazione dei container</b> più diffusa al mondo, ma se hai appena mosso i primi passi con <i>Docker</i>,
<b>potresti pensare che sia roba da grandi aziende</b> con team <i>DevOps</i> dedicati e infrastrutture complesse.
</p>
<p class="section-claim">
Bene, io non la penso così. <br>
<b>Benvenuto su Kubernetes Per Comuni Mortali.</b>
</p>
<p class="section-note text-justify">
Questo corso è progettato per <i>sviluppatori, sistemisti</i> e appassionati di informatica e <i>self-hosting</i>
che vogliono <b>fare il salto di qualità</b> dalla gestione di singoli container all'<b>orchestrazione vera e propria</b>, attraverso esempi pratici e concreti.<br><br>
Partendo dalle basi, ti guiderò attraverso i concetti fondamentali di Kubernetes: dai <i>Pod</i> ai <i>Deployment</i>, dai <i>Service</i> agli <i>Ingress</i>, fino alla gestione della <b>configurazione</b> e della <b>persistenza dei dati</b>, senza perderti in astrazioni inutili o terminologie ostiche.
</p>
<div class="row justify-content-center" style="margin-top: 3.5rem;">
<div class="col-lg-7 col-md-9">
<div class="card">
<img src="assets/kubernetes-per-comuni-mortali.png" class="card-img-top" alt="Copertina corso Kubernetes Per Comuni Mortali" title="Kubernetes Per Comuni Mortali">
<div class="card-body d-flex flex-column">
<h3 class="card-title">Kubernetes Per Comuni Mortali</h3>
<p class="card-text">
Questo corso si rivolge a chi ha già <b>familiarità con Docker</b> e vuole fare il passo successivo, imparando a orchestrare i propri container su un <i>cluster</i> vero.<br><br>
Affronteremo <b>teoria e pratica</b>: ogni lezione è costruita intorno a un <b>mini progetto funzionante</b> che potrai replicare nel tuo <i>homelab</i> o <i>in azienda</i>.<br><br>
L'obbiettivo di questo corso è rendere Kubernetes uno strumento <b>alla portata di tutti</b>, abbattendo la barriera d'ingresso che troppo spesso scoraggia chi vuole crescere.<br><br>
</p>
<?php if($show_promo): ?>
<a data-umami-event="kubernetes_goto_kubernetes_SPECIAL_OFFER" title="Kubernetes Per Comuni Mortali" href="<?php echo $KPCM; ?>" class="btn btn-special-offer mt-auto"><?php echo $promo_cta_text; ?></a>
<?php else: ?>
<a data-umami-event="kubernetes_goto_Kubernetes" title="Kubernetes Per Comuni Mortali" href="<?php echo $KPCM; ?>" class="btn btn-primary mt-auto"><b>Vai al corso</b></a>
<?php endif ?>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="imparerai" class="section-alt">
<div class="container">
<h2 class="section-title">Cosa imparerai</h2>
<p class="section-lead text-center">
Esploreremo Kubernetes con un <b>approccio pratico</b>: ogni lezione è costruita intorno a un <b>mini progetto funzionante</b>,
e ti illustrerò ogni dettaglio rilevante strada facendo, nel momento in cui diventa necessario capirlo davvero.
</p>
<div class="row" style="margin-top: 3rem;">
<div class="col-lg-4 col-md-6 mb-4">
<div class="feature-item">
<i class="fa fa-server" aria-hidden="true"></i>
<span>Installare e configurare un <b>cluster k3s</b></span>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="feature-item">
<i class="fa fa-terminal" aria-hidden="true"></i>
<span>Gestire i workload con <b>kubectl</b> e approccio <b>dichiarativo</b></span>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="feature-item">
<i class="fa fa-globe" aria-hidden="true"></i>
<span>Esporre applicazioni con <b>Service</b>, <b>Ingress</b> e <b>TLS automatico</b></span>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="feature-item">
<i class="fa fa-database" aria-hidden="true"></i>
<span>Gestire <b>configurazione</b>, <b>segreti</b> e <b>storage persistente</b></span>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="feature-item">
<i class="fa fa-cubes" aria-hidden="true"></i>
<span>Installare e pacchettizzare applicazioni con <b>Helm</b></span>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="feature-item">
<i class="fa fa-wrench" aria-hidden="true"></i>
<span><b>Diagnosticare e risolvere</b> i problemi più comuni nel cluster</span>
</div>
</div>
</div>
<p class="section-note text-justify" style="margin-top: 2rem;">
Allegato a ciascuna lezione troverai <b>codice</b>, <b>appunti</b> e link di approfondimento, e potrai verificare il tuo apprendimento tramite gli appositi <b>quiz</b>.<br><br>
A differenza dei corsi più avanzati, il focus è sull'<b>accessibilità</b> e la <b>comprensione</b>. <i>Il tono è discorsivo e rilassato</i>, gli argomenti vengono introdotti con gradualità e approfonditi nei capitoli dedicati, man mano che il quadro d'insieme diventa più chiaro.
</p>
<div class="row" style="margin-top: 3rem;">
<div class="col-md-6 mb-4">
<div class="info-panel">
<h5><i class="fa fa-users mr-2" aria-hidden="true"></i>A chi è rivolto</h5>
<ul class="icon-list">
<li>Appassionati di informatica e <i>self-hosting</i></li>
<li>Sistemisti</li>
<li>Sviluppatori</li>
<li>Chi ha già familiarità con <b>Docker</b> e vuole fare il passo successivo</li>
</ul>
</div>
</div>
<div class="col-md-6 mb-4">
<div class="info-panel">
<h5><i class="fa fa-check-square-o mr-2" aria-hidden="true"></i>Prerequisiti</h5>
<ul class="icon-list">
<li>Conoscenza base di <a data-umami-event="kubernetes_prereq_linux" href="linux.php"><b>Linux</b></a></li>
<li>Buona conoscenza di <a href="docker.php"><b>Docker</b> o <b>Podman</b></a></li>
<li>Fondamenti di <a href="https://corsoreti.it"><b>networking</b></a></li>
</ul>
</div>
</div>
</div>
</div>
</section>
<section id="esperti">
<div class="container">
<h2 class="section-title">Affidati agli esperti</h2>
<p class="section-note text-justify">
Anche questo corso è realizzato con la partnership di <a href="https://axolserver.com/?utm_source=morrolinux&utm_medium=corso&utm_campaign=kubernetes"><b>AXOL Server</b></a>, che vanta 15 anni di esperienza sul campo.
</p>
<img src="assets/axol-blade-crop.jpg" class="section-figure" alt="AXOL Server">
<p class="section-note text-justify">
Costruiremo il nostro cluster su <b>Proxmox VE</b>, così da poter creare, clonare e ripristinare i nodi in pochi istanti e sperimentare <b>senza paura di rompere nulla</b>.<br><br>
Non ci fermeremo al "deploy che funziona": vedremo anche come <b>mantenere</b> il cluster nel tempo, dagli <i>upgrade</i> di Kubernetes e del sistema operativo sottostante fino al <b>troubleshooting</b> dei problemi più comuni, con <i>snapshot</i> e <i>backup</i> preventivi a farci da rete di sicurezza.<br><br>
Affronteremo infine il tema dell'<b>Alta Disponibilità</b> (HA) con onestà intellettuale: quando conviene appoggiarsi all'HA infrastrutturale di Proxmox, quali sono i suoi <b>limiti reali</b> e quando invece serve davvero un cluster Kubernetes in HA.
</p>
</div>
</section>
<section id="programma" class="section-alt">
<div class="container">
<h2 class="section-title">Programma del corso</h2>
<p class="section-lead text-center">
Undici moduli, dal primo <i>Pod</i> alla manutenzione del cluster nel tempo.
</p>
<div class="syllabus" id="syllabus">
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-1" aria-expanded="true" aria-controls="modulo-1">
<span class="syllabus-num">1</span>
<span class="syllabus-name">Benvenuto</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse show" id="modulo-1" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Presentazione del corso</li>
<li>Per chi è questo corso</li>
<li>Cosa imparerai</li>
<li>Perché virtualizzare Kubernetes</li>
<li>Ottenere il massimo dal corso</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-2" aria-expanded="false" aria-controls="modulo-2">
<span class="syllabus-num">2</span>
<span class="syllabus-name">Installiamo k3s su Proxmox e prendiamo confidenza</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-2" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Come funziona k3s</li>
<li>Setup dell'ambiente su Proxmox: VM con template e cloud-init</li>
<li>Installazione di k3s e configurazione di kubectl</li>
<li>Join di altri nodi worker al cluster</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-3" aria-expanded="false" aria-controls="modulo-3">
<span class="syllabus-num">3</span>
<span class="syllabus-name">Gli oggetti fondamentali: Pod, ReplicaSet, Deployment</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-3" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Deployment, Pod e ReplicaSet</li>
<li>Approccio dichiarativo e reconciliation loop</li>
<li>Namespace: organizzare e isolare i workload</li>
<li>Labels e annotations: il collante invisibile di Kubernetes</li>
<li>Deploy, scale, update, rollback</li>
<li>Multi-container Pod e sidecar containers</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-4" aria-expanded="false" aria-controls="modulo-4">
<span class="syllabus-num">4</span>
<span class="syllabus-name">Esporre le applicazioni: Service e Ingress</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-4" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Service ClusterIP vs NodePort vs LoadBalancer</li>
<li>Deploy di una app fullstack con Servizi ClusterIP e LoadBalancer</li>
<li>Ingress: il reverse proxy nativo del cluster</li>
<li>Ottenere i certificati TLS: HTTP-01 vs DNS-01 challenge</li>
<li>TLS automatico con cert-manager e Let's Encrypt</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-5" aria-expanded="false" aria-controls="modulo-5">
<span class="syllabus-num">5</span>
<span class="syllabus-name">Storage: volumi, PV, PVC e StorageClass</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-5" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Come funziona lo storage su Kubernetes (CSI, PVC e modalità di accesso)</li>
<li>Deployment con dati persistenti</li>
<li>SMB StorageClass (RWX)</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-6" aria-expanded="false" aria-controls="modulo-6">
<span class="syllabus-num">6</span>
<span class="syllabus-name">Configurazione e segreti: ConfigMap e Secret</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-6" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Variabili d'ambiente e ConfigMap</li>
<li>Montare una ConfigMap come un file</li>
<li>Montare una ConfigMap come una cartella</li>
<li>Secret: cosa sono e come funzionano</li>
<li>Best practice sui Secret</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-7" aria-expanded="false" aria-controls="modulo-7">
<span class="syllabus-num">7</span>
<span class="syllabus-name">Health, risorse e ciclo di vita dei Pod</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-7" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Probe: liveness e readiness spiegate con esempi</li>
<li>Monitoraggio base delle risorse</li>
<li>Resource requests e limits</li>
<li>Init containers</li>
<li>Lifecycle hooks (postStart, preStop)</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-8" aria-expanded="false" aria-controls="modulo-8">
<span class="syllabus-num">8</span>
<span class="syllabus-name">Workload oltre i Deployment: Job, CronJob, DaemonSet, StatefulSet</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-8" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Job: task una tantum (migrazioni, batch)</li>
<li>CronJob: schedulare task in modo nativo</li>
<li>DaemonSet: un Pod per nodo, casi d'uso reali</li>
<li>StatefulSet: identità, ordering e storage stabile</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-9" aria-expanded="false" aria-controls="modulo-9">
<span class="syllabus-num">9</span>
<span class="syllabus-name">Helm e Kustomize</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-9" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Deployment di un'app completa</li>
<li>Kustomize: quale problema risolve</li>
<li>Deployment di un'app con Helm (e comandi essenziali)</li>
<li>Anatomia di un chart Helm</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-10" aria-expanded="false" aria-controls="modulo-10">
<span class="syllabus-num">10</span>
<span class="syllabus-name">HA infrastrutturale con Proxmox: la scorciatoia onesta</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-10" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>HA applicativo vs infrastrutturale: cosa Proxmox non può fare per te</li>
<li>Test dell'HA infrastrutturale con Proxmox</li>
</ul>
</div>
</div>
<div class="syllabus-module">
<button class="syllabus-toggle" type="button" data-toggle="collapse" data-target="#modulo-11" aria-expanded="false" aria-controls="modulo-11">
<span class="syllabus-num">11</span>
<span class="syllabus-name">Manutenzione e troubleshooting</span>
<i class="fa fa-chevron-down syllabus-chevron" aria-hidden="true"></i>
</button>
<div class="collapse" id="modulo-11" data-parent="#syllabus">
<ul class="syllabus-lessons">
<li>Aggiornare Kubernetes con System Upgrade Controller</li>
<li>Aggiornare sistema operativo sottostante</li>
<li>Aggiornare Proxmox stesso</li>
<li>Capire e risolvere i problemi più comuni</li>
<li>Debugging di un Pod: kubectl debug ed ephemeral container</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<?php if($show_counters): ?>
<section data-umami-event="kubernetes_section_statistiche" id="statistiche" class="callout-flat">
<div class="container text-center">
<h2 class="section-title">Numeri che parlano</h2>
<div id="counters" class="row">
<div class="col-lg-4 stats">
<i class="fa fa-users" aria-hidden="true"></i>
<div class="counting" data-count="<?php echo $subs; ?>">0</div>
<h5>Iscrizioni</h5>
</div>
<div class="col-lg-4 stats">
<i class="fa fa-graduation-cap" aria-hidden="true"></i>
<div class="counting" data-count="<?php echo $lessons; ?>">0</div>
<h5>Lezioni</h5>
</div>
<div class="col-lg-4 stats">
<i class="fa fa-thumbs-up" aria-hidden="true"></i>
<div class="counting" data-count="<?php echo $reviews; ?>">0</div>
<h5>Recensioni</h5>
</div>
</div>
</div>
</section>
<?php endif ?>
<?php include 'snippets/generic-faq.php';?>
<?php include 'snippets/corsi-per-comuni-mortali.php';?>
<?php include 'snippets/corsi-per-certificazioni.php';?>
<?php include 'snippets/docente.php';?>
<?php include 'snippets/footer.php';?>
<!-- Bootstrap core JavaScript -->
<script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Plugin JavaScript -->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<script src="js/jquery.fitvids.js"></script>
<!-- Custom JavaScript -->
<script src="js/common.js"></script>
<script src="js/kubernetes_script.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
</body>
</html>