Workshop wiki · Greek

Αρχιτεκτονική: Kubernetes

Αρχιτεκτονική και λειτουργία Kubernetes: Control Plane, workloads, δίκτυο, storage, ασφάλεια, observability και troubleshooting.

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 / 21 chapters read
Other language versionGerman ↗English ↗

Αρχιτεκτονική: Kubernetes

Υλικό εργαστηρίου για αρχιτεκτονική, λειτουργία και αντιμετώπιση προβλημάτων Kubernetes. Έκδοση: 13 Ιουνίου 2026

1. Στόχος

Αυτό το έγγραφο περιγράφει την εννοιολογική και λειτουργική αρχιτεκτονική του Kubernetes για ένα πρακτικό εργαστήριο. Δεν ορίζει απλώς όρους· συνδέει τις βασικές έννοιες με λειτουργικές αποφάσεις, συνήθεις αστοχίες και συγκεκριμένα manifests.

Μετά το εργαστήριο, δεν πρέπει πλέον να βλέπεις το Kubernetes ως συλλογή ανεξάρτητων αρχείων YAML, αλλά ως σύστημα ελέγχου βάσει κατάστασης: περιγράφεις μια κατάσταση στόχο, το Kubernetes την επικυρώνει και την αποθηκεύει στο API, ενώ οι Controllers εργάζονται συνεχώς για να εναρμονίσουν την πραγματική κατάσταση με τον στόχο.

Το έγγραφο χρησιμεύει ως:

  • Αναφορά για τις ενότητες και τις ασκήσεις του εργαστηρίου.
  • Βάση συζητήσεων για την αρχιτεκτονική πλατφόρμας.
  • Αφετηρία για troubleshooting και ανάληψη λειτουργικών ευθυνών.
  • Βοήθημα αποφάσεων για τον σχεδιασμό workloads, δικτύου, storage και ασφάλειας.

Δεν προορίζεται ως πλήρης οδηγός εγκατάστασης για συγκεκριμένο cloud provider ή distribution όπως AKS, EKS, GKE, OpenShift, Rancher ή k3s. Οι αρχιτεκτονικές αρχές ισχύουν σε όλα τα clusters, ενώ οι επιμέρους υλοποιήσεις μπορεί να διαφέρουν.

01 / 21

2. Μαθησιακοί στόχοι

Αφού μελετήσεις αυτό το υλικό, θα μπορείς να:

  • εξηγείς τις ευθύνες του Control Plane, των Worker Nodes και των add-ons,
  • παρακολουθείς τη διαδρομή από ένα manifest έως ένα Pod που εκτελείται,
  • κατατάσσεις αρχιτεκτονικά τα Deployments, ReplicaSets, Services, ConfigMaps, Secrets, PersistentVolumeClaims και resources Ingress/Gateway,
  • αποφασίζεις ποιο Kubernetes object ταιριάζει σε κάθε ανάγκη,
  • διερευνάς συστηματικά καταστάσεις αστοχίας όπως ImagePullBackOff, CrashLoopBackOff, Pending, αποτυχημένους ελέγχους readiness ή προβλήματα δικτύου,
  • ορίζεις ουσιαστικά Requests, Limits, probes και στρατηγικές rollout,
  • τοποθετείς μηχανισμούς ασφάλειας όπως RBAC, ServiceAccounts, Admission Control, Pod Security και NetworkPolicies στο αρχιτεκτονικό τους πλαίσιο,
  • τεκμηριώνεις λειτουργικές αποφάσεις αντί να τις κρύβεις έμμεσα σε διάσπαρτα αρχεία YAML.
02 / 21

3. Επισκόπηση αρχιτεκτονικής

3.1. Βασική ιδέα

Το Kubernetes είναι πλατφόρμα εκτέλεσης εφαρμογών σε containers. Περιγράφεις εφαρμογές, διαμόρφωση, πρόσβαση δικτύου, μόνιμη αποθήκευση και δικαιώματα μέσω API objects. Το Kubernetes δέχεται αυτά τα objects και συντονίζει την εκτέλεσή τους σε ένα cluster μηχανών.

Το ουσιαστικό σημείο είναι ότι το Kubernetes δεν ξεκινά απλώς containers. Διαχειρίζεται workloads. Ένα workload περιλαμβάνει Desired State, αποφάσεις scheduling, συμπεριφορά Container Runtime, ταυτότητα δικτύου, διαμόρφωση, ασφάλεια, health checks και πληροφορίες κατάστασης.

flowchart LR
  user[You: manifest, CLI, or GitOps] --> api[Kubernetes API Server]
  api --> store[(etcd: cluster state)]
  api --> controllers[Controllers]
  controllers --> scheduler[Scheduler]
  scheduler --> nodes[Worker Nodes]
  nodes --> pods[Pods and containers]
  pods --> services[Services, DNS, Ingress/Gateway]
  pods --> obs[Logs, events, metrics]
  obs --> user

Το Kubernetes διαχωρίζει αρκετά πεδία ευθύνης:

Πεδίο Βασικό ερώτημα Παραδείγματα
API και κατάσταση Τι πρέπει να υπάρχει; Deployment, Service, Secret, Namespace
Scheduling Πού πρέπει να εκτελείται ένα Pod; Scheduler, Requests, Affinity, Taints
Runtime Πώς ξεκινά το container; Kubelet, containerd, CRI-O
Δίκτυο Πώς επικοινωνούν τα workloads; CNI, Service, DNS, Ingress, Gateway API
Μόνιμη αποθήκευση Πού διατηρούνται τα δεδομένα; PVC, PV, StorageClass, CSI
Ασφάλεια Ποιος επιτρέπεται να κάνει τι και υπό ποιες προϋποθέσεις; RBAC, Admission Control, Pod Security, NetworkPolicy
Λειτουργία Πώς ανιχνεύεις την κατάσταση και τις αστοχίες; Events, logs, metrics, traces, alerts

3.2. Control Plane, Worker Nodes και add-ons

Ένα Kubernetes cluster αποτελείται από Control Plane και έναν ή περισσότερους Worker Nodes.

Το Control Plane διατηρεί την κατάσταση του cluster, επικυρώνει API requests και λαμβάνει κεντρικές αποφάσεις ελέγχου. Οι Worker Nodes εκτελούν Pods. Τα add-ons παρέχουν λειτουργίες που χρειάζεται το Kubernetes ως πλατφόρμα, αλλά δεν ανήκουν απαραίτητα σε έναν ενιαίο πυρήνα.

flowchart TB
  subgraph CP[Control Plane]
    api[kube-apiserver]
    etcd[(etcd)]
    sched[kube-scheduler]
    cm[kube-controller-manager]
    ccm[cloud-controller-manager]
  end

  subgraph W1[Worker Node]
    kubelet1[kubelet]
    proxy1[kube-proxy or eBPF dataplane]
    runtime1[Container Runtime]
    pod1[Pods]
  end

  subgraph ADD[Add-ons]
    dns[CoreDNS]
    ingress[Ingress/Gateway Controller]
    cni[CNI Plugin]
    csi[CSI Driver]
    metrics[Metrics/Logging]
  end

  api <--> etcd
  cm --> api
  sched --> api
  kubelet1 <--> api
  kubelet1 --> runtime1
  runtime1 --> pod1
  pod1 --> dns
  pod1 --> cni
  pod1 --> csi
  ingress --> api

3.3. Reconciliation Loop

Ο κεντρικός μηχανισμός λειτουργίας του Kubernetes είναι το Reconciliation Loop. Οι Controllers παρακολουθούν το API, συγκρίνουν Desired State με Actual State και εκτελούν διορθωτικές ενέργειες.

Παράδειγμα: ορίζεις Deployment με replicas: 3. Αν εκτελούνται μόνο δύο Pods, ο αρμόδιος Controller δημιουργεί άλλο ένα. Αν εκτελούνται τέσσερα Pods, αφαιρεί ένα. Επομένως, το Kubernetes προσανατολίζεται πρωτίστως στην κατάσταση και όχι στις μεμονωμένες εντολές.

flowchart LR
  desired[Desired state\nmanifest in the API] --> compare[Controller compares]
  actual[Actual state\nPods, Nodes, network, storage] --> compare
  compare --> action[Corrective action]
  action --> actual

Για τη λειτουργία αυτό σημαίνει:

  • Δεν ερευνάς μόνο τι εκτέλεσες, αλλά και ποια κατάσταση έχει αποθηκευτεί στο API.
  • Πολλά προβλήματα δεν προέρχονται από μία εντολή, αλλά από αντικρουόμενα Desired States.
  • Οι Controllers δημιουργούν παράγωγα objects. Ένα Deployment δημιουργεί ReplicaSets· τα ReplicaSets δημιουργούν Pods.
  • Οι χειροκίνητες αλλαγές σε παράγωγα objects συνήθως δεν διατηρούνται, επειδή ο γονικός Controller τις αντικαθιστά ξανά.
03 / 21

4. Νοητικό μοντέλο Kubernetes

4.1. Desired State

