Kubernetes Assessment: 02 Intermediate
Επίπεδο δυσκολίας: Intermediate
Γλώσσα: Ελληνικά
Μορφή: συνδυασμός ερωτήσεων εννοιών, σχεδιασμού και πρακτικών εργασιών
Προτεινόμενη διάρκεια: 150 έως 180 λεπτά
Μέγιστη βαθμολογία: 100 μονάδες
Όριο επιτυχίας: 70 μονάδες
Αυτό το Assessment περιλαμβάνει εργασίες, απαιτήσεις υποβολής και κριτήρια βαθμολόγησης. Δεν περιλαμβάνει την πλήρη ενδεικτική λύση.
1. Στόχος του Assessment
Αυτό το Assessment ελέγχει αν μπορείτε να σχεδιάζετε, να διαμορφώνετε και να διερευνάτε Kubernetes Workloads που πλησιάζουν περισσότερο σε συνθήκες Production. Εστιάζει στην επιλογή Workload, στα Probes, στον κύκλο ζωής, στη διαχείριση Resources, στο Scheduling, στο NetworkPolicy, στο DNS, στο Ingress ή Gateway API, στο Storage, στο Helm, στο Kustomize και στο συστηματικό Troubleshooting.
Μετά το Assessment πρέπει να είναι σαφές ότι μπορείτε να:
- διακρίνετε Deployment, StatefulSet, DaemonSet, Job και CronJob με βάση τον σκοπό τους,
- ταξινομείτε σωστά Init Containers, Sidecar Containers και Ephemeral Containers,
- διαχωρίζετε τεχνικά τα Startup, Readiness και Liveness Probes,
- εφαρμόζετε Requests, Limits, QoS, LimitRange και ResourceQuota,
- εξηγείτε προβλήματα Scheduling μέσω Events, Node Labels, Taints και Tolerations,
- διαγιγνώσκετε χωριστά Service, DNS, EndpointSlices και NetworkPolicies,
- κατανοείτε το Ingress και το Gateway API ως Resources κανόνων που απαιτούν Controllers,
- χειρίζεστε PVC, PV, StorageClass και StatefulSet σε βασικό επίπεδο,
- αξιολογείτε το Output των Helm και Kustomize πριν το εφαρμόσετε.
2. Προαπαιτούμενα και επιτρεπόμενοι πόροι
Χρειάζεστε:
- Lab Cluster με λειτουργικό CNI,
- CoreDNS,
kubectl,- προαιρετικά
helm, - προαιρετικά
kubectl kustomizeήkustomize, - προαιρετικά StorageClass,
- προαιρετικά Ingress Controller ή Gateway Controller.
Επιτρέπονται:
- η επίσημη τεκμηρίωση του Kubernetes,
- οι δικές σας σημειώσεις από το workshop,
- τα
kubectl explain,kubectl describe,kubectl logs,kubectl get events, - τοπικά Manifests που δημιουργήθηκαν κατά το Assessment.
Δεν επιτρέπονται:
- Production Secrets,
- αλλαγές εκτός του Namespace του Assessment, εκτός αν απαιτούνται ρητά,
- Cluster-Wide αλλαγές χωρίς τεκμηρίωση και Rollback.
Προτεινόμενο Namespace:
export NS=exam-intermediate
3. Σενάριο
Μια ομάδα λειτουργεί μια μικρή εφαρμογή Shop στο Lab. Η εφαρμογή αποτελείται από:
frontend: δέχεται HTTP Requests,backend: παρέχει εσωτερικό API στην Port8080,migration: εκτελείται μία φορά πριν από νέα Version,cleanup: εκτελείται τακτικά,data-demo: αποθηκεύει ένα μικρό αρχείο μόνιμα.
Η εφαρμογή χρειάζεται ελεγχόμενα Health Checks, απαιτήσεις Resources, όρια Namespace, NetworkPolicies και σαφή διάγνωση. Η εξωτερική δημοσίευση γίνεται μέσω Ingress ή Gateway API, αν υπάρχει Controller. Αν δεν υπάρχει Controller, αυτό πρέπει να τεκμηριωθεί σωστά.
4. Αναμενόμενη υποβολή
Υποβάλετε έναν φάκελο ή Archive με τα ακόλουθα αρχεία:
02-intermediate-submission/
answers.md
architecture-decision.md
workloads/
frontend.yml
backend.yml
migration-job.yml
cleanup-cronjob.yml
resources/
limitrange.yml
resourcequota.yml
networking/
services.yml
networkpolicies.yml
ingress-or-gateway.yml
storage/
statefulset.yml
packaging/
kustomize-output.md
helm-output.md
troubleshooting.md
evidence.md
cleanup.md
Αν δεν διατίθενται Helm, Gateway API, Ingress Controller ή StorageClass, τεκμηριώστε τον περιορισμό και δώστε ένα τεχνικά σωστό παράδειγμα Manifest ή μια εναλλακτική αξιολόγηση που μπορεί να επαληθευτεί.
5. Μέρος A: Ερωτήσεις γνώσεων
Απαντήστε με ακρίβεια και με λειτουργικό πλαίσιο.
- Πότε χρησιμοποιείτε Deployment, StatefulSet, Job και CronJob;
- Ποια είναι η διαφορά μεταξύ Init Containers, Sidecar Containers και Ephemeral Containers;
- Ποιος είναι ο ρόλος των Startup Probe, Readiness Probe και Liveness Probe;
- Γιατί ένα υπερβολικά επιθετικό Liveness Probe μπορεί να προκαλέσει βλάβη;
- Πώς επηρεάζουν τα CPU/Memory Requests το Scheduling και το HPA;
- Ποια είναι η διαφορά μεταξύ των QoS Classes
Guaranteed,BurstableκαιBestEffort; - Ποιος είναι ο ρόλος των LimitRange και ResourceQuota;
- Ποια είναι η διαφορά μεταξύ
nodeSelector, Affinity, Taints και Tolerations; - Γιατί ένα Pod μπορεί να παραμείνει σε κατάσταση
Pendingακόμη και με σωστό Manifest; - Πώς αλληλεπιδρούν Service, EndpointSlice, Pod Readiness και DNS;
- Γιατί πρέπει να λαμβάνεται ρητά υπόψη το DNS Egress σε NetworkPolicies με Default Deny;
- Ποια είναι η διαφορά μεταξύ Ingress Resource και Ingress Controller;
- Ποιους ρόλους έχουν τα PV, PVC, StorageClass και CSI;
- Γιατί το
hostPathσε ένα Lab δεν αποτελεί αυτομάτως λύση για Production; - Τι ελέγχετε για
PVC Pending, Service χωρίς Endpoints καιCreateContainerConfigError;
6. Μέρος B: Απόφαση για Workloads και αρχιτεκτονική
Δημιουργήστε το architecture-decision.md. Για κάθε απαίτηση, περιγράψτε το κατάλληλο Kubernetes Resource και αιτιολογήστε την απόφαση.
| Απαίτηση | Αναμενόμενη απόφαση |
|---|---|
| Το HTTP Frontend πρέπει να εκτελείται συνεχώς και να ενημερώνεται με Rolling Updates. | Αιτιολογήστε τον τύπο Resource. |
| Το Backend API χρειάζεται Health Checks και Requests/Limits. | Εξηγήστε Probes και Resources. |
| Το Data Migration πρέπει να εκτελείται μία φορά ανά Release. | Αιτιολογήστε τον τύπο Resource. |
| Το Cleanup πρέπει να εκτελείται ανά ώρα χωρίς παράλληλα Jobs. | Εξηγήστε τον τύπο Resource και τη ρύθμιση Concurrency. |
| Ένα μικρό Stateful Workload πρέπει να διατηρεί δεδομένα μετά την αναδημιουργία του Pod. | Εξηγήστε StatefulSet/PVC. |
| Η εφαρμογή πρέπει να είναι προσβάσιμη εξωτερικά. | Εξηγήστε Ingress ή Gateway API και την εξάρτηση από Controller. |
| Το Namespace πρέπει να προστατεύεται από υπερβολική χρήση. | Εξηγήστε LimitRange και ResourceQuota. |
| Το Frontend επιτρέπεται να επικοινωνεί μόνο με το Backend και το DNS. | Εξηγήστε τον σχεδιασμό NetworkPolicy. |
7. Μέρος C: Πρακτικές εργασίες
Εργασία C1: Namespace, ResourceQuota και LimitRange
- Δημιουργήστε το Namespace
exam-intermediate. - Δημιουργήστε LimitRange με προεπιλεγμένα Requests και Limits.
- Δημιουργήστε ResourceQuota για Pods, CPU και Memory.
- Δείξτε ότι ο API Server απορρίπτει ένα Pod που υπερβαίνει τα όρια.
Ελάχιστες απαιτήσεις Quota:
pods: 10
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 4
limits.memory: 4Gi
Εργασία C2: Frontend και Backend με Probes
Δημιουργήστε δύο Deployments:
frontendμε Imagecurlimages/curl:8.8.0ή συγκρίσιμο ασφαλές Test Image,backendμε HTTP Test Server στην Port8080, για παράδειγμαregistry.k8s.io/e2e-test-images/agnhost:2.53μεnetexec.
Απαιτήσεις:
- ουσιαστικά CPU/Memory Requests και Limits,
- Readiness Probe για την κυκλοφορία του Service,
- Liveness Probe για περιπτώσεις που απαιτούν πραγματική επανεκκίνηση,
- Startup Probe αν η εφαρμογή εκκινεί αργά,
- σαφή Labels:
app,component,environment, - Services για Frontend και Backend.
Τεκμηριώστε γιατί το Readiness δεν εξυπηρετεί τον ίδιο σκοπό με το Liveness.
Εργασία C3: Job και CronJob
Δημιουργήστε:
- Job
migrationπου ολοκληρώνεται επιτυχώς μία φορά, - CronJob
cleanupπου εκτελείται κάθε ώρα, concurrencyPolicy: Forbidγια το CronJob,- ουσιαστικές τιμές
successfulJobsHistoryLimitκαιfailedJobsHistoryLimit.
Τεκμηριώστε γιατί ένα Deployment θα ήταν τεχνικά λιγότερο κατάλληλο για αυτόν τον σκοπό.
Εργασία C4: Έλεγχος Scheduling
- Προσθέστε το Label
exam-role=appsσε ένα Lab Node. - Δημιουργήστε Pod ή Deployment με αντίστοιχο
nodeSelector. - Δημιουργήστε δεύτερο Pod με
nodeSelectorπου δεν ταιριάζει. - Τεκμηριώστε τα Events για την κατάσταση
Pending. - Προσθέστε Taint στο Node με το Label.
- Δείξτε τη διαφορά μεταξύ Pod χωρίς Toleration και Pod με αντίστοιχο Toleration.
- Αναιρέστε καθαρά τις αλλαγές στο Node.
Εργασία C5: Default Deny NetworkPolicy με στοχευμένες εξαιρέσεις
Δημιουργήστε NetworkPolicies με τις ακόλουθες απαιτήσεις:
- Default Deny για Ingress και Egress στο Namespace.
- Επιτρέψτε DNS Egress προς το CoreDNS.
- Το
frontendεπιτρέπεται να συνδέεται στοbackendστην TCP Port8080. - Το υπόλοιπο Egress παραμένει αποκλεισμένο.
- Τεκμηριώστε αν το CNI σας επιβάλλει πράγματι NetworkPolicies.
Evidence:
kubectl get networkpolicy -n exam-intermediate
kubectl exec <frontend-pod> -n exam-intermediate -- nslookup backend
kubectl exec <frontend-pod> -n exam-intermediate -- curl -s --max-time 5 http://backend:8080/hostname
Εργασία C6: Ingress ή Gateway API
Ελέγξτε πρώτα αν υπάρχει Controller:
kubectl get ingressclass
kubectl get gatewayclass 2>/dev/null || true
Αν υπάρχει Ingress Controller:
- δημιουργήστε Ingress Resource με Hostname
shop.localtest.me, - δρομολογήστε την κίνηση στο σωστό Service,
- τεκμηριώστε Controller Events και αντιστοίχιση Backend.
Αν υπάρχει Gateway API:
- δημιουργήστε ή περιγράψτε ένα μοντέλο Gateway/HTTPRoute,
- τεκμηριώστε ParentRef, Hostname και BackendRef.
Αν δεν υπάρχει Controller:
- δημιουργήστε ένα παράδειγμα Manifest,
- εξηγήστε γιατί το Resource δεν δρομολογεί πρακτικά την κίνηση χωρίς Controller.
Εργασία C7: PVC και StatefulSet
- Ελέγξτε τα διαθέσιμα StorageClasses.
- Δημιουργήστε StatefulSet
data-demoμεvolumeClaimTemplates. - Γράψτε ένα αρχείο στη διαδρομή
/data/test.txt. - Διαγράψτε το Pod.
- Μετά την αναδημιουργία του, επαληθεύστε ότι το αρχείο εξακολουθεί να υπάρχει.
- Τεκμηριώστε το StorageClass και τους περιορισμούς του Lab.
Εργασία C8: Render με Helm και Kustomize
- Δημιουργήστε ένα μικρό Kustomize Base και ένα
devOverlay. - Κάντε Render του Overlay με
kubectl kustomize. - Δημιουργήστε ελάχιστο Helm Chart ή χρησιμοποιήστε ένα τοπικό παράδειγμα Chart.
- Κάντε Render του Chart με
helm template. - Συγκρίνετε πόσο εύκολα ελέγχονται οι αλλαγές, την Παραμετροποίηση και τον κίνδυνο σφαλμάτων.
8. Μέρος D: Διαδρομή Troubleshooting
Διερευνήστε πέντε μοτίβα σφαλμάτων. Για κάθε μοτίβο τεκμηριώστε σύμπτωμα, διάγνωση, αιτία, διόρθωση και επαλήθευση.
| Μοτίβο σφάλματος | Ελάχιστη διάγνωση |
|---|---|
Pod παραμένει Pending λόγω λάθος nodeSelector |
kubectl describe pod, Scheduling Events. |
ImagePullBackOff λόγω λανθασμένου Image Tag |
Pod Events, Image Name και Tag. |
CrashLoopBackOff λόγω λανθασμένου Startup Command |
kubectl logs, kubectl logs --previous, Exit Code. |
PVC παραμένει Pending λόγω λάθος StorageClass |
kubectl describe pvc, StorageClass, Events. |
| Service χωρίς Endpoints λόγω λάθος Selector | Labels, Selector, Endpoints, EndpointSlices. |
9. Βαθμολόγηση
| Πεδίο | Μονάδες | Προσδοκία |
|---|---|---|
| Ερωτήσεις γνώσεων | 20 | Σωστή εξήγηση εννοιών και λειτουργικής επίδρασης. |
| Απόφαση αρχιτεκτονικής | 15 | Αιτιολόγηση της επιλογής Resources και εναλλακτικών με τρόπο που μπορεί να ελεγχθεί. |
| Configuration Workloads | 20 | Ουσιαστική υλοποίηση Probes, Resources, Jobs, CronJobs και Labels. |
| Network, DNS, Ingress/Gateway | 15 | Κατανόηση της διαδρομής Service και της εξάρτησης από Controller. |
| Storage, Helm και Kustomize | 10 | Σωστός χειρισμός PVC/StatefulSet και της διαδικασίας Render. |
| Troubleshooting | 15 | Μεθοδική απομόνωση σφαλμάτων μέσω Status, Events και Logs. |
| Τεκμηρίωση και Cleanup | 5 | Επαναλήψιμη υποβολή και τεκμηριωμένο Cleanup. |
| Σύνολο | 100 |
10. Κριτήρια άμεσης αποτυχίας
Το Assessment θεωρείται αποτυχημένο ανεξάρτητα από τη βαθμολογία, αν:
- χρησιμοποιηθούν Production Resources ή Secrets,
- αφεθούν Cluster-Wide αλλαγές χωρίς τεκμηρίωση,
- δεν αναιρεθούν τα Node Taints ή Labels,
- η υποβολή δεν περιέχει Evidence για τα πρακτικά βήματα,
- ο εξεταζόμενος δεν μπορεί να εξηγήσει τη διαφορά μεταξύ Readiness και Liveness,
- ο εξεταζόμενος δεν μπορεί να διαγνώσει Service χωρίς Endpoints.
11. Λίστα ελέγχου εξεταστή
- Τα Namespace, LimitRange και ResourceQuota υπάρχουν και έχουν τεκμηριωθεί.
- Τα Frontend και Backend έχουν ουσιαστικά Probes και Resources.
- Χρησιμοποιούνται Job και CronJob για εργασίες πεπερασμένης διάρκειας και προγραμματισμένες εργασίες.
- Οι δοκιμές Scheduling περιλαμβάνουν Node Label, λανθασμένο Selector, Taint και Toleration.
- Τα NetworkPolicies περιλαμβάνουν Default Deny, εξαίρεση DNS και επιτρεπόμενη επικοινωνία της εφαρμογής.
- Η εξάρτηση του Ingress/Gateway από Controller έχει ταξινομηθεί σωστά.
- Η διατήρηση δεδομένων με StatefulSet/PVC έχει επαληθευτεί ή έχει εξηγηθεί ο περιορισμός.
- Το Output των Helm/Kustomize έχει γίνει Render πριν από το Apply.
- Η τεκμηρίωση Troubleshooting περιέχει σύμπτωμα, διάγνωση, αιτία, διόρθωση και επαλήθευση.