Ενδεικτική λύση: Kubernetes Assessment 01 – Fundamentals
Επίπεδο δυσκολίας: Fundamentals
Γλώσσα: Ελληνικά
Τύπος: ενδεικτική λύση / οδηγός αναμενόμενων απαντήσεων
Αυτό το αρχείο είναι η αντίστοιχη λύση του Assessment 01 Fundamentals. Οι εντολές και τα Manifests προορίζονται για Lab Cluster. Μη χρησιμοποιείτε Production Cluster Contexts ή πραγματικά Credentials.
1. Οδηγίες χρήσης
Αυτή η ενδεικτική λύση παρουσιάζει μια πλήρη και ιχνηλατήσιμη υποβολή επιπέδου Fundamentals. Συγκεκριμένα αποτελέσματα, όπως ονόματα Pods, Cluster και Nodes, IP Addresses και Kubernetes Versions, διαφέρουν σε πραγματικό Lab. Σημασία έχει ο εξεταζόμενος να:
- εργάζεται στο Namespace
exam-fundamentals, - υποβάλλει Resources ως YAML Manifests,
- επαληθεύει το Rollout και το Service μέσω
kubectl, - μη χρησιμοποιεί πραγματικά Secrets,
- διερευνά συστηματικά τα μοτίβα σφαλμάτων με Status, Events, Logs και Endpoints.
Προτεινόμενη μεταβλητή εργασίας:
export NS=exam-fundamentals
2. Μέρος A: Ενδεικτικές απαντήσεις στις ερωτήσεις γνώσεων
1. Σκοπός του Kubernetes και Declarative Desired State
Το Kubernetes είναι μια πλατφόρμα για τη δηλωτική ενορχήστρωση Containerized Applications. Περιγράφετε το Desired State σε Resources όπως Deployments, Services, ConfigMaps ή Secrets. Το Kubernetes αποθηκεύει αυτή την κατάσταση μέσω του API Server και οι Controllers τη συγκρίνουν συνεχώς με την παρατηρούμενη τρέχουσα κατάσταση. Οι αποκλίσεις διορθώνονται μέσω Reconciliation, για παράδειγμα με τη δημιουργία νέου Pod όταν λείπει κάποιο.
Επαλήθευση:
kubectl get deployment,pod,svc -n exam-fundamentals
kubectl describe deployment web -n exam-fundamentals
Συνηθισμένο λάθος: Το Kubernetes εφαρμόζει με συνέπεια ακόμη και ένα λανθασμένο Manifest, αν αυτό δηλωθεί ως Desired State.
2. Ρόλος του API Server
Ο API Server είναι η κεντρική διεπαφή του Cluster. Το kubectl, οι Controllers, ο Scheduler και άλλα Components επικοινωνούν μέσω αυτού με το Kubernetes API. Ο API Server πραγματοποιεί Authentication και Authorization των Requests, εκτελεί Admission Checks και αποθηκεύει τα αποδεκτά Objects στο Cluster State.
Επαλήθευση:
kubectl cluster-info
kubectl api-resources
3. Γιατί το etcd είναι κρίσιμο
Το etcd αποθηκεύει το Cluster State, συμπεριλαμβανομένων των Kubernetes Objects, του Configuration και, ανάλογα με τη διαμόρφωση, των Secrets. Αν το etcd αποτύχει ή χαθούν δεδομένα, το Cluster δεν μπορεί πλέον να ανασυνθέσει αξιόπιστα το Desired State. Σε Production περιβάλλοντα είναι σημαντικά τα Backup, οι δοκιμές Restore, η προστασία πρόσβασης και το Encryption.
Για το επίπεδο Fundamentals δεν χρειάζεται να λειτουργείτε οι ίδιοι το etcd, αλλά πρέπει να κατανοείτε πόσο κρίσιμο είναι.
4. Scheduler, Controller Manager και kubelet
| Component | Ρόλος |
|---|---|
| Scheduler | Αντιστοιχίζει νέα Pods σε κατάλληλα Nodes. |
| Controller Manager | Εκτελεί Controller Loops, για παράδειγμα Controllers των Deployments, ReplicaSets και Nodes. |
| kubelet | Εκτελείται σε κάθε Node και υλοποιεί τα PodSpecs μέσω της Container Runtime. |
Επαλήθευση για προβλήματα Pods:
kubectl get pod -o wide -n exam-fundamentals
kubectl describe pod <pod> -n exam-fundamentals
5. Διαφορά μεταξύ Pod, ReplicaSet και Deployment
Το Pod είναι η μικρότερη μονάδα που μπορεί να αναπτυχθεί. Το ReplicaSet διασφαλίζει ότι εκτελείται ο επιθυμητός αριθμός ισοδύναμων Pods. Το Deployment διαχειρίζεται ReplicaSets και παρέχει Rollouts, Rollback και κλιμακούμενες δηλωτικές ενημερώσεις.
Για Stateless Applications δημιουργείτε συνήθως Deployments αντί για μεμονωμένα Pods.
6. Γιατί τα Pods σπάνια δημιουργούνται απευθείας
Τα Pods που δημιουργούνται απευθείας δεν αντικαθίστανται αυτόματα από ανώτερο Controller όταν διαγραφούν ή αλλάξουν. Τα Deployments, StatefulSets, Jobs και DaemonSets παρέχουν Reconciliation, Rollouts, Scaling και λειτουργικούς κανόνες.
Επαλήθευση της αλυσίδας Owners:
kubectl get pod -n exam-fundamentals -o yaml | grep -A5 ownerReferences
7. Πώς βρίσκει ένα Service τα Pods του
Ένα Service βρίσκει Pods μέσω Label Selectors. Ο Selector του Service πρέπει να ταιριάζει με τα Labels των Pods. Το Service δεν γνωρίζει σταθερά ονόματα Pods.
Έλεγχος:
kubectl get pods --show-labels -n exam-fundamentals
kubectl get svc web -o yaml -n exam-fundamentals
kubectl get endpoints,endpointslices -n exam-fundamentals
8. Διαφορά μεταξύ Label και Annotation
Τα Labels είναι σύντομα Metadata που μπορούν να χρησιμοποιηθούν για ομαδοποίηση και επιλογή. Τα Services και Deployments χρησιμοποιούν Labels μέσω Selectors. Τα Annotations είναι Metadata που δεν χρησιμοποιούνται για επιλογή· προορίζονται για Tools, περιγραφές ή πρόσθετες πληροφορίες.
Παράδειγμα:
labels:
app: web
environment: exam
annotations:
description: "Fundamentals assessment workload"
9. Namespace και όριο ασφαλείας
Ένα Namespace οργανώνει λογικά τα Kubernetes Resources και επιτρέπει χωριστές προβολές, RBAC, Quotas, LimitRanges και Policies. Το Namespace δεν αντικαθιστά την πλήρη απομόνωση ασφαλείας. Χωρίς RBAC, NetworkPolicy, Pod Security και Quotas, οι κίνδυνοι μπορεί να περάσουν τα όρια των Namespaces.
10. ConfigMaps και Secrets
Τα ConfigMaps περιέχουν μη ευαίσθητο Configuration, όπως Feature Flags, URLs ή τρόπους λειτουργίας. Τα Secrets προορίζονται για ευαίσθητες τιμές, όπως Tokens ή Passwords. Στο Lab χρησιμοποιούνται μόνο δοκιμαστικές τιμές.
Σημαντικό: Τα Kubernetes Secrets δεν είναι αυτομάτως ασφαλή επειδή αποθηκεύονται ως Secret Resources. Πρέπει να προστατεύονται η πρόσβαση, η αποθήκευση και η διαδικασία Rotation.
11. Γιατί το Base64 δεν είναι Encryption
Το Base64 είναι μόνο Encoding. Οποιοσδήποτε μπορεί να αποκωδικοποιήσει μια τιμή Base64. Η προστασία των Kubernetes Secrets βασίζεται σε RBAC, Encryption ευαίσθητων δεδομένων At Rest, προστασία πρόσβασης στα Backups και ασφαλείς διαδικασίες διαχείρισης Secrets.
Παράδειγμα:
echo bm90LWEtcmVhbC1zZWNyZXQ= | base64 -d
12. Πρώτες εντολές για συνηθισμένα σφάλματα
| Μοτίβο σφάλματος | Πρώτες εντολές διάγνωσης | Συνήθης αιτία |
|---|---|---|
ImagePullBackOff |
kubectl describe pod <pod> και Events |
Λάθος Image Name, Tag, Registry ή Pull Secret. |
CrashLoopBackOff |
kubectl logs <pod> και kubectl logs <pod> --previous |
Η διεργασία τερματίζεται ή το Configuration δεν είναι έγκυρο. |
| Service χωρίς Endpoints | kubectl get endpoints, έλεγχος Labels και Service Selector |
Ο Selector δεν ταιριάζει με τα Pod Labels ή τα Pods δεν είναι Ready. |
Pod σε κατάσταση Pending |
kubectl describe pod <pod> και Events |
Resources, Node Selector, Taints ή PVC εμποδίζουν το Scheduling. |
3. Μέρος B: Ανάλυση Manifest
Manifest εισόδου:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: exam-fundamentals
labels:
app: web
tier: frontend
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
Απαντήσεις
| Ερώτηση | Ενδεικτική απάντηση |
|---|---|
| API Group και Version | apps/v1· το Resource ανήκει στο Apps API Group. |
| Resource | Ένα Deployment με όνομα web. |
| Desired State | Το Desired State ορίζεται στο spec, για παράδειγμα στα replicas: 2 και στο Pod Template. |
| Deployment Labels | Το Deployment λαμβάνει app=web και tier=frontend. |
| Pod Labels | Τα Pods λαμβάνουν app=web και tier=frontend στο Template. |
Ρόλος του spec.selector.matchLabels |
Ο Selector ορίζει ποια Pods διαχειρίζεται το Deployment. |
| Γιατί πρέπει να ταιριάζουν Selector και Pod Template Labels | Αν δεν ταιριάζουν, το Deployment δεν μπορεί να διαχειριστεί σωστά τα Pods του· στα Deployments ο Selector είναι επίσης πρακτικά Immutable. |
| Resource που δημιουργείται έμμεσα | Το Deployment δημιουργεί ReplicaSet και το ReplicaSet δημιουργεί Pods. |
| Έλεγχος Rollout | kubectl rollout status deployment/web -n exam-fundamentals μαζί με kubectl get deployment,rs,pod -n exam-fundamentals. |
4. Μέρος C: Πρακτική λύση
C1: Προετοιμασία του Namespace
namespace.yml
apiVersion: v1
kind: Namespace
metadata:
name: exam-fundamentals
labels:
environment: exam
level: fundamentals
Εφαρμογή και έλεγχος:
kubectl config current-context
kubectl get nodes -o wide
kubectl apply -f namespace.yml
kubectl get namespace exam-fundamentals
kubectl version --client
Προαιρετικός ορισμός του προεπιλεγμένου Namespace:
kubectl config set-context --current --namespace=exam-fundamentals
C2: Rollout του Deployment
configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: web-config
namespace: exam-fundamentals
labels:
app: web
environment: exam
data:
APP_MODE: exam
WELCOME_TEXT: "Hello from the Fundamentals assessment"
secret.yml
apiVersion: v1
kind: Secret
metadata:
name: web-secret
namespace: exam-fundamentals
labels:
app: web
environment: exam
type: Opaque
stringData:
DEMO_PASSWORD: "not-a-real-secret"
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: exam-fundamentals
labels:
app: web
tier: frontend
environment: exam
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
tier: frontend
environment: exam
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- name: http
containerPort: 80
env:
- name: APP_MODE
valueFrom:
configMapKeyRef:
name: web-config
key: APP_MODE
volumeMounts:
- name: demo-secret
mountPath: /etc/demo-secret
readOnly: true
volumes:
- name: demo-secret
secret:
secretName: web-secret
Εφαρμογή:
kubectl apply --dry-run=server -f configmap.yml
kubectl apply --dry-run=server -f secret.yml
kubectl apply --dry-run=server -f deployment.yml
kubectl apply -f configmap.yml
kubectl apply -f secret.yml
kubectl apply -f deployment.yml
kubectl rollout status deployment/web -n exam-fundamentals
kubectl get deployment,replicaset,pod -n exam-fundamentals
Επαλήθευση της χρήσης των ConfigMap και Secret:
POD=$(kubectl get pod -l app=web -n exam-fundamentals -o jsonpath='{.items[0].metadata.name}')
kubectl exec "$POD" -n exam-fundamentals -- printenv APP_MODE
kubectl exec "$POD" -n exam-fundamentals -- ls -l /etc/demo-secret
kubectl exec "$POD" -n exam-fundamentals -- cat /etc/demo-secret/DEMO_PASSWORD
Αναμενόμενα αποτελέσματα:
- Το
APP_MODEεμφανίζειexam. - Ο φάκελος
/etc/demo-secretπεριέχει το αρχείοDEMO_PASSWORD. - Η τιμή είναι μόνο δοκιμαστική τιμή για το Lab.
C3: Δημιουργία του Service
service.yml
apiVersion: v1
kind: Service
metadata:
name: web
namespace: exam-fundamentals
labels:
app: web
environment: exam
spec:
type: ClusterIP
selector:
app: web
ports:
- name: http
port: 80
targetPort: 80
Εφαρμογή και έλεγχος:
kubectl apply --dry-run=server -f service.yml
kubectl apply -f service.yml
kubectl get svc,endpoints,endpointslices -n exam-fundamentals
kubectl describe svc web -n exam-fundamentals
Προαιρετική λειτουργική δοκιμή:
kubectl run curl --rm -i --tty --restart=Never \
--image=curlimages/curl:8.8.0 \
-n exam-fundamentals -- http://web
Εναλλακτική, αν τα διαδραστικά Pods συμπεριφέρονται διαφορετικά:
kubectl run curl --restart=Never --image=curlimages/curl:8.8.0 -n exam-fundamentals -- sleep 3600
kubectl wait --for=condition=Ready pod/curl -n exam-fundamentals --timeout=60s
kubectl exec curl -n exam-fundamentals -- curl -s http://web
kubectl delete pod curl -n exam-fundamentals
C4: Χρήση ConfigMap και Secret
Η προσάρτηση περιλαμβάνεται ήδη στο deployment.yml. Μια καλή απάντηση εξηγεί επιπλέον ότι:
- οι τιμές ConfigMap μπορούν να διατεθούν ως Environment Variables ή Files,
- οι τιμές Secret μπορούν επίσης να διατεθούν ως Environment Variables ή Volumes,
- τα Secret Volumes πρέπει να προσαρτώνται Read-Only,
- πραγματικά Secrets δεν ανήκουν σε αυτό το Assessment και δεν πρέπει να αποθηκεύονται χωρίς Encryption στο Version Control.
C5: Rollout, Scaling και Rollback
kubectl scale deployment/web --replicas=3 -n exam-fundamentals
kubectl rollout status deployment/web -n exam-fundamentals
kubectl get pods -l app=web -n exam-fundamentals
kubectl set image deployment/web nginx=nginx:1.26 -n exam-fundamentals
kubectl rollout status deployment/web -n exam-fundamentals
kubectl rollout history deployment/web -n exam-fundamentals
kubectl get deployment web -n exam-fundamentals -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
kubectl rollout undo deployment/web -n exam-fundamentals
kubectl rollout status deployment/web -n exam-fundamentals
kubectl get deployment web -n exam-fundamentals -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
Αναμενόμενα αποτελέσματα:
- Μετά το Scaling εκτελούνται τρία επιθυμητά Replicas.
- Μετά το
set image, το Deployment εμφανίζειnginx:1.26. - Μετά το
rollout undo, είναι ξανά ενεργό το προηγούμενο Revision, σε αυτή την ενδεικτική λύση τοnginx:1.27.
5. Μέρος D: Διάγνωση και λειτουργική σημείωση
D1: Service χωρίς Endpoints
Σκόπιμα λανθασμένος Service Selector:
selector:
app: wrong-web
Σύμπτωμα:
kubectl get endpoints web -n exam-fundamentals
Τυπικό αποτέλεσμα:
NAME ENDPOINTS AGE
web <none> ...
Διάγνωση:
kubectl get pods -n exam-fundamentals --show-labels
kubectl get svc web -n exam-fundamentals -o yaml
kubectl describe svc web -n exam-fundamentals
kubectl get endpoints,endpointslices -n exam-fundamentals
Αιτία:
Το Service αναζητά Pods με app=wrong-web, ενώ τα πραγματικά Pods έχουν app=web.
Διόρθωση:
selector:
app: web
Επαλήθευση:
kubectl apply -f service.yml
kubectl get endpoints web -n exam-fundamentals
kubectl get endpointslices -l kubernetes.io/service-name=web -n exam-fundamentals
D2: Εξήγηση μοτίβων σφαλμάτων
| Μοτίβο σφάλματος | Διάγνωση | Πιθανότερη αιτία | Διόρθωση |
|---|---|---|---|
ImagePullBackOff |
kubectl describe pod <pod> και Events |
Λάθος Image Name, Tag, Registry ή Pull Secret. | Ορίστε σωστό Image και ελέγξτε την πρόσβαση στη Registry. |
CrashLoopBackOff |
kubectl logs <pod> και kubectl logs <pod> --previous |
Η διεργασία τερματίζεται επανειλημμένα. | Διορθώστε Command ή Configuration και επαληθεύστε το Rollout. |
| Service χωρίς Endpoints | kubectl get endpoints, Labels και Service Selector |
Ο Selector δεν ταιριάζει με τα Pod Labels ή τα Pods δεν είναι Ready. | Διορθώστε τον Selector ή το πρόβλημα Readiness. |
Pod σε κατάσταση Pending |
kubectl describe pod, Scheduling Events και Node Resources |
Ανεπαρκή Resources, Node Selector, Taints ή PVC. | Διορθώστε τον περιορισμό Scheduling ή το πρόβλημα Resources/Storage. |
D3: Παράδειγμα evidence.md
# Evidence: Fundamentals Assessment
## Context και Namespace
- Context: `<lab-context>`
- Namespace: `exam-fundamentals`
- Αριθμός Nodes: `<n>`
## Manifests που εφαρμόστηκαν
- namespace.yml
- configmap.yml
- secret.yml
- deployment.yml
- service.yml
## Επαλήθευση
```bash
kubectl get deployment,rs,pod,svc,endpoints,endpointslices -n exam-fundamentals
kubectl rollout status deployment/web -n exam-fundamentals
kubectl describe svc web -n exam-fundamentals
```
## Σφάλμα και διόρθωση
Ο Service Selector άλλαξε σκόπιμα σε `app=wrong-web`. Το Service δεν είχε Endpoints. Η διόρθωση ήταν η επαναφορά του Selector σε `app=web`.
## Cleanup
Διαγράψτε τα Resources μέσω Manifests ή διαγράψτε το Namespace.
6. Αναμενόμενα αρχεία υποβολής
Μια πλήρης υποβολή περιλαμβάνει:
01-fundamentals-submission/
answers.md
namespace.yml
deployment.yml
service.yml
configmap.yml
secret.yml
evidence.md
cleanup.md
Το περιεχόμενο πρέπει να είναι επαναλήψιμο. Ο εξεταστής δεν χρειάζεται τα ακριβή ονόματα Pods ή IP Addresses, αλλά η διαδικασία επαλήθευσης πρέπει να είναι σαφής.
7. Cleanup
Προτεινόμενο Cleanup:
kubectl delete namespace exam-fundamentals
Αν δεν επιτρέπεται η διαγραφή του Namespace:
kubectl delete -f service.yml --ignore-not-found
kubectl delete -f deployment.yml --ignore-not-found
kubectl delete -f secret.yml --ignore-not-found
kubectl delete -f configmap.yml --ignore-not-found
kubectl delete -f namespace.yml --ignore-not-found
Επαλήθευση:
kubectl get all -n exam-fundamentals
kubectl get namespace exam-fundamentals
8. Βαθμολόγηση και σημειώσεις εξεταστή
Μια ισχυρή λύση:
- εξηγεί το Desired State και το Reconciliation χωρίς περιττή πολυπλοκότητα,
- διακρίνει καθαρά Pod, ReplicaSet και Deployment,
- χρησιμοποιεί σωστά Service Selectors και EndpointSlices,
- αντιμετωπίζει τα Secrets ως ευαίσθητα παρότι χρησιμοποιούνται μόνο δοκιμαστικές τιμές,
- επαληθεύει κάθε βήμα με
kubectl, - απομονώνει μεθοδικά προβλήματα με εσφαλμένους Service Selectors,
- παρέχει ασφαλή διαδικασία Cleanup.
Συνήθεις αφαιρέσεις μονάδων:
| Πρόβλημα | Αφαίρεση μονάδων |
|---|---|
| Απουσιάζει το Namespace ή χρησιμοποιείται λάθος Namespace | Μεγάλη. |
| Το Deployment λειτουργεί, αλλά το Service έχει λανθασμένο Selector | Μέτρια έως μεγάλη. |
| Δεν υπάρχουν Evidence για την επαλήθευση του Rollout | Μέτρια. |
| Το ConfigMap ή το Secret δεν χρησιμοποιείται πράγματι | Μέτρια. |
| Υποβάλλεται πραγματικό Password ή Token | Άμεση αποτυχία ή μεγάλη αφαίρεση. |
| Δεν τεκμηριώνεται το Cleanup | Μέτρια. |