Το Desired State είναι η επιδιωκόμενη κατάσταση ενός resource. Την περιγράφεις σε YAML ή JSON, συνήθως σε YAML. Το Kubernetes αποθηκεύει αυτή την κατάσταση στο etcd και προσπαθεί να εναρμονίσει μαζί της την πραγματική κατάσταση.

Παράδειγμα:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.27

Με αυτό δεν λες «ξεκίνα τώρα τρία containers». Λες «φρόντιζε συνεχώς να υπάρχουν τρία κατάλληλα Pod replicas». Πρόκειται για θεμελιώδη διαφορά.

4.2. Δηλωτικό API

Το Kubernetes χρησιμοποιεί δηλωτικό API. Περιγράφεις το αποτέλεσμα και όχι κάθε ενδιάμεσο βήμα. Αυτό ταιριάζει με GitOps και Infrastructure as Code, επειδή το Desired State μπορεί να γίνεται versioning και review.

Τυπική ροή εργασίας:

bash
kubectl apply -f deployment.yaml
kubectl get deployment web
kubectl rollout status deployment/web

Σημαντικές συνέπειες:

  • Το kubectl apply έχει σχεδιαστεί για επανειλημμένη εφαρμογή manifests.
  • Το kubectl create είναι καταλληλότερο για δημιουργία μίας φοράς.
  • Το kubectl edit είναι βολικό σε lab, αλλά επικίνδυνο σε παραγωγή, επειδή οι αλλαγές δεν καταγράφονται αυτόματα σε versions.
  • GitOps Controllers όπως Argo CD ή Flux αναμένουν το Git να αποτελεί την έγκυρη πηγή του Desired State.

4.3. Resources, objects και Controllers

Ένα resource είναι ένας τύπος του Kubernetes API, για παράδειγμα Pod, Deployment ή Service. Ένα object είναι συγκεκριμένο στιγμιότυπο αυτού του resource, για παράδειγμα deployment/web.

Σχεδόν κάθε object περιέχει:

Πεδίο Σημασία
apiVersion API group και version, για παράδειγμα apps/v1
kind τύπος resource, για παράδειγμα Deployment
metadata όνομα, Namespace, Labels, annotations, ownerReferences
spec Desired State
status παρατηρούμενη κατάσταση, που συνήθως ορίζεται από Controllers

Συνήθως αλλάζεις το spec, όχι το status. Το status προκύπτει από τη λειτουργία των Controllers και δείχνει τι παρατηρεί το Kubernetes.

4.4. Ονόματα, Labels, selectors και annotations

Τα ονόματα προσδιορίζουν objects μέσα στο πεδίο τους. Ένα όνομα Deployment πρέπει να είναι μοναδικό μέσα στο Namespace.

Τα Labels είναι δομημένα ζεύγη κλειδιού και τιμής που χρησιμεύουν στην επιλογή και ομαδοποίηση objects. Services, ReplicaSets, NetworkPolicies και πολλά άλλα resources χρησιμοποιούν Label selectors.

Τα annotations αποθηκεύουν πρόσθετα metadata που δεν προορίζονται κυρίως για επιλογή. Πολλοί Controllers χρησιμοποιούν annotations για διαμόρφωση, ενσωματώσεις ή υποδείξεις προς εργαλεία.

Παράδειγμα:

yaml
metadata:
  name: web
  labels:
    app.kubernetes.io/name: web
    app.kubernetes.io/component: frontend
    app.kubernetes.io/part-of: shop
    environment: workshop
  annotations:
    owner: platform-team
    documentation: "https://example.invalid/runbooks/web"

Σύσταση για το εργαστήριο:

  • Χρησιμοποίησε συνεπές σχήμα Labels.
  • Χρησιμοποίησε Labels για επιλογή και ομαδοποίηση.
  • Χρησιμοποίησε annotations για περιγραφικές πληροφορίες ή δεδομένα συγκεκριμένων εργαλείων.
  • Σχεδίασε τους selectors πριν δημιουργήσεις resources. Στα Deployments ο selector αποτελεί ουσιαστικά βασικό μέρος της ταυτότητας του resource και δεν πρέπει να αλλάζει αργότερα.

4.5. Namespaces

Τα Namespaces χωρίζουν λογικά ένα cluster σε περιοχές. Τα χρησιμοποιείς για οργάνωση resources, δικαιωμάτων, quotas, NetworkPolicies και πεδίων ονοματοδοσίας. Ωστόσο, ένα Namespace δεν αποτελεί πλήρες όριο ασφάλειας όπως ένα ξεχωριστό cluster.

Τυπικές στρατηγικές Namespaces:

Στρατηγική Παράδειγμα Αξιολόγηση
Ανά περιβάλλον dev, test, prod απλή, αλλά δύσχρηστη όταν αυξηθούν οι ομάδες
Ανά ομάδα team-a, team-b κατάλληλη για κατανομή ευθύνης και RBAC
Ανά εφαρμογή shop, billing, identity κατάλληλη για σαφώς χωριστά προϊόντα
Ανά tenant customer-a, customer-b χρήσιμη μόνο με σωστή απομόνωση, quotas και πολιτικές

Για workloads παραγωγής, απόφυγε το default Namespace. Δημιούργησε ρητά Namespaces και τεκμηρίωσε τον υπεύθυνο, τα quotas και την επιτρεπόμενη πρόσβαση.

Παράδειγμα:

yaml
apiVersion: v1
kind: Namespace
metadata:
  name: workshop
  labels:
    pod-security.kubernetes.io/enforce: baseline
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted
04 / 21

5. Components

5.1. Control Plane

Component Ευθύνη Λειτουργική σημασία
kube-apiserver Κεντρικό επίπεδο API. Δέχεται requests, εκτελεί authentication, authorization και validation και αποθηκεύει objects. Αν το API δεν είναι προσβάσιμο, δεν μπορείς να ελέγξεις το cluster. Σχεδόν όλα τα εργαλεία επικοινωνούν με τον API Server.
etcd Ισχυρά συνεπής αποθήκη key-value για την κατάσταση του cluster. Backup, restore, απόδοση και ασφάλεια είναι κρίσιμα. Απώλεια του etcd σημαίνει απώλεια της έγκυρης κατάστασης cluster.
kube-scheduler Επιλέγει κατάλληλα Nodes για νέα Pods βάσει πόρων, περιορισμών, Affinity, Taints και πολιτικών. Pods σε κατάσταση Pending συνδέονται συχνά με συνθήκες scheduling.
kube-controller-manager Εκτελεί ενσωματωμένους Controllers, όπως τους Controllers Deployment, ReplicaSet, Node και Job. Είναι υπεύθυνο για self-healing και εναρμόνιση Desired State και Actual State.
cloud-controller-manager Ενσωματώνει το Kubernetes με cloud providers, π.χ. load balancers, routes, metadata Nodes και volumes. Σημαντικό σε cloud clusters. Οι αστοχίες εμφανίζονται συχνά σε Services τύπου LoadBalancer, στην αναγνώριση Nodes ή στα cloud volumes.

5.2. Worker Node

Component Ευθύνη Λειτουργική σημασία
kubelet Agent του Node. Καταχωρεί το Node, παρακολουθεί PodSpecs και ξεκινά containers μέσω του Container Runtime. Κεντρική πηγή αστοχιών σε εκκίνηση Pods, volume mounts, probes και κατάσταση Node.
Container Runtime Εκτελεί containers, για παράδειγμα containerd ή CRI-O. Image pulls, εκκίνηση containers, logs και runtime errors συνδέονται με αυτό το επίπεδο.
kube-proxy ή εναλλακτικό dataplane Υλοποιεί κανόνες Services σε επίπεδο Node, παραδοσιακά μέσω iptables/ipvs· ορισμένα CNIs το αντικαθιστούν με eBPF. Σημαντικό για προσβασιμότητα Services, load balancing και συμπεριφορά NodePort.
CNI Plugin Παρέχει το δίκτυο των Pods. Χωρίς λειτουργικό CNI, τα Pods συχνά παραμένουν σε ContainerCreating ή αποτυγχάνει η επικοινωνία μεταξύ Pods.
CSI Node Plugin Συνδέει και κάνει mount το storage στο Node. Σημαντικό για PVCs, σύνδεση volumes, προβλήματα mount και απόδοση storage.

5.3. Add-ons του cluster

Add-on Ευθύνη Τυπικά παραδείγματα
DNS Επίλυση ονομάτων Services και Pods. CoreDNS
Ingress/Gateway Controller Υλοποιεί εξωτερικά HTTP(S) routes. NGINX Ingress, HAProxy, Traefik, Envoy Gateway, cloud-native Controllers
Metrics Παρέχει χρήση πόρων για kubectl top και HPA. metrics-server, Prometheus Adapter
Logging Συλλέγει και αποθηκεύει logs των containers. Fluent Bit, Vector, Loki, Elasticsearch/OpenSearch
Monitoring Metrics, dashboards και alerts. Prometheus, Grafana, Alertmanager
Policy Engine Επικυρώνει ή μεταβάλλει resources σύμφωνα με τους κανόνες του οργανισμού. Kyverno, OPA Gatekeeper, ValidatingAdmissionPolicy
Διαχείριση πιστοποιητικών Αυτοματοποιεί πιστοποιητικά. cert-manager
GitOps Συγχρονίζει την κατάσταση του Git στο cluster. Argo CD, Flux
05 / 21

