Έργο projet13-kubernetes-helm-tp · 36 ερωτήσεις αυτοαξιολόγησης
Αυτές οι ερωτήσεις αφορούν ακριβώς ΑΥΤΟ το έργο (
chart/,values.yaml,values-dev.yaml,_helpers.tpl,apps/portail, τις τρεις βλάβες). Απαντήστε πριν ξεδιπλώσετε τη διόρθωση. Οι σωστές απαντήσεις κατανέμονται μεταξύ A, B, C και D.
| Θέμα | Ερωτήσεις |
|---|---|
| A — Helm: βασικές ιδέες | 1 έως 6 |
| B — Ανατομία του Chart hedge | 7 έως 12 |
| C — Templates, Values και helpers | 13 έως 20 |
| D — Τα τρία περιβάλλοντα | 21 έως 26 |
| E — install, upgrade, rollback | 27 έως 31 |
| F — Οι τρεις βλάβες του έργου | 32 έως 36 |
| Συνοπτική διόρθωση | — |
1. Σε μία πρόταση, τι κάνει το Helm;
kubectldocker buildB. Το Helm αποδίδει πρότυπα YAML με μεταβλητές (values.yaml), έπειτα εφαρμόζει το αποτέλεσμα στο σύμπλεγμα με το όνομα μιας release. Το kubectl παραμένει απαραίτητο για την παρατήρηση του συμπλέγματος.
2. Τι είναι μια release Helm;
Chart.yamlhedge-dev, hedge-staging, hedge-prod)C. Το ίδιο Chart μπορεί να εγκατασταθεί πολλές φορές. Κάθε εγκατάσταση είναι μια release. Ο χώρος ονομάτων είναι ο τόπος απομόνωσης· η release είναι το αντικείμενο Helm.
3. Σε αυτό το έργο, ποια δήλωση είναι αληθής;
{{ .Chart.Name }} αλλάζει σε κάθε helm install, το {{ .Release.Name }} μένει ίδιο{{ .Release.Name }} αλλάζει σε κάθε helm install, το {{ .Chart.Name }} μένει ίδιοhelm upgradeB. Το Chart ονομάζεται πάντα hedge. Το όνομα release (hedge-dev, hedge-staging, hedge-prod) αλλάζει σε κάθε εγκατάσταση. Αυτή η αντίθεση επιτρέπει το πολλαπλό περιβάλλον.
4. Ποια εντολή παράγει το YAML χωρίς να αναπτύξει τίποτα στο σύμπλεγμα;
helm installhelm upgradehelm linthelm templateD. Το helm template είναι στεγνή απόδοση. Το helm lint ελέγχει τη σύνταξη, αλλά δεν εμφανίζει τα μανιφέστα. Τα install και upgrade αγγίζουν το σύμπλεγμα.
5. Σε τι χρησιμεύει ένα αρχείο του οποίου το όνομα αρχίζει με _ στο templates/ (παράδειγμα: _helpers.tpl);
_helpersdefine / include)C. Το πρόθεμα _ σημαίνει «μόνο helper». Οι συναρτήσεις καλούνται έπειτα με {{ include "hedge.labels" ... }}.
6. Στο Chart.yaml, ποια είναι η διαφορά μεταξύ version και appVersion;
version είναι η έκδοση του Chart (συσκευασία Helm)· το appVersion είναι η έκδοση της εφαρμογής που αναπτύσσεταιversion είναι ο αριθμός αναθεώρησης Helm· το appVersion είναι το tag Dockerversion χρησιμεύει στο Kubernetes· το appVersion στο HelmB. Μπορούμε να αλλάξουμε το version (π.χ. 0.1.0 προς 0.2.0) χωρίς να αλλάξουμε τον κώδικα εφαρμογής, και αντίστροφα. Δεν είναι ο αριθμός αναθεώρησης (helm history), ούτε αυτόματα το tag εικόνας.
7. Σε αυτό το έργο, τι περιέχει ο φάκελος apps/;
portail και της api, που δεν πρέπει να τροποποιηθείvalues-<env>.yamlvalider.ps1B. Είστε ο DevOps: ο κώδικας εφαρμογής είναι ήδη γραμμένος. Η τροποποίηση του apps/ απαγορεύεται από τον κανονισμό του εργαστηρίου.
8. Γιατί ο φάκελος chart/casses/ δεν βρίσκεται μέσα στο chart/templates/;
casse-templates/ για να παρατηρήσετε το σφάλμαtemplates/B. Το Helm αποδίδει όλα τα αρχεία του templates/ (εκτός από όσα έχουν πρόθεμα _). Το να μείνουν οι βλάβες στο casses/ αποφεύγει το σπάσιμο του Chart πριν την αποστολή 6.
9. Στο values.yaml αυτού του έργου, σε ποια θύρα ακούει το κοντέινερ portail;
C. portail.service.targetPort: 5000 (είναι η θύρα Flask). Το port: 80 είναι η θύρα του Service. Το nodePort: 30130 είναι η θύρα που εκτίθεται στο μηχάνημα (DEV). Το 8000 είναι το targetPort της api.
10. Σε αυτό το έργο, ποιος τύπος Service προβλέπεται για την api στο values.yaml;
D. Η api μένει εσωτερική στο σύμπλεγμα. Το portail την καλεί μέσω DNS (http://hedge-dev-api). Μόνο το portail είναι σε NodePort για τον περιηγητή.
11. Πόσες εικόνες Docker πρέπει να κατασκευάσετε μία μόνο φορά πριν αναπτύξετε τα τρία περιβάλλοντα;
hedge:1.0)hedge-portail:1.0 και hedge-api:1.0)B. Τα τρία περιβάλλοντα επαναχρησιμοποιούν τις ίδιες εικόνες. Αυτό που αλλάζει είναι οι τιμές που εγχέονται (χρώμα, replicas, μήνυμα), όχι ο κώδικας.
12. Το portail εμφανίζει ένα χρωματιστό πανό και ένα μήνυμα. Από πού προέρχονται αυτές οι πληροφορίες;
apps/portail/app.pycouleur.txt προσαρτημένο ως τόμοςB. Το app.py διαβάζει THEME_COLOR, BANNIERE_MESSAGE, ENVIRONMENT, κ.λπ. Ο ίδιος κώδικας προσαρμόζεται σε DEV / STAGING / PROD χωρίς τροποποίηση.
13. Τι αποδίδει το {{ .Values.portail.replicas }} αν το values-prod.yaml περιέχει portail.replicas: 3 και εγκαθιστάτε με -f values-prod.yaml;
1 (η τιμή του values.yaml κερδίζει πάντα)3 (το αρχείο που περνά με -f υπερισχύει του values.yaml)defaultB. Το values.yaml παρέχει τις προεπιλογές. Κάθε values-<env>.yaml υπερισχύει μόνο ό,τι αλλάζει. Αυτή είναι η ίδια η αρχή του πολλαπλού περιβάλλοντος.
14. Γιατί ένα αρχείο values-prod.yaml που επαναορίζει το portail.image.repository είναι παιδαγωγικό σφάλμα σε αυτό το έργο;
repository δεν υπάρχειChart.yamlB. Στο values-<env>.yaml αντιγράφουμε μόνο ό,τι διακρίνει το περιβάλλον (replicas, nodePort, χρώμα, μήνυμα, environment). Η αντιγραφή των υπολοίπων είναι επιστροφή στο copy-paste που το Helm υποτίθεται ότι αντικαθιστά.
15. Σε αυτό το έργο, ο helper hedge.fullname πρέπει να παράγει, για τη release hedge-dev και το στοιχείο portail:
hedge-portailportail-hedge-devhedge-dev-portailhedgeC. Μορφή <release>-<composant>. Αυτό το πρόθεμα αποφεύγει τις συγκρούσεις ονομάτων μεταξύ DEV, STAGING και PROD (ακόμη και στον ίδιο χώρο ονομάτων).
16. Ποιες ετικέτες πρέπει μόνες να εμφανίζονται στο hedge.selectorLabels;
name, instance, component — οι τρεις που δεν θα αλλάξουν ποτέ για αυτή την παρουσίαhedge.labels, συμπεριλαμβανομένων των version και hedge/environmenthedge/environmenthelm.sh/chartA. Το spec.selector.matchLabels είναι αμετάβλητο. Το να βάλετε εκεί version, helm.sh/chart ή hedge/environment θα κάνει να αποτύχει το πρώτο helm upgrade που αλλάζει αυτές τις τιμές.
17. Γιατί το BACKEND_URL του portail δεν μπορεί να είναι http://api στα σκληρά;
hedge-<release>-api (π.χ. hedge-dev-api): το όνομα DNS εξαρτάται από τη releaseB. Ο helper hedge.fullname κατασκευάζει hedge-dev-api, hedge-staging-api, hedge-prod-api. Ένα όνομα στα σκληρά api δεν επιλύει τίποτα στον χώρο ονομάτων.
18. Τι κάνει το {{ .Values.environment | quote }};
B. Το quote παράγει "dev" αντί για dev. Χωρίς εισαγωγικά, ορισμένες τιμές YAML (δεκαεξαδικά χρώματα, μηνύματα) μπορούν να σπάσουν το μανιφέστο.
19. Γιατί το replicas: "{{ .Values.portail.replicas }}" (με εισαγωγικά γύρω από όλο το πρότυπο) είναι επικίνδυνο;
"1", που το API αρνείταιB. Ποτέ μην βάλετε σε εισαγωγικά έναν ακέραιο. Γράφουμε replicas: {{ .Values.portail.replicas }}, όχι replicas: "{{ ... }}".
20. Σε τι χρησιμεύει το nindent 4 στο {{ include "hedge.labels" ... | nindent 4 }};
B. Το Helm εγχέει ένα μπλοκ πολλών γραμμών. Χωρίς nindent, η εσοχή YAML σπάει και λαμβάνετε error converting YAML to JSON.
21. Σε αυτό το έργο, ποιο nodePort προορίζεται για το STAGING;
B. DEV = 30130, STAGING = 30131, PROD = 30132. Το 30500 είναι το portail του έργου 12, όχι αυτού.
22. Πόσα replicas portail + api πρέπει να έχετε σε PROD μόλις το Chart αναπτυχθεί σωστά;
C. PROD: 3 portail και 3 api. DEV: 1+1. STAGING: 2+2. Συνολικά, 12 Pods εφαρμογής δίπλα-δίπλα.
23. Ποιο χρώμα πανό αντιστοιχεί στο περιβάλλον DEV;
#ea580c#16a34a#64748b#2563ebD. Μπλε = DEV, πορτοκαλί = STAGING, πράσινο = PROD. Το γκρι #64748b είναι το προεπιλεγμένο χρώμα του values.yaml (περιβάλλον default), όχι ενός από τα τρία αρχεία περιβάλλοντος.
24. Γιατί αναπτύσσουμε κάθε περιβάλλον στον δικό του χώρο ονομάτων (hedge-dev, hedge-staging, hedge-prod);
values.yamlB. Το Helm επιτρέπει πολλές releases στον ίδιο χώρο ονομάτων (αυτή είναι μάλιστα η παγίδα της βλάβης 1 αν τα ονόματα είναι στα σκληρά). Οι χώροι ονομάτων παραμένουν καλή πρακτική: απομόνωση, ποσοστώσεις, RBAC, σαφήνεια.
25. Ποια εντολή εγκαθιστά σωστά το περιβάλλον DEV αυτού του έργου;
kubectl apply -f chart/environments/values-dev.yamlhelm install hedge-dev .\chart -f .\chart\environments\values-dev.yaml -n hedge-dev --create-namespacehelm template hedge-dev .\chartdocker compose up -dB. Δείχνουμε στο Chart (.\chart), υπερισχύουμε με -f values-dev.yaml, ονομάζουμε τη release hedge-dev, δημιουργούμε τον χώρο ονομάτων. Το helm template δεν αναπτύσσει τίποτα. Το values-dev.yaml δεν είναι μανιφέστο kubectl.
26. Αν ανοίξετε το http://localhost:30132 και το πανό είναι πράσινο, τι βλέπετε κατ' ανάγκη στο JSON /api-json;
"env": "dev""env": "staging""env": "prod" και "backend": "ok" αν η api του ίδιου χώρου ονομάτων απαντά"env": "default"C. Η θύρα 30132 είναι αυτή του PROD. Το πεδίο env προέρχεται από .Values.environment. Το backend: ok αποδεικνύει ότι το BACKEND_URL δείχνει στο Service api αυτής της release.
27. Μετά από helm install hedge-dev ... έπειτα helm upgrade hedge-dev ... --set portail.replicas=5, τι δείχνει το helm history hedge-dev -n hedge-dev;
B. Κάθε install / upgrade / rollback δημιουργεί μια αναθεώρηση. Αυτό το ημερολόγιο κάνει δυνατή την επιστροφή πίσω.
28. Τι κάνει το helm rollback hedge-dev 1 -n hedge-dev;
Rollback to 1values.yaml στον δίσκοB. Το rollback δεν σβήνει το ιστορικό: προσθέτει μια αναθεώρηση. Το values-dev.yaml στον δίσκο σας δεν αλλάζει.
29. Ποια είναι η θεμελιώδης διαφορά μεταξύ helm upgrade --set portail.replicas=5 και kubectl scale deploy/hedge-dev-portail --replicas=5;
kubectl scale είναι πιο αργόhelm upgrade είναι ιχνηλατημένο και ακυρώσιμο από το Helm· το kubectl scale βγαίνει από τον έλεγχο του Helm και θα αντικατασταθεί στην επόμενη αναβάθμιση χωρίς --setkubectl scale απαγορεύεται από το Kubernetes σε αντικείμενο που δημιούργησε το HelmC. Το Helm συγκλίνει ξανά προς τα Values στην επόμενη upgrade. Μια χειροκίνητη τροποποίηση (scale, edit) είναι αόρατο χρέος. Αυτή είναι η ερώτηση προβληματισμού της αποστολής 5.
30. Το helm uninstall hedge-dev -n hedge-dev διαγράφει τον χώρο ονομάτων hedge-dev;
kubectl delete namespace)B. Το uninstall αφαιρεί Deployment, Service, κ.λπ. της release. Ο χώρος ονομάτων επιβιώνει. Εξ ου και η εντολή εκκαθάρισης του README: kubectl delete namespace hedge-dev ....
31. Τι συμβαίνει αν κάνετε kubectl delete pod hedge-dev-portail-xxxxx -n hedge-dev σε ένα Pod που δημιούργησε το Deployment Helm;
B. Το Helm δηλώνει το Deployment. Το Kubernetes διατηρεί τον αριθμό replicas. Η διαγραφή ενός Pod είναι η παιδαγωγική χειρονομία αυτοεπισκευής, όχι βλάβη Helm.
32. Βλάβη 1 (casse-1-configmap.yaml): γιατί η δεύτερη release στον ίδιο χώρο ονομάτων αποτυγχάνει;
metadata.name: hedge-config είναι στατικό όνομα: οι δύο releases διεκδικούν το ίδιο αντικείμενοdatavalues-staging.yaml είναι άκυροB. Η διόρθωση είναι να προτάξετε το όνομα με τη release: {{ include "hedge.fullname" (dict "root" . "composant" "config") }} παράγει hedge-dev-config και hedge-staging-config.
33. Βλάβη 2 (casse-2-worker-deployment.yaml): ποιο μήνυμα Kubernetes βλέπετε στο helm upgrade --set environment=recette;
nil pointer evaluating interface {}.replicasConfigMap "hedge-config" exists and cannot be importedspec.selector: Invalid value: ...: field is immutableImagePullBackOffC. Το hedge/environment βρίσκεται στο matchLabels. Η αλλαγή του environment αλλάζει τον selector, κάτι που το Kubernetes αρνείται. Τα A και B είναι τα συμπτώματα των βλαβών 3 και 1.
34. Σε ένα Deployment, πού επιτρέπεται να βάλετε την ετικέτα hedge/environment;
spec.selector.matchLabelstemplate.metadata.labels) και στις ετικέτες του αντικειμένου, όχι στο matchLabelsChart.yamlB. Οι ετικέτες του Pod μπορούν να είναι πλούσιες και μεταβλητές. Ο selector πρέπει να μείνει ένα σταθερό υποσύνολο. Αυτή είναι όλη η διάκριση hedge.labels vs hedge.selectorLabels.
35. Βλάβη 3 (casse-3-cache-deployment.yaml): τι σημαίνει το σφάλμα nil pointer evaluating interface {}.replicas στο .Values.portal.replicas;
values.yaml ορίζει portail (με i), όχι portal — το Helm αξιολογεί nil.replicas.Release.portal.replicasreplicas απαγορεύεται σε Deployment που δημιούργησε το HelmB. Ένα μόνο γράμμα παραπάνω. Πρώτο αντανακλαστικό: helm template --debug και ανάγνωση της διαδρομής στο μήνυμα σφάλματος.
36. Αύριο πρέπει να προσθέσετε ένα 4ο περιβάλλον pre-prod. Ποια αρχεία δημιουργείτε, ποια δεν αγγίζετε;
chart/ και μετονομάζετε το Chartchart/environments/values-preprod.yaml (και ένα helm install + χώρο ονομάτων)· τα πρότυπα και το values.yaml μένουν αμετάβληταtemplates/apps/portail/app.py για να αναγνωρίζει το pre-prodB. Αυτή είναι η υπόσχεση του Helm: ένα Chart, N αρχεία τιμών. Αν πρέπει να αγγίξετε τα πρότυπα για νέο περιβάλλον, το Chart είναι κακοσχεδιασμένο.
| # | Απάντηση | Ιδέα να κρατήσετε |
|---|---|---|
| 1 | B | Helm = πρότυπα + values + release |
| 2 | C | Μια release = μια ονομασμένη εγκατάσταση |
| 3 | B | Το .Release.Name αλλάζει, το .Chart.Name όχι |
| 4 | D | helm template = στεγνή απόδοση |
| 5 | C | Το _helpers.tpl δεν δημιουργεί κανένα αντικείμενο |
| 6 | B | version = Chart· appVersion = εφαρμογή |
| 7 | B | Το apps/ είναι παγωμένο |
| 8 | B | Το casses/ εκτός του templates/ ηθελημένα |
| 9 | C | Κοντέινερ portail = θύρα 5000 |
| 10 | D | api = ClusterIP |
| 11 | B | Δύο εικόνες, τρία περιβάλλοντα |
| 12 | B | Χρώμα και μήνυμα προέρχονται από μεταβλητές περιβάλλοντος Helm |
| 13 | B | Το -f υπερισχύει του values.yaml |
| 14 | B | Αντιγράφετε μόνο ό,τι διαφέρει |
| 15 | C | hedge-dev-portail |
| 16 | A | Selector = name + instance + component |
| 17 | B | Το BACKEND_URL πρέπει να περιλαμβάνει το όνομα release |
| 18 | B | quote = εισαγωγικά YAML |
| 19 | B | Ποτέ μην βάλετε σε εισαγωγικά έναν ακέραιο replicas |
| 20 | B | Το nindent σώζει την εσοχή |
| 21 | B | STAGING = 30131 |
| 22 | C | PROD = 3 + 3 |
| 23 | D | DEV = μπλε #2563eb |
| 24 | B | Ένας χώρος ονομάτων ανά περιβάλλον |
| 25 | B | helm install ... -f values-dev.yaml -n hedge-dev |
| 26 | C | 30132 = prod + backend ok |
| 27 | B | Το ιστορικό συσσωρεύει αναθεωρήσεις |
| 28 | B | Rollback = νέα αναθεώρηση |
| 29 | C | Το scale εκτός Helm θα αντικατασταθεί |
| 30 | B | Το uninstall δεν σκοτώνει τον χώρο ονομάτων |
| 31 | B | Delete pod = αυτοεπισκευή του Deployment |
| 32 | B | Όνομα στα σκληρά = σύγκρουση μεταξύ releases |
| 33 | C | Αμετάβλητος selector |
| 34 | B | Μεταβλητή ετικέτα OK στο Pod, απαγορευμένη στο matchLabels |
| 35 | B | Τυπογραφικό portal / portail |
| 36 | B | Νέο περιβάλλον = ένα αρχείο τιμών |
Ενδεικτική βαθμολογία: 30/36 ή περισσότερο = μπορείτε να εξηγήσετε το έργο σε έναν συμφοιτητή. Κάτω από 24/36, ξαναδιαβάστε τις ενότητες «Ουσιώδεις έννοιες», «Αποστολή 3» και «Αποστολή 6» του 00-ENONCE.md.
Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων