Workshop wiki · Greek

Ενδεικτική λύση: Kubernetes Assessment 01 – Fundamentals

Πλήρης ενδεικτική λύση για το Kubernetes Fundamentals Assessment, με Manifests, εντολές ελέγχου, διάγνωση και Cleanup.

Workshop examples as ZIP files
Learning progress in the web app

Mark chapters as read, view reading progress and check off practice modules after enabling the optional web app. Workshop progress is calculated from chapters across all document pages. Your choices stay on this device; there is no account or server sync. Installation is not required. Withdrawing your choice in Privacy settings deletes the progress.

Reading progress0%
0%
0 / 8 chapters read
Other language versionGerman ↗English ↗

Ενδεικτική λύση: 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.

Προτεινόμενη μεταβλητή εργασίας:

bash
export NS=exam-fundamentals

01 / 08

2. Μέρος A: Ενδεικτικές απαντήσεις στις ερωτήσεις γνώσεων

1. Σκοπός του Kubernetes και Declarative Desired State

Το Kubernetes είναι μια πλατφόρμα για τη δηλωτική ενορχήστρωση Containerized Applications. Περιγράφετε το Desired State σε Resources όπως Deployments, Services, ConfigMaps ή Secrets. Το Kubernetes αποθηκεύει αυτή την κατάσταση μέσω του API Server και οι Controllers τη συγκρίνουν συνεχώς με την παρατηρούμενη τρέχουσα κατάσταση. Οι αποκλίσεις διορθώνονται μέσω Reconciliation, για παράδειγμα με τη δημιουργία νέου Pod όταν λείπει κάποιο.

Επαλήθευση:

bash
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.

Επαλήθευση:

bash
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:

bash
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:

bash
kubectl get pod -n exam-fundamentals -o yaml | grep -A5 ownerReferences

7. Πώς βρίσκει ένα Service τα Pods του

Ένα Service βρίσκει Pods μέσω Label Selectors. Ο Selector του Service πρέπει να ταιριάζει με τα Labels των Pods. Το Service δεν γνωρίζει σταθερά ονόματα Pods.

Έλεγχος:

bash
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, περιγραφές ή πρόσθετες πληροφορίες.

Παράδειγμα:

yaml
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.

Παράδειγμα:

bash
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.

02 / 08

3. Μέρος B: Ανάλυση Manifest

Manifest εισόδου:

yaml
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.

03 / 08

4. Μέρος C: Πρακτική λύση

C1: Προετοιμασία του Namespace

namespace.yml

yaml
apiVersion: v1
kind: Namespace
metadata:
  name: exam-fundamentals
  labels:
    environment: exam
    level: fundamentals

Εφαρμογή και έλεγχος:

bash
kubectl config current-context
kubectl get nodes -o wide
kubectl apply -f namespace.yml
kubectl get namespace exam-fundamentals
kubectl version --client

Προαιρετικός ορισμός του προεπιλεγμένου Namespace:

bash
kubectl config set-context --current --namespace=exam-fundamentals

C2: Rollout του Deployment

configmap.yml

yaml
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

yaml
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

yaml
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

Εφαρμογή:

bash
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:

bash
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

yaml
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

Εφαρμογή και έλεγχος:

bash
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

Προαιρετική λειτουργική δοκιμή:

bash
kubectl run curl --rm -i --tty --restart=Never \
  --image=curlimages/curl:8.8.0 \
  -n exam-fundamentals -- http://web

Εναλλακτική, αν τα διαδραστικά Pods συμπεριφέρονται διαφορετικά:

bash
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

bash
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.

04 / 08

5. Μέρος D: Διάγνωση και λειτουργική σημείωση

D1: Service χωρίς Endpoints

Σκόπιμα λανθασμένος Service Selector:

yaml
selector:
  app: wrong-web

Σύμπτωμα:

bash
kubectl get endpoints web -n exam-fundamentals

Τυπικό αποτέλεσμα:

text
NAME   ENDPOINTS   AGE
web    <none>      ...

Διάγνωση:

bash
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.

Διόρθωση:

yaml
selector:
  app: web

Επαλήθευση:

bash
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

markdown
# 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.

05 / 08

6. Αναμενόμενα αρχεία υποβολής

Μια πλήρης υποβολή περιλαμβάνει:

text
01-fundamentals-submission/
  answers.md
  namespace.yml
  deployment.yml
  service.yml
  configmap.yml
  secret.yml
  evidence.md
  cleanup.md

Το περιεχόμενο πρέπει να είναι επαναλήψιμο. Ο εξεταστής δεν χρειάζεται τα ακριβή ονόματα Pods ή IP Addresses, αλλά η διαδικασία επαλήθευσης πρέπει να είναι σαφής.


06 / 08

7. Cleanup

Προτεινόμενο Cleanup:

bash
kubectl delete namespace exam-fundamentals

Αν δεν επιτρέπεται η διαγραφή του Namespace:

bash
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

Επαλήθευση:

bash
kubectl get all -n exam-fundamentals
kubectl get namespace exam-fundamentals

07 / 08

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 Μέτρια.
08 / 08

K8S · Orthevs Academy

31 modules as one continuous learning path.

The sequence remains unchanged: from the lab skeleton through technical foundations and operating models to final troubleshooting. The technical directory names are deliberately preserved.

Orthevs – Engineering the foundation for what comes next.

Orthevs as an app

Install Orthevs

The Orthevs web app can be installed on supported mobile devices and desktop browsers.

iPhone and iPad

Open Orthevs in Safari. Tap Share, then Add to Home Screen. Enable Open as Web App if offered, then tap Add.

Android

For the web app, open the browser menu and choose Install app or Add to Home screen. Confirm the installation.

Desktop browser

Open the browser menu or the install icon in the address bar, then choose Install app or Add to Dock.

Web app installation depends on your browser. If no install prompt appears, follow the browser steps shown above.