6. Βασικά Kubernetes objects

Object Σκοπός Πότε το χρησιμοποιείς Συνήθεις αστοχίες
Namespace Λογική ομαδοποίηση resources. Όρια ομάδων, εφαρμογών, tenants ή περιβαλλόντων. Λανθασμένο context Namespace, quotas που λείπουν, ασαφής ευθύνη.
Pod Μικρότερη εκτελέσιμη μονάδα με ένα ή περισσότερα containers. Συνήθως έμμεσα μέσω Controllers όπως Deployment ή Job. Pending, CrashLoopBackOff, ImagePullBackOff, αστοχίες probes.
ReplicaSet Διατηρεί επιθυμητό αριθμό πανομοιότυπων Pods. Συνήθως δημιουργείται από Deployments, σπάνια απευθείας. Χειροκίνητες αλλαγές αντικαθίστανται από το Deployment.
Deployment Διαχειρίζεται stateless εφαρμογές, rollouts και rollbacks. Τυπικό object για web υπηρεσίες, APIs και workers χωρίς σταθερή ταυτότητα. Λανθασμένοι selectors, προβληματικά images, υπερβολικά επιθετικά probes.
StatefulSet Διαχειρίζεται Pods με σταθερή ταυτότητα και ταξινομημένη κλιμάκωση. Databases, brokers και κατανεμημένα συστήματα με ταυτότητα. Λανθασμένη StorageClass, PVCs που μπλοκάρουν, ακατάλληλη στρατηγική update.
DaemonSet Ξεκινά ακριβώς ένα Pod σε κάθε κατάλληλο Node. Node agents, logging, monitoring, components CNI/CSI. Ελλιπή Taints/tolerations, ασύμβατο nodeSelector.
Job Εκτελεί εργασία μέχρι να ολοκληρωθεί. Migrations, batch processing, εργασίες μίας φοράς. Λανθασμένο restartPolicy, πολύ μεγάλο ή μικρό backoffLimit.
CronJob Ξεκινά Jobs σύμφωνα με πρόγραμμα. Περιοδικές εργασίες, backups, αναφορές. Ζώνες ώρας, ταυτόχρονη εκτέλεση, χαμένες εκκινήσεις.
Service Σταθερή εικονική διεύθυνση για μεταβαλλόμενα Pods. Εσωτερική επικοινωνία και load balancing μέσα στο cluster. Selector που δεν ταιριάζει, Endpoints που λείπουν, λάθος port.
Ingress HTTP(S) routing από έξω προς Services. Κλασική web πρόσβαση με κανόνες host και path. Απουσία Ingress Controller, λάθος class, σφάλματα TLS.
Gateway / HTTPRoute Επεκτάσιμο routing με διακριτούς ρόλους. Σύγχρονη εναλλακτική για πιο σύνθετη δρομολόγηση κίνησης. Απουσία Gateway Controller, ασυμφωνία Listener και Route.
ConfigMap Μη ευαίσθητη διαμόρφωση. Feature flags, URLs, αρχεία διαμόρφωσης. Ευαίσθητα δεδομένα σε ConfigMaps, updates που δεν εμφανίζονται στα Pods όπως αναμενόταν.
Secret Μικρές ποσότητες ευαίσθητων δεδομένων. Passwords, tokens, πιστοποιητικά, credentials registry. Σύγχυση Base64 με encryption, υπερβολικά εκτεταμένα δικαιώματα RBAC.
PersistentVolumeClaim Αίτημα για μόνιμο storage. Δεδομένα που πρέπει να επιβιώσουν από restart Pod. PVC σε Pending, λάθος StorageClass, ασύμβατο accessMode.
StorageClass Περιγράφει δυναμική δημιουργία storage. Τυποποίηση απόδοσης, συμπεριφοράς reclaim και ιδιοτήτων provisioner. Λανθασμένη προεπιλογή, μη αναμενόμενη διαγραφή.
ServiceAccount Ταυτότητα των Pods προς το Kubernetes API. Workloads που χρειάζονται πρόσβαση API ή cloud-native δικαιώματα. Υπερβολικά δικαιώματα, ανεξέλεγκτη χρήση του default ServiceAccount.
Role / RoleBinding Δικαιώματα εντός Namespace. Δικαιώματα ειδικά για ομάδες και εφαρμογές. Wildcards, λάθος Namespace, υπερβολικά εκτεταμένα Bindings.
ClusterRole / ClusterRoleBinding Δικαιώματα σε όλο το cluster. Διαχειριστές cluster, Controllers, αναγνώστες σε επίπεδο cluster. Κλιμάκωση προνομίων λόγω υπερβολικά εκτεταμένων δικαιωμάτων.
NetworkPolicy Επιτρέπει ή αποκλείει δικτυακή κίνηση Pods. Τμηματοποίηση μεταξύ εφαρμογών, Namespaces και databases. Το CNI δεν υποστηρίζει πολιτικές, το default allow παραμένει ενεργό.
HorizontalPodAutoscaler Κλιμακώνει replicas βάσει metrics. Κλιμάκωση stateless workloads ανάλογα με το φορτίο. Ελλιπή metrics ή Requests, ταλαντώσεις κλιμάκωσης.
PodDisruptionBudget Περιορίζει ταυτόχρονες προγραμματισμένες διακοπές. Deployments υψηλής διαθεσιμότητας κατά Node drain ή upgrades. Υπερβολικά αυστηρά PDBs εμποδίζουν τη συντήρηση.
06 / 21

7. Από το manifest στο Pod που εκτελείται

Όταν εφαρμόζεις ένα manifest, εκτελούνται πολλά βήματα. Αυτά είναι ουσιαστικά για το troubleshooting.

sequenceDiagram
  participant You
  participant API as kube-apiserver
  participant Etcd as etcd
  participant Ctrl as Controller
  participant Sched as Scheduler
  participant Kubelet as kubelet
  participant Runtime as Container Runtime

  You->>API: kubectl apply -f deployment.yaml
  API->>API: Authentication, authorization, admission, validation
  API->>Etcd: Store object
  Ctrl->>API: Watch Deployment
  Ctrl->>API: Create ReplicaSet and Pods
  Sched->>API: Watch unscheduled Pods
  Sched->>API: Set Node binding
  Kubelet->>API: Fetch PodSpec for its own Node
  Kubelet->>Runtime: Pull images, start containers
  Runtime-->>Kubelet: Status and logs
  Kubelet->>API: Update PodStatus

Σημαντικά σημεία διάγνωσης:

Φάση Τι ελέγχεις Ενδεικτική εντολή
Αποδοχή από API Έγινε δεκτό το object; kubectl apply -f file.yaml --dry-run=server
Admission Απορρίφθηκε ή μεταβλήθηκε το object από πολιτικές; Έλεγξε kubectl describe και Events
Controller Δημιουργήθηκαν τα παράγωγα objects; kubectl get rs,pods -l app=web
Scheduling Επιλέχθηκε Node; kubectl describe pod <pod>
Image pull Μπορεί να γίνει pull το image; kubectl describe pod <pod>
Εκκίνηση container Ξεκινά η διεργασία; kubectl logs <pod>
Readiness Περιλαμβάνεται το Pod στα Services; kubectl get endpointslice
Δίκτυο Είναι προσβάσιμο το Service/DNS; Debug Pod με curl, nslookup, dig
07 / 21

8. Workloads, Deployments και updates

8.1. Pods ως μικρότερη μονάδα

Ένα Pod είναι η μικρότερη μονάδα που μπορεί να εκτελέσει απευθείας το Kubernetes. Περιέχει ένα ή περισσότερα containers που μοιράζονται ένα Network Namespace, μια IP και, προαιρετικά, volumes.

Στην πράξη, ένα Pod περιέχει συνήθως ακριβώς ένα application container. Χρησιμοποίησε περισσότερα containers σε ένα Pod μόνο όταν συνδέονται στενά και πρέπει να εκτελούνται μαζί στο ίδιο Node.

Συνήθη μοτίβα πολλών containers:

Μοτίβο Περιγραφή Παράδειγμα
Sidecar Συμπληρώνει μόνιμα το κύριο container. Log forwarder, Service Mesh proxy
Init Container Εκτελείται πριν ξεκινήσουν τα κύρια containers. Migration, προετοιμασία διαμόρφωσης
Adapter Μετατρέπει formats ή protocols. Μετατροπή ιδιόκτητων metrics σε Prometheus
Ambassador Μεσολαβεί στην πρόσβαση προς εξωτερικές υπηρεσίες. Proxy για εξερχόμενες συνδέσεις

Τα Pods είναι εκ φύσεως βραχύβια. Όταν διαγραφεί ένα Pod, το Pod αντικατάστασης αποκτά νέο UID και συνήθως νέα IP. Γι’ αυτό δεν πρέπει να απευθύνεσαι απευθείας σε Pods· χρησιμοποίησε Services, Labels και Controllers.

8.2. ReplicaSets και Deployments

Ένα ReplicaSet εξασφαλίζει ότι εκτελείται συγκεκριμένος αριθμός πανομοιότυπων Pods. Ένα Deployment διαχειρίζεται ReplicaSets και προσφέρει επιπλέον δυνατότητες, όπως rollouts, rollbacks και ιστορικό rollouts.

Στο εργαστήριο θα χρησιμοποιείς σχεδόν πάντα Deployments για stateless εφαρμογές και όχι ReplicaSets απευθείας.

flowchart TB
  dep[Deployment] --> rs1[ReplicaSet Revision 1]
  dep --> rs2[ReplicaSet Revision 2]
  rs1 --> oldpods[old Pods]
  rs2 --> newpods[new Pods]

Βασικοί κανόνες:

  • Άλλαξε το Pod template ενός Deployment όταν θέλεις να προκαλέσεις νέο rollout.
  • Κλιμάκωσε μέσω spec.replicas ή Autoscaler.
  • Μην επεξεργάζεσαι Pods που δημιουργεί ένα Deployment ως μόνιμη λύση.
  • Επίλεξε συνειδητά Labels και selectors, επειδή καθορίζουν τη σχέση μεταξύ Deployment, ReplicaSet, Pods και Service.

8.3. Rolling updates και rollbacks

Ένα rolling update αντικαθιστά σταδιακά παλιά Pods με νέα. Έτσι η εφαρμογή μπορεί να παραμένει διαθέσιμη κατά τη διάθεση νέας έκδοσης.

Σημαντικές παράμετροι:

Πεδίο Σημασία
maxUnavailable Πόσα από τα επιθυμητά Pods μπορεί να μην είναι διαθέσιμα κατά το rollout.
maxSurge Πόσα επιπλέον Pods μπορεί να δημιουργηθούν προσωρινά πάνω από τον αριθμό στόχο.
minReadySeconds Για πόσο χρόνο πρέπει ένα Pod να είναι Ready πριν μετρηθεί ως διαθέσιμο.
progressDeadlineSeconds Για πόσο χρόνο επιτρέπεται να συνεχίζεται ένα rollout χωρίς πρόοδο.

Χρήσιμες εντολές:

bash
kubectl rollout status deployment/web -n workshop
kubectl rollout history deployment/web -n workshop
kubectl rollout undo deployment/web -n workshop
kubectl describe deployment web -n workshop

Αν ένα rollout κολλήσει, εξέτασε πρώτα τα νέα Pods:

bash
kubectl get pods -n workshop -l app=web
kubectl describe pod <pod-name> -n workshop
kubectl logs <pod-name> -n workshop

8.4. Παράδειγμα: Deployment με πόρους και probes

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: workshop
  labels:
    app.kubernetes.io/name: web
    app.kubernetes.io/component: frontend
spec:
  replicas: 3
  revisionHistoryLimit: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/component: frontend
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
        app.kubernetes.io/component: frontend
    spec:
      containers:
        - name: web
          image: nginx:1.27
          ports:
            - name: http
              containerPort: 80
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 500m
              memory: 256Mi
          startupProbe:
            httpGet:
              path: /
              port: http
            failureThreshold: 30
            periodSeconds: 2
          readinessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 3
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 10
            periodSeconds: 10

Αξιολόγηση του παραδείγματος:

  • Τα requests δίνουν στον Scheduler αξιόπιστη βάση για αποφάσεις τοποθέτησης.
  • Τα limits εμποδίζουν απεριόριστη χρήση πόρων, αλλά τα CPU Limits μπορούν επίσης να προκαλέσουν throttling.
  • Το startupProbe προστατεύει εφαρμογές με αργή εκκίνηση από πρόωρα restarts λόγω liveness.
  • Το readinessProbe ελέγχει αν το Pod πρέπει να λαμβάνει κίνηση.
  • Το livenessProbe πρέπει να εντοπίζει μόνο πραγματικά deadlocks ή καταστάσεις που δεν αυτοδιορθώνονται.
08 / 21

9. Αρχιτεκτονική δικτύου

9.1. Μοντέλο δικτύου Kubernetes

Το Kubernetes θεωρεί ότι το δίκτυο Pods είναι επίπεδο: κάθε Pod μπορεί, κατ’ αρχήν, να προσεγγίζει κάθε άλλο Pod μέσω της Pod IP του χωρίς Network Address Translation σε επίπεδο Pod. Η τεχνική υλοποίηση αυτού του μοντέλου εξαρτάται από το CNI plugin.

Σημαντικά επίπεδα δικτύου:

Επίπεδο Σκοπός Τυπικά components
Δίκτυο Pods Επικοινωνία Pod προς Pod. CNI, routing, overlay ή native cloud routes
Δίκτυο Services Σταθερή εικονική διεύθυνση για δυναμικά Pods. Service, EndpointSlice, kube-proxy/eBPF
DNS Επίλυση ονομάτων Services και, σε ορισμένες περιπτώσεις, Pods. CoreDNS
Ingress/Gateway Εξωτερικά HTTP(S) routes προς το cluster. Ingress Controller, Gateway Controller
NetworkPolicy Τμηματοποίηση και έλεγχος πρόσβασης. CNI με υποστήριξη πολιτικών

9.2. Services και Service Discovery

Τα Pods είναι βραχύβια και λαμβάνουν νέες IP. Τα Services παρέχουν σταθερή αφαίρεση πάνω από μια ομάδα Pods.

Παράδειγμα:

yaml
apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: workshop
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: web
    app.kubernetes.io/component: frontend
  ports:
    - name: http
      port: 80
      targetPort: http

Τύποι Service:

Τύπος Σκοπός Περίπτωση χρήσης
ClusterIP Εσωτερική σταθερή διεύθυνση μέσα στο cluster. Προεπιλογή για εσωτερική επικοινωνία.
NodePort Ανοίγει port σε κάθε Node. Labs, απλή εξωτερική πρόσβαση, βάση ορισμένων υλοποιήσεων LoadBalancer.
LoadBalancer Ζητά εξωτερική υποδομή load balancer. Cloud περιβάλλοντα ή bare metal με κατάλληλη ενσωμάτωση.
ExternalName DNS alias προς εξωτερικό όνομα. Αφαίρεση για εξωτερικές υπηρεσίες.
Headless Service Χωρίς ClusterIP, με άμεσες DNS απαντήσεις για Endpoints. StatefulSets, άμεση πρόσβαση σε Pods, Service Discovery για stateful workloads.

Τα ονόματα DNS ακολουθούν συνήθως το μοτίβο:

text
<service>.<namespace>.svc.cluster.local

Για Service με όνομα web στο Namespace workshop, προκύπτει:

text
web.workshop.svc.cluster.local

Μέσα στο ίδιο Namespace, συχνά αρκεί το web, επειδή η λίστα αναζήτησης DNS του Pod συμπληρώνεται αυτόματα.

9.3. Ingress και Gateway API

Το Ingress περιγράφει HTTP και HTTPS routing από έξω προς Services μέσα στο cluster. Ένα Ingress object έχει αποτέλεσμα μόνο όταν έχει εγκατασταθεί αντίστοιχος Ingress Controller.

Παράδειγμα:

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  namespace: workshop
spec:
  ingressClassName: nginx
  rules:
    - host: web.example.invalid
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

Για νέες αρχιτεκτονικές πλατφόρμας πρέπει επίσης να αξιολογείς το Gateway API. Αυτό το API διαχωρίζει σαφέστερα τους ρόλους και εκφράζει περισσότερες δυνατότητες από το κλασικό Ingress, ιδιαίτερα όταν διαφορετικές ομάδες έχουν την ευθύνη για υποδομή, routing και εφαρμογές.

Εννοιολογική διαφορά:

Θέμα Ingress Gateway API
Εστίαση HTTP(S) routing μέσω ενός μοντέλου object. Μοντέλο ρόλων με GatewayClass, Gateway και Routes.
Επεκτασιμότητα Συχνά μέσω annotations ειδικών για Controller. Σχεδιασμένο για επέκταση στο ίδιο το API model.
Όρια ομάδων Λιγότερο ρητά. Καλύτερος διαχωρισμός platform team και application team.
Κατάσταση Σταθερό, αλλά χωρίς νέες λειτουργίες. Σύγχρονη εξέλιξη μέσω resources του Gateway API.

9.4. NetworkPolicies

Χωρίς NetworkPolicies, πολλά clusters επιτρέπουν από προεπιλογή την επικοινωνία μεταξύ Pods. Μια NetworkPolicy καθορίζει ποια εισερχόμενη ή εξερχόμενη κίνηση επιτρέπεται για τα επιλεγμένα Pods. Η εφαρμογή της εξαρτάται από το CNI plugin.

Παράδειγμα: μόνο Pods με Label app.kubernetes.io/name: web επιτρέπεται να προσεγγίζουν database στο port 5432.

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web-to-db
  namespace: workshop
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/name: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: web
      ports:
        - protocol: TCP
          port: 5432

Λειτουργικοί κανόνες:

  • Έλεγξε αν το CNI σου υποστηρίζει πράγματι NetworkPolicies.
  • Ξεκίνα με σαφείς πολιτικές default deny, αλλά σχεδίασε συνειδητά τις εξαιρέσεις.
  • Συνυπολόγισε το DNS egress όταν εισάγεις πολιτικές Egress.
  • Τεκμηρίωσε τις επιτρεπόμενες διαδρομές επικοινωνίας ως μέρος της αρχιτεκτονικής εφαρμογής.
09 / 21

10. Storage και μόνιμη αποθήκευση

Τα filesystems των containers είναι προσωρινά. Όταν αντικαθίσταται ένα Pod, δεν πρέπει να υποθέτεις ότι διατηρούνται τα τοπικά δεδομένα. Το Kubernetes διαχωρίζει επομένως τα workloads από το storage μέσω Volumes, PersistentVolumes και PersistentVolumeClaims.

Σημαντικοί όροι:

Όρος Σημασία
emptyDir Προσωρινό storage για τη διάρκεια ζωής ενός Pod· διαγράφεται όταν αφαιρεθεί το Pod.
PersistentVolume Αναπαράσταση storage volume σε επίπεδο cluster.
PersistentVolumeClaim Αίτημα storage από εφαρμογή μέσα σε Namespace.
StorageClass Ορίζει dynamic provisioning, provisioner, παραμέτρους και συμπεριφορά reclaim.
CSI Τυποποιημένη διεπαφή μέσω της οποίας οι πάροχοι storage δημιουργούν volumes.

Παράδειγμα PVC:

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
  namespace: workshop
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 10Gi

Τυπικά ερωτήματα αρχιτεκτονικής:

  • Είναι η εφαρμογή stateless ή stateful;
  • Πρέπει το storage να είναι διαθέσιμο μεταξύ ζωνών ή περιοχών;
  • Ποιο accessMode απαιτείται: ReadWriteOnce, ReadOnlyMany, ReadWriteMany ή ReadWriteOncePod;
  • Τι συμβαίνει όταν διαγράφεται ένα PVC;
  • Πώς δοκιμάζονται backups, restores και migrations;
  • Ποια καθυστέρηση και πόσα IOPS χρειάζεται πραγματικά η εφαρμογή;

Η λειτουργία databases μέσα σε Kubernetes cluster απαιτεί πολύ περισσότερο αρχιτεκτονικό σχεδιασμό από τη λειτουργία stateless web υπηρεσιών. Τα StatefulSets λύνουν ζητήματα ταυτότητας και ταξινομημένης εκκίνησης, αλλά δεν αντικαθιστούν σχέδιο backup, στρατηγική replication ή διαδικασία disaster recovery.

10 / 21

11. Διαμόρφωση και Secrets

Η διαμόρφωση δεν πρέπει να ενσωματώνεται στο container image. Το Kubernetes διαχωρίζει τον κώδικα εφαρμογής, τη μη ευαίσθητη διαμόρφωση και τα ευαίσθητα δεδομένα.

Object Κατάλληλο για Ακατάλληλο για
ConfigMap Μη ευαίσθητη διαμόρφωση, URLs, feature flags, αρχεία κειμένου. Passwords, tokens, private keys.
Secret Μικρά ευαίσθητα δεδομένα, όπως passwords, tokens και πιστοποιητικά. Μεγάλα αρχεία ή πλήρη στρατηγική διαχείρισης Secrets χωρίς πρόσθετη προστασία.

Παράδειγμα ConfigMap:

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: web-config
  namespace: workshop
data:
  LOG_LEVEL: "info"
  FEATURE_CHECKOUT: "enabled"

Παράδειγμα Secret:

yaml
apiVersion: v1
kind: Secret
metadata:
  name: database-credentials
  namespace: workshop
type: Opaque
stringData:
  username: app
  password: change-me-in-real-life

Χρήση σε Pod:

yaml
envFrom:
  - configMapRef:
      name: web-config
env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: database-credentials
        key: password

Λειτουργικές οδηγίες:

  • Τα Secrets δεν ισοδυναμούν αυτόματα με ισχυρό encryption. Σχεδίασε encryption at rest, RBAC, audit και, όπου χρειάζεται, εξωτερικά Secret stores.
  • Τα updates ConfigMap και Secret συμπεριφέρονται διαφορετικά ανάλογα με τον τρόπο mounting ή injection. Τα environment variables ανανεώνονται μόνο με restart του Pod· τα mounted files μπορούν να ενημερώνονται, αλλά όχι άμεσα σε κάθε ειδική περίπτωση.
  • Απόφυγε την έκθεση Secrets σε logs, Events, command-line arguments και έξοδο CI.
  • Χρησιμοποίησε ξεχωριστά Secrets ανά εφαρμογή και σκοπό, όχι ένα γενικό Secret για όλα.
11 / 21

12. Διαχείριση πόρων και scheduling

12.1. Requests, Limits και QoS

Το Kubernetes κάνει scheduling Pods βάσει των Requests. Τα Limits περιορίζουν τη μέγιστη χρήση.

Πεδίο Επίδραση
resources.requests.cpu Ποσότητα CPU που συνυπολογίζει ο Scheduler για την τοποθέτηση.
resources.requests.memory Ποσότητα μνήμης που συνυπολογίζει ο Scheduler για την τοποθέτηση.
resources.limits.cpu Μέγιστη χρήση CPU· μπορεί να προκαλέσει CPU throttling.
resources.limits.memory Μέγιστη χρήση μνήμης· η υπέρβασή της συνήθως προκαλεί OOMKill.

Παράδειγμα:

yaml
resources:
  requests:
    cpu: 250m
    memory: 256Mi
  limits:
    cpu: 1000m
    memory: 512Mi

Κλάσεις QoS:

Κλάση QoS Προϋπόθεση Σημασία
Guaranteed Για όλα τα containers, CPU και Memory Requests ισούνται με τα Limits. Μεγαλύτερη σταθερότητα υπό πίεση πόρων.
Burstable Έχει οριστεί τουλάχιστον ένα Request, αλλά δεν πληρούνται όλες οι προϋποθέσεις Guaranteed. Συνήθης προεπιλογή για εφαρμογές.
BestEffort Δεν έχουν οριστεί Requests ή Limits. Μεγαλύτερος κίνδυνος υπό πίεση πόρων.

Κανόνας εργαστηρίου: όριζε πάντα Requests σε παραδείγματα αντίστοιχα της παραγωγής. Χωρίς Requests ο Scheduler δεν μπορεί να λάβει ρεαλιστικές αποφάσεις χωρητικότητας.

12.2. Επιλογή Node, Affinity και Taints

Ο Scheduler επιλέγει Nodes βάσει πολλών κριτηρίων. Μπορείς να επηρεάσεις αυτή την επιλογή.

Μηχανισμός Σκοπός Παράδειγμα
nodeSelector Απλή υποχρεωτική επιλογή Node μέσω Labels. Μόνο Linux Nodes ή μόνο GPU Nodes.
Node Affinity Πιο εκφραστική επιλογή Node με υποχρεωτικούς και προτιμησιακούς κανόνες. Ζώνη, κατηγορία hardware, Label συμμόρφωσης.
Pod Affinity Τοποθετεί Pods κοντά σε άλλα Pods. Cache δίπλα στην εφαρμογή.
Pod Anti-Affinity Διαχωρίζει Pods μεταξύ τους. Κατανομή replicas σε Nodes ή ζώνες.
Taints και Tolerations Τα Nodes απορρίπτουν Pods χωρίς κατάλληλο Toleration. Αποκλειστικά Nodes για databases ή GPU workloads.
Topology Spread Constraints Ομοιόμορφη κατανομή σε τοπολογίες. Κατανομή replicas μεταξύ ζωνών.

Παράδειγμα Toleration:

yaml
tolerations:
  - key: "workload"
    operator: "Equal"
    value: "platform"
    effect: "NoSchedule"

Παράδειγμα Node Affinity:

yaml
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
                - eu-central-1a
                - eu-central-1b

12.3. Quotas και Limits ανά Namespace

Τα ResourceQuotas περιορίζουν τη συνολική κατανάλωση πόρων ενός Namespace. Τα LimitRanges μπορούν να ορίζουν προεπιλογές ή ελάχιστες και μέγιστες τιμές για Pods και containers.

Παράδειγμα ResourceQuota:

yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: workshop-quota
  namespace: workshop
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "20"

Αρχιτεκτονική σημείωση: τα quotas δεν προστατεύουν από κάθε μορφή υπερφόρτωσης, αλλά αποτρέπουν ένα Namespace από απεριόριστη κατανάλωση πόρων ή δημιουργία objects.

12.4. Autoscaling και Disruption Budgets

Το Horizontal Pod Autoscaler κλιμακώνει replicas βάσει παρατηρούμενων metrics. Για αυτό χρειάζονται κατάλληλες πηγές metrics και ουσιαστικά Requests.

Παράδειγμα HPA:

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web
  namespace: workshop
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

Ένα PodDisruptionBudget περιορίζει προγραμματισμένες διακοπές, για παράδειγμα κατά τη συντήρηση Node:

yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web
  namespace: workshop
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: web
      app.kubernetes.io/component: frontend

Σημαντικό: ένα PDB δεν προστατεύει από όλες τις αστοχίες. Εφαρμόζεται κυρίως σε προγραμματισμένες διακοπές όπως kubectl drain, όχι σε απρόβλεπτη αστοχία Node.

12 / 21

13. Health checks και κύκλος ζωής

Το Kubernetes παρέχει διαφορετικούς τύπους probes. Δεν πρέπει να τους θεωρείς εναλλάξιμους.

Probe Σκοπός Αστοχία σε λανθασμένη χρήση
startupProbe Ελέγχει αν ολοκληρώθηκε η αρχική εκκίνηση εφαρμογής που ξεκινά αργά. Χωρίς αυτό, το livenessProbe μπορεί να κάνει restart πολύ νωρίς.
readinessProbe Ελέγχει αν ένα Pod πρέπει να λαμβάνει κίνηση. Λανθασμένο readiness αφαιρεί υγιή Pods από το Service.
livenessProbe Ελέγχει αν πρέπει να γίνει restart ενός container. Υπερβολικά επιθετικό liveness δημιουργεί crash loops.

Απλοποιημένος κύκλος ζωής Pod:

stateDiagram-v2
  [*] --> Pending
  Pending --> Running
  Running --> Succeeded
  Running --> Failed
  Running --> Terminating
  Terminating --> [*]

Λειτουργικοί κανόνες:

  • Το readiness πρέπει να ελέγχει εξαρτήσεις σημαντικές για την αποδοχή κίνησης.
  • Το liveness πρέπει να ελέγχει μόνο καταστάσεις που πιθανότατα διορθώνονται με restart.
  • Τα startup probes είναι χρήσιμα για αργές εφαρμογές, JVMs, migrations ή μεγάλη αρχική φόρτωση cache.
  • Τα ίδια τα probes δεν πρέπει να υπερφορτώνουν την εφαρμογή.
  • Τα probe endpoints πρέπει να απαντούν γρήγορα και προβλέψιμα και, ιδανικά, να αποφεύγουν ακριβές queries.
13 / 21

14. Ασφάλεια

14.1. Πρόσβαση στο Kubernetes API

Ο API Server είναι το κεντρικό σημείο ελέγχου. Κάθε request περνά από διάφορες φάσεις:

  1. Authentication: ποιος υποβάλλει το request;
  2. Authorization: επιτρέπεται σε αυτή την identity να εκτελέσει την ενέργεια;
  3. Admission Control: γίνεται δεκτό, απορρίπτεται ή μεταβάλλεται το object;
  4. Persistence: αποθηκεύεται η νέα κατάσταση στο etcd;
flowchart LR
  req[API request] --> authn[Authentication]
  authn --> authz[Authorization]
  authz --> adm[Admission Control]
  adm --> val[Validation]
  val --> etcd[(etcd)]

Για τοπική πρόσβαση το kubectl χρησιμοποιεί kubeconfig. Ένα kubeconfig περιέχει πληροφορίες cluster, user και context. Αντιμετώπισε τα αρχεία kubeconfig ως ευαίσθητα credentials.

14.2. RBAC και ServiceAccounts

Το RBAC ορίζει ποια subjects επιτρέπεται να εκτελούν ποια verbs σε ποια resources.

Όρος Σημασία
Subject User, Group ή ServiceAccount.
Verb Ενέργεια όπως get, list, watch, create, update, patch, delete.
Resource API resource όπως pods, deployments, secrets.
Role Δικαιώματα μέσα σε Namespace.
ClusterRole Δικαιώματα σε όλο το cluster ή επαναχρησιμοποιήσιμα δικαιώματα.
RoleBinding Συνδέει Role ή ClusterRole με subjects σε Namespace.
ClusterRoleBinding Συνδέει ClusterRole σε όλο το cluster.

Παράδειγμα: ένα ServiceAccount μπορεί να διαβάζει Pods στο Namespace.

yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-reader
  namespace: workshop
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: workshop
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader
  namespace: workshop
subjects:
  - kind: ServiceAccount
    name: pod-reader
    namespace: workshop
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pod-reader

Λειτουργικοί κανόνες:

  • Παραχώρησε τα ελάχιστα απαιτούμενα δικαιώματα.
  • Απόφυγε wildcards όπως *, εκτός αν είναι απολύτως απαραίτητα.
  • Έλεγξε δικαιώματα με kubectl auth can-i.
  • Δώσε σε workloads δικά τους ServiceAccounts αντί να χρησιμοποιούν ανεξέλεγκτα το default ServiceAccount.
  • Πρόσεξε ιδιαίτερα δικαιώματα σε secrets, nodes, pods/exec, pods/attach, roles, rolebindings, clusterroles και clusterrolebindings.

14.3. Admission Control και Pod Security

Οι Admission Controllers ελέγχουν API requests μετά το authentication και authorization, αλλά πριν από την αποθήκευση. Μπορούν να επικυρώνουν ή να μεταβάλλουν objects.

Τυπικές χρήσεις:

  • Επιβολή Labels και metadata υπευθυνότητας.
  • Αποκλεισμός Privileged containers.
  • Επιβολή Resource Requests.
  • Αποκλεισμός images από μη εγκεκριμένα registries.
  • Ορισμός προεπιλεγμένων τιμών.
  • Έλεγχος Pod Security Standards.

Το Pod Security Admission μπορεί να ορίζει επίπεδα ασφάλειας σε Namespaces μέσω Labels:

Επίπεδο Σκοπός
privileged Λίγοι περιορισμοί, για ιδιαίτερα προνομιούχα workloads συστήματος.
baseline Αποκλείει γνωστές επικίνδυνες ρυθμίσεις παραμένοντας σχετικά συμβατό.
restricted Ισχυρότερη θωράκιση, προτεινόμενη για workloads με υψηλές απαιτήσεις ασφάλειας.

Παράδειγμα Namespace Labels:

yaml
metadata:
  labels:
    pod-security.kubernetes.io/enforce: baseline
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

14.4. Προστασία Secrets

Τα Secrets απαιτούν τεχνικά και οργανωτικά μέτρα προστασίας.

Λίστα ελέγχου:

  • Ενεργοποίησε encryption at rest για Secrets στο cluster.
  • Περιόρισε αυστηρά δικαιώματα get, list και watch σε Secrets.
  • Απόφυγε τιμές Secrets σε environment variables όταν process lists, dumps ή debugging μπορούν να τις εκθέσουν.
  • Προτίμησε εξωτερικά Secret stores όταν το απαιτούν η διακυβέρνηση, το rotation και το audit.
  • Επαλήθευσε ότι τα συστήματα backup αποθηκεύουν Secrets κρυπτογραφημένα.
  • Κάνε rotation των Secrets και τεκμηρίωσέ το ως λειτουργική διαδικασία.

14.5. Ασφάλεια images και supply chain

Το Kubernetes εκτελεί τα images στα οποία παραπέμπεις. Η πλατφόρμα δεν εξαλείφει αυτόματα όλους τους κινδύνους σχετικά με την προέλευση και το περιεχόμενό τους.

Συστάσεις:

  • Χρησιμοποίησε αξιόπιστα registries.
  • Προτίμησε αμετάβλητες αναφορές images μέσω digests αντί μόνο για tags.
  • Έλεγξε images για γνωστές ευπάθειες.
  • Υπόγραψε images ή επαλήθευσε υπογραφές όπου το υποστηρίζει η πλατφόρμα σου.
  • Απόφυγε το latest σε manifests παραγωγής.
  • Όρισε συνειδητά το imagePullPolicy.
  • Χρησιμοποίησε μικρά base images και αφαίρεσε περιττά εργαλεία.
14 / 21

15. Observability

Το Kubernetes προσφέρει πολλά επίπεδα observability. Κανένα επίπεδο δεν αρκεί από μόνο του.

Επίπεδο Σκοπός Παραδείγματα
Status objects Τρέχουσα κατάσταση Kubernetes objects. kubectl get, kubectl describe
Events Χρονικά ταξινομημένες ενδείξεις για scheduling, pulls, mounts και αστοχίες probes. kubectl get events
Logs Έξοδος containers. kubectl logs
Metrics Πόροι, καθυστέρηση, ποσοστά σφαλμάτων, κορεσμός. Prometheus, metrics-server
Traces Διαδρομές requests μεταξύ Services. OpenTelemetry, Jaeger, Tempo
Audit logs Πρόσβαση API και διαχειριστικές ενέργειες. API Server audit logging

Ελάχιστη προσέγγιση observability στο εργαστήριο:

bash
kubectl get all -n workshop
kubectl get events -n workshop --sort-by=.lastTimestamp
kubectl describe deployment web -n workshop
kubectl describe pod <pod-name> -n workshop
kubectl logs <pod-name> -n workshop
kubectl top pods -n workshop

Για παραγωγή χρειάζεσαι επιπλέον:

  • κεντρική αποθήκευση logs,
  • metrics με alerts,
  • dashboards βασισμένα σε Service Level Indicators,
  • audit logs,
  • runbooks,
  • σαφή υπεύθυνο για κάθε Namespace και εφαρμογή.
15 / 21

16. Αντιμετώπιση προβλημάτων

16.1. Συστηματική προσέγγιση

Χρησιμοποίησε σταθερή σειρά βημάτων ώστε να μη διερευνάς τυχαία.

  1. Έλεγξε το context.

    bash
    kubectl config current-context
    kubectl config view --minify
    kubectl get ns
    
  2. Έλεγξε τα objects στο Namespace.

    bash
    kubectl get all -n workshop
    kubectl get deploy,rs,pods,svc,endpointslice -n workshop
    
  3. Διάβασε τα Events.

    bash
    kubectl get events -n workshop --sort-by=.lastTimestamp
    
  4. Εξέτασε λεπτομερώς το επηρεαζόμενο object.

    bash
    kubectl describe pod <pod-name> -n workshop
    
  5. Έλεγξε τα logs.

    bash
    kubectl logs <pod-name> -n workshop
    kubectl logs <pod-name> -n workshop --previous
    
  6. Κατανόησε την αλυσίδα Owners.

    bash
    kubectl get pod <pod-name> -n workshop -o yaml | grep -A 10 ownerReferences
    
  7. Δοκίμασε το δίκτυο μεμονωμένα.

    bash
    kubectl run debug -n workshop --rm -it --image=curlimages/curl -- sh
    

16.2. Συνήθεις αστοχίες

Σύμπτωμα Πιθανή αιτία Διάγνωση Διόρθωση
Pod σε Pending Δεν υπάρχουν κατάλληλα Nodes, υπερβολικά Requests, PVCs που λείπουν ή Taints χωρίς Toleration. Διάβασε τα Events από kubectl describe pod. Προσάρμοσε Requests, πρόσθεσε Nodes, διόρθωσε Tolerations/Affinity, έλεγξε PVC.
ImagePullBackOff Ανύπαρκτο image, μη προσβάσιμο registry ή απουσία ImagePullSecret. Pod Events και όνομα image. Διόρθωσε αναφορά image, όρισε Secret, επαλήθευσε πρόσβαση registry.
CrashLoopBackOff Επαναλαμβανόμενος τερματισμός διεργασίας, ελλιπής διαμόρφωση, λάθος Secret ή εντολή εκκίνησης. kubectl logs --previous και exit code. Διόρθωσε τη διαμόρφωση εφαρμογής, έλεγξε εντολή εκκίνησης και πόρους.
CreateContainerConfigError Λείπει αναφερόμενο ConfigMap ή Secret. kubectl describe pod. Δημιούργησε το object ή διόρθωσε την αναφορά.
ContainerCreating που έχει κολλήσει Κόλλησε το CNI, το volume mount ή το image download. Pod Events, κατάσταση Node, kubelet logs. Έλεγξε CNI/CSI/registry.
Αποτυχία Readiness Λάθος endpoint, εφαρμογή που δεν είναι ακόμη έτοιμη ή υπερβολικά αυστηρό probe. Pod Events, logs εφαρμογής, δοκιμή probe endpoint. Διόρθωσε ορισμό Readiness και σήμα ετοιμότητας εφαρμογής.
Το Liveness επανεκκινεί συνεχώς Pod Υπερβολικά επιθετικό probe ή έλεγχος λανθασμένης εξάρτησης. Αριθμός restarts, Events, logs. Πρόσθεσε Startup Probe και χαλάρωσε το Liveness.
Service χωρίς Endpoints Ο Selector του Service δεν ταιριάζει με τα Pod Labels ή τα Pods δεν είναι Ready. kubectl get endpointslice, σύγκριση Labels. Διόρθωσε Selector ή Labels και έλεγξε Readiness.
DNS που δεν λειτουργεί Βλάβη CoreDNS, λάθος Namespace ή NetworkPolicy που εμποδίζει το DNS. nslookup, CoreDNS logs, Egress Policy. Έλεγξε DNS Service, χρησιμοποίησε FQDN και προσάρμοσε την πολιτική.
Ingress επιστρέφει 404 Λάθος κανόνας Host/Path, λάθος IngressClass ή κενό Backend Service. Περιγραφή Ingress και Controller logs. Έλεγξε κανόνες, Class και Service.
PVC σε Pending Δεν υπάρχει κατάλληλη StorageClass, λείπει Provisioner ή δεν ταιριάζει η ζώνη. PVC Events, StorageClass, CSI Controller. Διόρθωσε StorageClass, έλεγξε CSI και παρείχε χωρητικότητα.
Άρνηση πρόσβασης Απουσία RBAC ή λάθος ServiceAccount. kubectl auth can-i, έλεγχος PodSpec. Διόρθωσε Role/Binding και όρισε ServiceAccount.

16.3. Χρήσιμες εντολές kubectl

bash
# Επισκόπηση
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get all -n workshop

# Κατάσταση και Events
kubectl describe pod <pod-name> -n workshop
kubectl get events -n workshop --sort-by=.lastTimestamp

# Logs
kubectl logs <pod-name> -n workshop
kubectl logs <pod-name> -n workshop --previous
kubectl logs deployment/web -n workshop

# Rollouts
kubectl rollout status deployment/web -n workshop
kubectl rollout history deployment/web -n workshop
kubectl rollout undo deployment/web -n workshop

# Labels και selectors
kubectl get pods -n workshop --show-labels
kubectl get pods -n workshop -l app.kubernetes.io/name=web

# Services και Endpoints
kubectl get svc,endpointslice -n workshop
kubectl describe svc web -n workshop

# Εμφάνιση YAML
kubectl get deployment web -n workshop -o yaml
kubectl explain deployment.spec.template.spec.containers.resources

# Έλεγχος δικαιωμάτων
kubectl auth can-i get pods -n workshop
kubectl auth can-i list secrets -n workshop --as=system:serviceaccount:workshop:pod-reader

# Εκκίνηση debug Pod
kubectl run debug -n workshop --rm -it --image=busybox:1.36 -- sh
16 / 21

17. Αρχιτεκτονικές αποφάσεις

Τεκμηρίωσε τις αρχιτεκτονικές αποφάσεις ρητά. Τα Kubernetes manifests δείχνουν τι έχει διαμορφωθεί, αλλά όχι πάντα γιατί έγινε αυτή η επιλογή.

Καθοδηγητικές ερωτήσεις:

Desired State και ευθύνη

  • Πού βρίσκεται το έγκυρο Desired State: στο Git, σε σύστημα CI/CD, σε Helm repository, σε GitOps Controller ή σε χειροκίνητες αλλαγές API;
  • Ποιος επιτρέπεται να αλλάζει manifests παραγωγής;
  • Πώς γίνονται review, δοκιμή και rollout των αλλαγών;
  • Πώς εκτελούνται rollbacks;

Μοντέλο Namespaces και tenants

  • Ποια Namespaces υπάρχουν και ποιος έχει την ευθύνη τους;
  • Χωρίζονται ανά ομάδα, εφαρμογή, περιβάλλον ή tenant;
  • Ποια Quotas και LimitRanges ισχύουν;
  • Ποια NetworkPolicies ισχύουν από προεπιλογή;

Μοντέλο workloads

  • Είναι η εφαρμογή stateless ή stateful;
  • Αρκεί Deployment ή χρειάζεσαι StatefulSet, DaemonSet, Job ή CronJob;
  • Ποιος είναι ο ελάχιστος απαιτούμενος αριθμός replicas;
  • Ποια στρατηγική update είναι αποδεκτή;
  • Πώς διατηρείται η διαθεσιμότητα κατά τη συντήρηση;

Πόροι

  • Ποια Requests και Limits είναι ρεαλιστικά;
  • Πώς δοκιμάζεται το φορτίο;
  • Υπάρχει HPA, VPA ή Cluster Autoscaler;
  • Πώς εντοπίζεις CPU throttling, OOMKills και πίεση πόρων σε Node;

Δίκτυο

  • Ποια Services πρέπει να είναι προσβάσιμα εσωτερικά;
  • Ποια εξωτερικά endpoints υπάρχουν;
  • Χρησιμοποιείται Ingress ή Gateway API;
  • Ποια στρατηγική TLS ισχύει;
  • Ποιες διαδρομές επικοινωνίας επιτρέπονται μέσω NetworkPolicies;

Storage

  • Ποια δεδομένα πρέπει να διατηρούνται μόνιμα;
  • Ποια StorageClass χρησιμοποιείται;
  • Ποιες διαδικασίες backup και restore έχουν δοκιμαστεί;
  • Τι συμβαίνει σε αστοχία ζώνης ή Node;
  • Ποια δεδομένα μπορούν να διαγραφούν και ποια όχι;

Ασφάλεια

  • Ποια ServiceAccounts χρησιμοποιεί η εφαρμογή;
  • Ποια δικαιώματα RBAC απαιτούνται πραγματικά;
  • Ποιες Admission Policies ισχύουν;
  • Πώς δημιουργούνται, αποθηκεύονται, ανανεώνονται και ελέγχονται τα Secrets;
  • Ποια images επιτρέπεται να χρησιμοποιούνται;

Observability και λειτουργία

  • Ποια logs, metrics και traces είναι υποχρεωτικά;
  • Ποια alerts δείχνουν πραγματική επίδραση στους χρήστες και όχι μόνο τεχνικά συμπτώματα;
  • Υπάρχουν runbooks;
  • Ποιος ανταποκρίνεται σε incidents;
  • Πώς μαθαίνει η ομάδα από incidents;
17 / 21

18. Ασκήσεις εργαστηρίου

Οι ακόλουθες ασκήσεις αντιστοιχούν σε αυτό το υλικό. Μπορείς να τις εκτελέσεις με τη σειρά ή να επιλέξεις μεμονωμένες ενότητες.

Άσκηση 1: Δημιουργία Namespace και βασικού επιπέδου

Στόχος: δημιούργησε ξεχωριστό Namespace και επαλήθευσε το context σου.

bash
kubectl create namespace workshop
kubectl config set-context --current --namespace=workshop
kubectl get ns

Συζήτηση:

  • Γιατί ένα ξεχωριστό Namespace είναι προτιμότερο από το default;
  • Ποια Labels θα όριζες για υπευθυνότητα και Pod Security;

Άσκηση 2: Rollout ενός Deployment

Στόχος: δημιούργησε Deployment με τρία replicas και παρατήρησε την αλυσίδα Controllers.

bash
kubectl apply -f deployment.yaml
kubectl get deploy,rs,pods -n workshop
kubectl rollout status deployment/web -n workshop

Συζήτηση:

  • Ποια objects δημιούργησες απευθείας;
  • Ποια objects προέκυψαν από το Kubernetes;
  • Τι συμβαίνει αν διαγράψεις χειροκίνητα ένα Pod;

Άσκηση 3: Δοκιμή Service Discovery

Στόχος: δημιούργησε Service και δοκίμασε το DNS από debug Pod.

bash
kubectl apply -f service.yaml
kubectl run debug --rm -it --image=curlimages/curl -- sh
curl http://web.workshop.svc.cluster.local

Συζήτηση:

  • Γιατί απευθύνεσαι στο Service αντί στις IP των Pods;
  • Πώς γνωρίζεις αν ένα Service έχει Endpoints;

Άσκηση 4: Σκόπιμη δημιουργία αστοχίας

Στόχος: άλλαξε το image σε ανύπαρκτο tag και ανάλυσε το σφάλμα.

bash
kubectl set image deployment/web web=nginx:does-not-exist -n workshop
kubectl rollout status deployment/web -n workshop
kubectl get pods -n workshop
kubectl describe pod <pod-name> -n workshop

Συζήτηση:

  • Πού εμφανίζεται το πραγματικό μήνυμα σφάλματος;
  • Γιατί μπορεί το Deployment να παραμένει εν μέρει διαθέσιμο;
  • Πώς εκτελείς rollback;

Άσκηση 5: Κατανόηση Readiness και Liveness

Στόχος: όρισε σκόπιμα λανθασμένο readiness probe και παρατήρησε τα Endpoints του Service.

bash
kubectl get endpointslice -n workshop
kubectl describe pod <pod-name> -n workshop

Συζήτηση:

  • Γιατί εκτελείται το container αλλά δεν λαμβάνει κίνηση;
  • Ποια είναι η διαφορά Readiness και Liveness;

Άσκηση 6: Έλεγχος RBAC

Στόχος: δημιούργησε ServiceAccount με ελάχιστα δικαιώματα και επαλήθευσε την πρόσβαση.

bash
kubectl auth can-i list pods -n workshop --as=system:serviceaccount:workshop:pod-reader
kubectl auth can-i list secrets -n workshop --as=system:serviceaccount:workshop:pod-reader

Συζήτηση:

  • Γιατί το list secrets είναι ιδιαίτερα ευαίσθητο;
  • Πότε χρειάζεσαι Role και πότε ClusterRole;

Άσκηση 7: Εισαγωγή NetworkPolicy

Στόχος: περιόρισε την επικοινωνία και επαλήθευσε αν το CNI σου εφαρμόζει τις πολιτικές.

bash
kubectl apply -f networkpolicy.yaml
kubectl get networkpolicy -n workshop

Συζήτηση:

  • Τι συμβαίνει σε CNI χωρίς υποστήριξη NetworkPolicy;
  • Ποιες εξαιρέσεις Egress χρειάζεσαι για DNS;
18 / 21

19. Πεδίο εφαρμογής και όρια

Το Kubernetes δεν ταυτίζεται με τα εργαλεία και τις πλατφόρμες γύρω του. Μια καθαρή αρχιτεκτονική διαχωρίζει τις ευθύνες.

Εργαλείο ή έννοια Σχέση με το Kubernetes
Docker Image Μορφή πακεταρίσματος και αποτέλεσμα build για containers. Το Kubernetes εκτελεί images αλλά δεν τα δημιουργεί.
containerd / CRI-O Container Runtime στο Node. Το Kubernetes επικοινωνεί μαζί του μέσω CRI.
Helm Εργαλείο packaging και templating για Kubernetes manifests. Δεν αντικαθιστά το μοντέλο αρχιτεκτονικής.
Kustomize Μηχανισμός overlays για YAML manifests, χρήσιμος για παραλλαγές περιβαλλόντων.
GitOps Μοντέλο λειτουργίας στο οποίο το Git περιγράφει το Desired State. Το Kubernetes παραμένει η πλατφόρμα εκτέλεσης.
Prometheus Σύστημα monitoring. Το Kubernetes παρέχει στόχους και metadata· το Prometheus συλλέγει metrics.
Ingress Controller Υλοποίηση των Ingress resources. Χωρίς Controller, ένα Ingress object δεν έχει αποτέλεσμα.
Gateway Controller Υλοποίηση των Gateway API resources.
CSI Driver Ενσωμάτωση storage. Το Kubernetes ορίζει το μοντέλο· ο Driver συνδέει συγκεκριμένο storage.
CNI Plugin Ενσωμάτωση δικτύου. Το Kubernetes ορίζει τις απαιτήσεις· το Plugin υλοποιεί δίκτυο και πολιτικές.
Cloud Provider Παρέχει υποδομή όπως Nodes, load balancers, volumes και identities.
Service Mesh Πρόσθετο επίπεδο για διαχείριση κίνησης, mTLS, telemetry και πολιτικές. Δεν αποτελεί προϋπόθεση για Kubernetes.
19 / 21

20. Γλωσσάρι

Όρος Εξήγηση
API Server Κεντρικό Kubernetes API. Όλα τα εργαλεία ελέγχου επικοινωνούν μαζί του.
Controller Διεργασία που εναρμονίζει Desired State και Actual State.
Desired State Επιθυμητή κατάσταση resource στο API.
Actual State Πραγματικά παρατηρούμενη κατάσταση στο cluster.
etcd Μόνιμη αποθήκη της κατάστασης Kubernetes.
Kubelet Agent σε κάθε Node που ξεκινά και παρακολουθεί Pods.
Node Μηχανή του cluster στην οποία εκτελούνται Pods.
Pod Μικρότερη εκτελέσιμη μονάδα Kubernetes.
ReplicaSet Controller για τον επιθυμητό αριθμό πανομοιότυπων Pods.
Deployment Controller για stateless workloads με δυνατότητα rollout και rollback.
Service Σταθερή δικτυακή αφαίρεση πάνω από μεταβαλλόμενα Pods.
EndpointSlice API object που περιγράφει Endpoints ενός Service με καλύτερη κλιμάκωση από τα κλασικά Endpoints.
Ingress API object για HTTP(S) routing προς το cluster.
Gateway API Επεκτάσιμο API model για Service networking και routing κίνησης.
ConfigMap Μη ευαίσθητη διαμόρφωση.
Secret Μικρή ποσότητα ευαίσθητων δεδομένων.
PVC Αίτημα μόνιμου storage από εφαρμογή.
StorageClass Ορισμός δυναμικής δημιουργίας storage.
CNI Διεπαφή για Container Network Plugins.
CSI Διεπαφή για Container Storage Plugins.
RBAC Έλεγχος πρόσβασης βάσει ρόλων.
Admission Control Επικύρωση ή μεταβολή API requests πριν αποθηκευτούν.
Probe Μηχανισμός health check για containers.
HPA Horizontal Pod Autoscaler, κλιμακώνει replicas βάσει metrics.
PDB PodDisruptionBudget, περιορίζει ταυτόχρονες προγραμματισμένες διακοπές.
20 / 21

21. Επίσημες πηγές

Αυτό το υλικό βασίζεται στην επίσημη τεκμηρίωση Kubernetes. Για λεπτομέρειες και διαφορές ανά έκδοση, συμβουλεύσου την τεκμηρίωση της έκδοσης Kubernetes που χρησιμοποιείς.

21 / 21

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.