Wiki workshop · Ελληνικά

Αναφορά εντολών: Kubernetes

Αναλυτική αναφορά εντολών Kubernetes για kubectl, kubeadm, Components του Control Plane, Container Runtimes, Helm, Kustomize, etcd και Troubleshooting.

Παραδείγματα workshop σε ZIP
Πρόοδος μάθησης στη web app

Σημειώστε κεφάλαια ως αναγνωσμένα, δείτε την πρόοδο ανάγνωσης και ολοκληρώστε πρακτικές ενότητες αφού ενεργοποιήσετε την προαιρετική web app. Η πρόοδος του workshop υπολογίζεται από τα κεφάλαια όλων των σελίδων τεκμηρίωσης. Οι επιλογές μένουν σε αυτή τη συσκευή· δεν υπάρχει λογαριασμός ή συγχρονισμός με server. Δεν απαιτείται εγκατάσταση. Η ανάκληση στις Ρυθμίσεις απορρήτου διαγράφει την πρόοδο.

Πρόοδος ανάγνωσης0%
0%
0 / 50 κεφάλαια που διαβάστηκαν
Άλλη γλωσσική έκδοσηΓερμανικά ↗Αγγλικά ↗

Αναφορά εντολών: Kubernetes

Τελευταία ενημέρωση: 13 Ιουνίου 2026

Απευθύνεται σε: συμμετέχοντες σε Kubernetes workshops, ομάδες Operations, Troubleshooting, Reviews και τελικά Projects

Αυτή η αναφορά συγκεντρώνει τις σημαντικότερες εντολές του Kubernetes. Εξηγεί πότε τις χρησιμοποιείς, ποια έξοδο να περιμένεις και τι χρειάζεται προσοχή. Εστιάζει στα kubectl και kubeadm, καθώς και στα εργαλεία που χρειάζονται συχνά στην πράξη: kubelet, εκτελέσιμα του Control Plane, crictl, ctr, nerdctl, etcdctl, etcdutl, Helm, Kustomize, εργαλεία CNI και Cluster, καθώς και βοηθητικές εντολές Linux.

Σημαντικό: Οι εντολές του Kubernetes εξαρτώνται από την έκδοση, τη διανομή, τον Cloud Provider και τα εγκατεστημένα Add-ons. Το έγγραφο λειτουργεί ως εκτεταμένη αναφορά για το workshop και τις Operations. Για την πλήρη λίστα Flags της εγκατάστασής σου έλεγχε επίσης τα <command> --help, <command> <subcommand> --help και την τεκμηρίωση της έκδοσης Kubernetes που χρησιμοποιείς.


1. Βασικοί κανόνες για ασφαλή εργασία

Οι εντολές Kubernetes επηρεάζουν συχνά απευθείας Production Workloads. Ακολούθησε μια σαφή σειρά ενεργειών:

  1. Έλεγξε το Context: Επιβεβαίωσε πρώτα το Cluster, το Namespace και την ταυτότητά σου.
  2. Διάβασε πριν αλλάξεις: Ξεκίνα με get, describe, diff, dry-run και auth can-i.
  3. Περιόρισε την αλλαγή: Στόχευσε ένα Namespace, έναν Label Selector ή συγκεκριμένο Object αντί για -A ή --all.
  4. Κατανόησε τον αντίκτυπο: Έλεγξε αν η εντολή επανεκκινεί Pods, αναδρομολογεί την κίνηση, διαγράφει δεδομένα ή εκτελεί Drain σε Nodes.
  5. Προετοίμασε το Rollback: Φύλαξε εκ των προτέρων το Manifest, τα Values, το Revision, το Backup ή το Snapshot.
  6. Επαλήθευσε το αποτέλεσμα: Έλεγξε Status, Events, Logs, Endpoints και Metrics.

Κατηγορίες εντολών που απαιτούν προσοχή

Κατηγορία εντολής Κίνδυνος Ασφαλέστερος χειρισμός
kubectl delete Αφαιρεί Resources ή ενεργοποιεί την εκ νέου δημιουργία τους. Εκτέλεσε πρώτα kubectl get και διέγραψε μόνο τα συγκεκριμένα Resources. Απόφυγε ανεξέλεγκτα Wildcards.
kubectl replace --force Διαγράφει και δημιουργεί ξανά το Object· μπορεί να προκαλέσει διακοπή λειτουργίας. Χρησιμοποίησέ το μόνο όταν επιδιώκεις συνειδητά την εκ νέου δημιουργία.
kubectl drain Εκτελεί Eviction των Pods από ένα Node. Έλεγξε πρώτα PDBs, DaemonSets, τοπικά δεδομένα και διαθέσιμη χωρητικότητα.
kubeadm reset Αφαιρεί τοπικά στοιχεία του Cluster από ένα Node. Εκτέλεσέ το μόνο στον σωστό Host. Έλεγξε έπειτα τα υπολείμματα του CNI, των iptables και των δεδομένων.
etcdctl snapshot restore / etcdutl snapshot restore Δημιουργεί νέα λογική κατάσταση για το etcd Cluster. Χρησιμοποίησέ το μόνο με τεκμηριωμένο σχέδιο Restore και Backup.
kubectl patch Μπορεί να αντικαταστήσει Fields χωρίς να το αντιληφθείς. Κράτησε τα Patches μικρά και έλεγξε το αποτέλεσμα με get -o yaml.
kubectl apply --prune Μπορεί να αφαιρέσει Resources που δεν δηλώνονται πλέον. Χρησιμοποίησέ το μόνο με περιορισμένο Selector και αφού το δοκιμάσεις σε Test Environment.

01 / 50

2. Συμβολισμοί και Placeholders

Το έγγραφο χρησιμοποιεί σταθερά τους παρακάτω Placeholders:

Placeholder Σημασία Παράδειγμα
<namespace> Namespace demo
<pod> Όνομα Pod web-785d9c9d8f-abc12
<deployment> Όνομα Deployment web
<service> Όνομα Service web
<node> Όνομα Node worker-01
<container> Όνομα Container μέσα σε Pod app
<context> Context του kubeconfig dev-cluster
<image> Container Image ghcr.io/example/app:1.2.3
<file> Manifest, αρχείο Values ή Snapshot deployment.yaml

Συμβάσεις:

bash
# Όρισε ρητά το Namespace
kubectl get pods -n <namespace>

# Εμφάνισε όλα τα Namespaces
kubectl get pods -A
kubectl get pods --all-namespaces

# Σύντομα ονόματα Resources
kubectl get po,svc,deploy -n <namespace>

# Τα πλήρη ονόματα Resources είναι συχνά σαφέστερα στην τεκμηρίωση και στα workshops
kubectl get pods,services,deployments -n <namespace>

02 / 50

3. Shell, Autocomplete και Aliases

Έλεγχος εκδόσεων

bash
kubectl version --client
kubectl version
kubectl version -o yaml
kubeadm version
helm version
crictl --version
ctr version
etcdctl version

Το kubectl version --client ελέγχει μόνο το τοπικό CLI. Το kubectl version επικοινωνεί και με το API Server. Αν δεν έχεις πρόσβαση, μπορεί να εμφανιστούν σφάλματα Authentication, δικτύου ή Certificates.

Autocomplete για Bash

bash
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc

alias k=kubectl
complete -o default -F __start_kubectl k

Autocomplete για Zsh

bash
source <(kubectl completion zsh)
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc

Autocomplete για Fish

bash
mkdir -p ~/.config/fish/completions
kubectl completion fish > ~/.config/fish/completions/kubectl.fish

Χρήσιμα Aliases

bash
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgn='kubectl get nodes -o wide'
alias kga='kubectl get all'
alias kaf='kubectl apply -f'
alias kdf='kubectl diff -f'
alias kdel='kubectl delete'
alias kctx='kubectl config current-context'
alias kns='kubectl config set-context --current --namespace'

Χρησιμοποίησε Aliases μόνο σε διαδραστικό Shell. Στην τεκμηρίωση, στα Runbooks και στα CI Pipelines, οι πλήρως γραμμένες εντολές είναι πιο αξιόπιστες.


03 / 50

4. kubectl: σύνταξη και γενικά Options

Το kubectl είναι το βασικό CLI για επικοινωνία με το Kubernetes Control Plane. Η γενική σύνταξη είναι:

bash
kubectl [global options] <verb> <resource> [name] [flags]

Παραδείγματα:

bash
kubectl get pods -n demo
kubectl describe deployment web -n demo
kubectl apply -f deployment.yaml
kubectl delete service web -n demo

Γενικά Options

Option Σκοπός Παράδειγμα
--kubeconfig <file> Χρησιμοποιεί συγκεκριμένο αρχείο kubeconfig. kubectl --kubeconfig ./kubeconfig get nodes
--context <context> Χρησιμοποιεί συγκεκριμένο Context. kubectl --context prod get pods -A
-n, --namespace Ορίζει το Namespace για Resources που ανήκουν σε Namespace. kubectl get pods -n demo
-A, --all-namespaces Εμφανίζει Resources από όλα τα Namespaces. kubectl get pods -A
-o <format> Ορίζει τη μορφή της εξόδου. kubectl get pods -o wide
-l, --selector Φιλτράρει με Label Selector. kubectl get pods -l app=web
--field-selector Φιλτράρει με βάση ένα Field. kubectl get pods --field-selector=status.phase=Pending
--as <user> Εκτελεί το Request με την ταυτότητα άλλου User. kubectl auth can-i get pods --as alice
--as-group <group> Εκτελεί το Request με την ταυτότητα άλλου Group. kubectl auth can-i list pods --as-group devs
--request-timeout <duration> Ορίζει Timeout για API Requests. kubectl get pods --request-timeout=10s
--v <level> Αυξάνει τη λεπτομέρεια της εξόδου για Debugging. kubectl get pods --v=8
--dry-run=client Ελέγχει ή παράγει το Resource τοπικά χωρίς να το αποθηκεύσει στο API. kubectl create ns demo --dry-run=client -o yaml
--dry-run=server Ελέγχει το Resource μέσω του API Server, μαζί με το Admission. kubectl apply --dry-run=server -f app.yaml

Μορφές εξόδου

bash
kubectl get pods -o wide
kubectl get pods -o yaml
kubectl get pods -o json
kubectl get pods -o name
kubectl get pods -o custom-columns='NS:.metadata.namespace,NAME:.metadata.name,STATUS:.status.phase'
kubectl get pods -o jsonpath='{.items[*].metadata.name}'

Συνηθισμένα σύντομα ονόματα Resources

Σύντομο όνομα Πλήρες όνομα
po pods
svc services
deploy deployments
rs replicasets
sts statefulsets
ds daemonsets
cm configmaps
sa serviceaccounts
ns namespaces
ep endpoints
pvc persistentvolumeclaims
pv persistentvolumes
sc storageclasses
ing ingresses
netpol networkpolicies
cj cronjobs

04 / 50

5. kubeconfig, Context και πρόσβαση

Έλεγχος του τρέχοντος Context

bash
kubectl config current-context
kubectl config get-contexts
kubectl cluster-info
kubectl get nodes -o wide

Εκτέλεσε αυτές τις εντολές πριν από κάθε αλλαγή. Το λανθασμένο Context είναι ένα από τα συχνότερα λειτουργικά σφάλματα.

Αλλαγή Context

bash
kubectl config use-context <context>
kubectl config current-context

Ορισμός Namespace στο τρέχον Context

bash
kubectl config set-context --current --namespace=<namespace>
kubectl config view --minify | grep namespace

Αυτό είναι βολικό, αλλά μπορεί να οδηγήσει σε αλλαγές στο λάθος Namespace. Στα Runbooks το -n <namespace> δηλώνει τον στόχο πιο καθαρά.

Προβολή και έλεγχος του kubeconfig

bash
kubectl config view
kubectl config view --raw
kubectl config view --minify
kubectl config get-clusters
kubectl config get-users
kubectl config get-contexts

Το --raw μπορεί να εμφανίσει ευαίσθητα δεδομένα, όπως Certificates ή Tokens. Μη μοιράζεσαι αυτή την έξοδο χωρίς να την ελέγξεις πρώτα.

Ορισμός Cluster, User και Context

bash
kubectl config set-cluster <cluster> --server=https://<api-server>:6443 --certificate-authority=<ca.crt>
kubectl config set-credentials <user> --client-certificate=<user.crt> --client-key=<user.key>
kubectl config set-context <context> --cluster=<cluster> --user=<user> --namespace=<namespace>
kubectl config use-context <context>

Μετονομασία ή διαγραφή Contexts

bash
kubectl config rename-context <old-context> <new-context>
kubectl config delete-context <context>
kubectl config delete-cluster <cluster>
kubectl config delete-user <user>

Χρήση προσωρινού kubeconfig

bash
KUBECONFIG=./kubeconfig kubectl get nodes
kubectl --kubeconfig ./kubeconfig get pods -A

Συνένωση πολλών αρχείων kubeconfig

bash
export KUBECONFIG=$HOME/.kube/config:./cluster-a.yaml:./cluster-b.yaml
kubectl config view --merge --flatten > ./merged-kubeconfig.yaml

05 / 50

6. Εξερεύνηση του API και μοντέλο Resources

Εμφάνιση API Versions και Resources

bash
kubectl api-versions
kubectl api-resources
kubectl api-resources --namespaced=true
kubectl api-resources --namespaced=false
kubectl api-resources --verbs=list
kubectl api-resources --api-group=apps
kubectl api-resources -o wide

Οι εντολές δείχνουν ποιοι τύποι Resources είναι διαθέσιμοι στο Cluster. Εμφανίζονται επίσης τα CRDs που εγκατέστησαν Add-ons.

Εξήγηση του Schema ενός Resource

bash
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers
kubectl explain deployment.spec.strategy
kubectl explain networkpolicy.spec.ingress
kubectl explain gateway.spec.listeners
kubectl explain --recursive deployment.spec.template.spec

Το kubectl explain είναι ο γρηγορότερος τρόπος να κατανοήσεις τα Fields απευθείας από το API Schema.

Άμεση πρόσβαση στο API

bash
kubectl get --raw /api
kubectl get --raw /apis
kubectl get --raw /version
kubectl get --raw /healthz
kubectl get --raw /readyz?verbose
kubectl get --raw /livez?verbose
kubectl get --raw /metrics | head

Η πρόσβαση στα /metrics, /readyz και /livez μπορεί να περιορίζεται από το RBAC και τη ρύθμιση του API Server.

Subresources

Ορισμένα Resources διαθέτουν Subresources, όπως status, scale ή, ανάλογα με την έκδοση, resize.

bash
kubectl get deployment web -n demo --subresource=scale -o yaml
kubectl patch deployment web -n demo --subresource=scale --type=merge -p '{"spec":{"replicas":3}}'
kubectl get pod <pod> -n demo --subresource=status -o yaml

Χρησιμοποίησε Subresources όταν θέλεις να ελέγξεις ή να αλλάξεις συγκεκριμένα το Status, το Scaling ή άλλο εξειδικευμένο μέρος ενός Object.


06 / 50

7. Προβολή, φιλτράρισμα και μορφοποίηση Resources

Βασικές εντολές

bash
kubectl get namespaces
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get all -n <namespace>
kubectl get deployments,replicasets,pods -n <namespace>
kubectl get services,endpoints,endpointslices -n <namespace>
kubectl describe pod <pod> -n <namespace>
kubectl describe node <node>

Λειτουργία Watch

bash
kubectl get pods -n <namespace> -w
kubectl get events -n <namespace> --watch
watch -n 2 'kubectl get pods -n <namespace>'

Το kubectl -w παρακολουθεί τις αλλαγές μέσω του API. Η εντολή watch εκτελεί επανειλημμένα μια εντολή και είναι χρήσιμη όταν θέλεις να εμφανίζεις μαζί διαφορετικούς τύπους Objects.

Label Selectors

bash
kubectl get pods -n demo -l app=web
kubectl get pods -n demo -l 'app in (web,api)'
kubectl get pods -n demo -l 'app=web,environment=dev'
kubectl get pods -A -l 'app.kubernetes.io/name=nginx'

Field Selectors

bash
kubectl get pods -A --field-selector=status.phase=Pending
kubectl get pods -A --field-selector=status.phase!=Running
kubectl get events -A --field-selector=type=Warning
kubectl get pods -A --field-selector=spec.nodeName=<node>

Τα Field Selectors υποστηρίζουν λιγότερα Fields από τα Label Selectors, αλλά είναι ιδιαίτερα χρήσιμα για αναζητήσεις βάσει Status ή Node.

Ταξινόμηση

bash
kubectl get pods -A --sort-by=.metadata.creationTimestamp
kubectl get events -A --sort-by=.lastTimestamp
kubectl get pv --sort-by=.spec.capacity.storage
kubectl get pods -A --sort-by=.status.containerStatuses[0].restartCount

Έξοδος μόνο με ονόματα

bash
kubectl get pods -n demo -o name
kubectl get deploy -n demo -o name
kubectl get pods -n demo -l app=web -o name | xargs -r -n1 kubectl describe -n demo

Επιλεκτική αποθήκευση YAML και JSON

bash
kubectl get deployment web -n demo -o yaml > deployment.web.yaml
kubectl get service web -n demo -o json > service.web.json

Κοινή προβολή πολλών Resources

bash
kubectl get deploy,rs,po,svc,ep,endpointslice -n demo -o wide
kubectl get ingress,svc,ep,endpointslice -n demo -o wide
kubectl get pvc,pv,storageclass -A

07 / 50

8. Δημιουργία, εφαρμογή και έλεγχος Resources

Δηλωτική διαχείριση με apply

bash
kubectl apply -f manifest.yaml
kubectl apply -f ./manifests/
kubectl apply -f https://example.invalid/manifest.yaml
kubectl apply -k overlays/dev

Το apply είναι η συνήθης επιλογή για δηλωτική διαχείριση. Το αρχείο Manifest παραμένει η αυθεντική πηγή του Desired State.

Server-Side Dry Run

bash
kubectl apply --dry-run=server -f manifest.yaml
kubectl apply --dry-run=server -k overlays/dev

Το Server-Side Dry Run ελέγχει το Resource μέσω του API Server και περιλαμβάνει τους Admission Controllers. Έτσι παρέχει ισχυρότερο έλεγχο από την τοπική επικύρωση του YAML.

Client-Side Dry Run και δημιουργία YAML

bash
kubectl create namespace demo --dry-run=client -o yaml
kubectl create deployment web --image=nginx:1.27 --replicas=2 --dry-run=client -o yaml
kubectl create service clusterip web --tcp=80:8080 --dry-run=client -o yaml
kubectl run debug --image=busybox --restart=Never --dry-run=client -o yaml -- sleep 3600

Χρησιμοποίησε αυτή τη μορφή για να δημιουργήσεις αρχικά Manifests και έπειτα να τα διαχειριστείς με Version Control.

Diff πριν από την αλλαγή

bash
kubectl diff -f manifest.yaml
kubectl diff -k overlays/dev
kubectl diff -f ./manifests/ --server-side

Το diff δείχνει ποια Fields θα άλλαζαν στο Cluster.

Server-Side Apply

bash
kubectl apply --server-side -f manifest.yaml
kubectl apply --server-side --field-manager=workshop -f manifest.yaml
kubectl apply --server-side --force-conflicts -f manifest.yaml

Το Server-Side Apply είναι χρήσιμο όταν πολλοί Controllers ή ομάδες διαχειρίζονται διαφορετικά Fields. Χρησιμοποίησε το --force-conflicts μόνο όταν θέλεις συνειδητά να παρακάμψεις το Field Ownership.

Replace

bash
kubectl replace -f manifest.yaml
kubectl replace --force -f manifest.yaml

Το replace αντικαθιστά το Resource με βάση το Object που παρέχεις. Το replace --force το διαγράφει και το δημιουργεί ξανά· αυτό μπορεί να προκαλέσει διακοπή λειτουργίας.

Έλεγχος με Schema και Admission

bash
kubectl apply --dry-run=server -f manifest.yaml
kubectl explain deployment.spec.template.spec.containers.resources
kubectl get events -n demo --sort-by=.lastTimestamp

Αν λειτουργούν Admission Controllers, όπως Policy Engines, ένα Manifest μπορεί να έχει σωστή σύνταξη και παρ’ όλα αυτά να απορριφθεί.


08 / 50

9. Τροποποίηση Resources: edit, patch, label, annotate και set

Διαδραστική επεξεργασία

bash
kubectl edit deployment web -n demo
kubectl edit service web -n demo
kubectl edit configmap app-config -n demo
kubectl edit node <node>

Το edit είναι χρήσιμο σε επείγουσες περιπτώσεις, αλλά οι αλλαγές του δεν αναπαράγονται εύκολα. Πέρασε έπειτα τις μόνιμες αλλαγές στο Git Repository σου.

Τροποποίηση με Merge Patch

bash
kubectl patch deployment web -n demo --type=merge -p '{"spec":{"replicas":3}}'
kubectl patch service web -n demo --type=merge -p '{"spec":{"type":"ClusterIP"}}'

Τροποποίηση με JSON Patch

bash
kubectl patch deployment web -n demo --type=json -p='[
  {"op":"replace","path":"/spec/replicas","value":3}
]'

Το JSON Patch είναι ακριβές, αλλά εξαρτάται από τις σωστές διαδρομές των Fields.

Τροποποίηση ενός Annotation

bash
kubectl patch deployment web -n demo --type=merge -p '{
  "metadata": {
    "annotations": {
      "workshop.example/change-reason": "manual-test"
    }
  }
}'

Ορισμός και αφαίρεση Labels

bash
kubectl label namespace demo environment=dev
kubectl label pod <pod> -n demo debug=true
kubectl label deployment web -n demo app.kubernetes.io/version=1.2.3 --overwrite
kubectl label namespace demo environment-

Τα Labels επηρεάζουν Selectors, Policies, τη συγκέντρωση Metrics και συχνά τη λογική του GitOps ή του Deployment. Άλλαζέ τα με προσοχή.

Ορισμός και αφαίρεση Annotations

bash
kubectl annotate deployment web -n demo kubernetes.io/change-cause='image update to 1.2.3'
kubectl annotate pod <pod> -n demo workshop.example/owner='team-a' --overwrite
kubectl annotate deployment web -n demo kubernetes.io/change-cause-

Αλλαγή Images

bash
kubectl set image deployment/web app=<image> -n demo
kubectl set image deployment/web app=ghcr.io/example/app:1.2.3 -n demo --record=false
kubectl set image daemonset/node-agent agent=ghcr.io/example/agent:2.0.0 -n kube-system

Αλλαγή μεταβλητών περιβάλλοντος

bash
kubectl set env deployment/web LOG_LEVEL=debug -n demo
kubectl set env deployment/web LOG_LEVEL- -n demo
kubectl set env deployment/web --from=configmap/app-config -n demo
kubectl set env deployment/web --list -n demo

Αλλαγή Requests και Limits

bash
kubectl set resources deployment/web -n demo --requests=cpu=100m,memory=128Mi --limits=cpu=500m,memory=512Mi
kubectl set resources deployment/web -n demo -c app --requests=cpu=200m,memory=256Mi

Ορισμός ServiceAccount

bash
kubectl set serviceaccount deployment/web app-sa -n demo

Ορισμός Selector

bash
kubectl set selector service/web app=web -n demo

Πρόσεχε ιδιαίτερα τους Selectors. Ένας λανθασμένος Service Selector μπορεί γρήγορα να αφήσει ένα Service χωρίς Endpoints ή να στείλει την κίνηση σε λάθος Pods.


09 / 50

10. Διαγραφή, αναμονή και καθαρισμός Resources

Στοχευμένη διαγραφή

bash
kubectl delete pod <pod> -n demo
kubectl delete deployment web -n demo
kubectl delete service web -n demo
kubectl delete -f manifest.yaml
kubectl delete -k overlays/dev

Διαγραφή με βάση Label

bash
kubectl delete pods -n demo -l app=web
kubectl delete jobs -n demo -l cleanup=true

Διαγραφή όλων των Resources ενός τύπου

bash
kubectl delete pods --all -n demo
kubectl delete jobs --all -n demo

Χρησιμοποίησε το --all μόνο μέσα σε Namespace που έχεις επιλέξει συνειδητά.

Grace Period και αναγκαστική διαγραφή

bash
kubectl delete pod <pod> -n demo --grace-period=30
kubectl delete pod <pod> -n demo --grace-period=0 --force

Το --force αφαιρεί το API Object χωρίς να περιμένει την κανονική ολοκλήρωση της διαγραφής. Αυτό δεν σημαίνει απαραίτητα ότι η διεργασία στο Node τερματίστηκε ομαλά.

Έλεγχος και αφαίρεση Finalizers

bash
kubectl get <resource> <name> -n demo -o jsonpath='{.metadata.finalizers}'
kubectl patch <resource> <name> -n demo --type=merge -p '{"metadata":{"finalizers":null}}'

Αφαίρεσε Finalizers μόνο αν κατανοείς ποιος Controller κρατά το Resource σε αναμονή. Διαφορετικά μπορεί να μείνουν εξωτερικά Artifacts χωρίς καθαρισμό.

Αναμονή για συγκεκριμένη κατάσταση

bash
kubectl wait --for=condition=Available deployment/web -n demo --timeout=120s
kubectl wait --for=condition=Ready pod/<pod> -n demo --timeout=60s
kubectl wait --for=delete pod/<pod> -n demo --timeout=60s
kubectl wait --for=jsonpath='{.status.phase}'=Running pod/<pod> -n demo --timeout=60s

Προσεκτική χρήση του Prune

bash
kubectl apply -f ./manifests/ --prune -l app.kubernetes.io/part-of=demo

Το --prune μπορεί να διαγράψει Resources που δεν περιλαμβάνονται πλέον στο σύνολο Manifests που εφαρμόζεται. Χρησιμοποίησε περιορισμένο και σαφή Label Selector.


10 / 50

11. Pods

Προβολή Pods

bash
kubectl get pods -n demo
kubectl get pods -n demo -o wide
kubectl get pod <pod> -n demo -o yaml
kubectl describe pod <pod> -n demo

Εύρεση Pods ανά Status

bash
kubectl get pods -A --field-selector=status.phase=Pending
kubectl get pods -A --field-selector=status.phase=Failed
kubectl get pods -A --field-selector=status.phase=Succeeded
kubectl get pods -A --field-selector=spec.nodeName=<node>

Προβολή Containers ενός Pod

bash
kubectl get pod <pod> -n demo -o jsonpath='{.spec.containers[*].name}'
kubectl get pod <pod> -n demo -o jsonpath='{.spec.initContainers[*].name}'
kubectl get pod <pod> -n demo -o jsonpath='{.status.containerStatuses[*].restartCount}'

Εκκίνηση προσωρινού Pod

bash
kubectl run tmp-shell -n demo --rm -it --image=busybox:1.36 --restart=Never -- sh
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- sh
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local

Δημιουργία Pod Manifest

bash
kubectl run app -n demo --image=nginx:1.27 --restart=Never --dry-run=client -o yaml > pod.yaml

Διαγραφή Pod ώστε να το δημιουργήσει ξανά ο Controller

bash
kubectl delete pod <pod> -n demo
kubectl get replicaset,deployment -n demo

Αν το Pod διαχειρίζεται Deployment, ReplicaSet, StatefulSet ή DaemonSet, ο Controller συνήθως δημιουργεί νέο Pod. Αν το Pod δημιουργήθηκε χειροκίνητα, η διαγραφή του είναι οριστική.


11 / 50

12. Deployments, ReplicaSets και Rollouts

Δημιουργία Deployment

bash
kubectl create deployment web -n demo --image=nginx:1.27 --replicas=2
kubectl create deployment web -n demo --image=nginx:1.27 --replicas=2 --dry-run=client -o yaml > deployment.yaml

Έλεγχος Deployment

bash
kubectl get deployment web -n demo
kubectl describe deployment web -n demo
kubectl get replicaset -n demo -l app=web
kubectl get pods -n demo -l app=web -o wide

Εκκίνηση και παρακολούθηση Rollout

bash
kubectl set image deployment/web nginx=nginx:1.28 -n demo
kubectl rollout status deployment/web -n demo --timeout=120s
kubectl rollout history deployment/web -n demo

Έλεγχος ιστορικού Rollout και Revisions

bash
kubectl rollout history deployment/web -n demo
kubectl rollout history deployment/web -n demo --revision=2
kubectl describe deployment web -n demo

Rollback

bash
kubectl rollout undo deployment/web -n demo
kubectl rollout undo deployment/web -n demo --to-revision=2
kubectl rollout status deployment/web -n demo

Παύση και συνέχιση Rollout

bash
kubectl rollout pause deployment/web -n demo
kubectl set image deployment/web app=ghcr.io/example/app:1.2.4 -n demo
kubectl set env deployment/web FEATURE_X=true -n demo
kubectl rollout resume deployment/web -n demo
kubectl rollout status deployment/web -n demo

Επανεκκίνηση Deployment

bash
kubectl rollout restart deployment/web -n demo
kubectl rollout status deployment/web -n demo

Το rollout restart ορίζει ένα Annotation στο Pod Template και έτσι δημιουργεί νέα Pods.

Έλεγχος ReplicaSets

bash
kubectl get rs -n demo
kubectl describe rs <replicaset> -n demo
kubectl get pods -n demo --show-labels

Τα ReplicaSets συνήθως δεν τροποποιούνται απευθείας. Άλλαξε το Deployment που τα διαχειρίζεται.


12 / 50

13. StatefulSets, DaemonSets, Jobs και CronJobs

StatefulSets

bash
kubectl get statefulsets -n demo
kubectl describe statefulset db -n demo
kubectl rollout status statefulset/db -n demo
kubectl rollout restart statefulset/db -n demo
kubectl scale statefulset/db -n demo --replicas=3
kubectl get pods -n demo -l app=db -o wide
kubectl get pvc -n demo -l app=db

Τα StatefulSets δημιουργούν σταθερά ονόματα Pods και χρησιμοποιούν συχνά PVCs. Όταν διαγράφεται ένα StatefulSet, τα PVCs μπορεί να διατηρηθούν ανάλογα με την Storage Policy.

DaemonSets

bash
kubectl get daemonsets -A
kubectl describe daemonset <daemonset> -n <namespace>
kubectl rollout status daemonset/<daemonset> -n <namespace>
kubectl rollout restart daemonset/<daemonset> -n <namespace>
kubectl get pods -n <namespace> -l <label-key>=<label-value> -o wide

Τα DaemonSets χρησιμοποιούνται συνήθως για Agents που εκτελούνται σε Nodes: CNI, CSI, Logging, Monitoring και Security.

Jobs

bash
kubectl create job migrate -n demo --image=ghcr.io/example/app:1.2.3 -- ./migrate.sh
kubectl create job migrate -n demo --image=ghcr.io/example/app:1.2.3 --dry-run=client -o yaml > job.yaml
kubectl get jobs -n demo
kubectl describe job migrate -n demo
kubectl logs job/migrate -n demo
kubectl delete job migrate -n demo

Δημιουργία Job από CronJob

bash
kubectl create job manual-backup -n demo --from=cronjob/backup
kubectl logs job/manual-backup -n demo

CronJobs

bash
kubectl create cronjob backup -n demo --image=busybox:1.36 --schedule='*/15 * * * *' -- /bin/sh -c 'date; echo backup'
kubectl get cronjobs -n demo
kubectl describe cronjob backup -n demo
kubectl get jobs -n demo --sort-by=.metadata.creationTimestamp
kubectl delete cronjob backup -n demo

Καθαρισμός ολοκληρωμένων Jobs

bash
kubectl get jobs -n demo
kubectl delete job -n demo --field-selector=status.successful=1
kubectl delete job -n demo -l cleanup=true

13 / 50

14. Scaling, Autoscaling και διαθεσιμότητα

Χειροκίνητο Scaling

bash
kubectl scale deployment/web -n demo --replicas=3
kubectl scale statefulset/db -n demo --replicas=3
kubectl get deployment web -n demo

Δημιουργία HorizontalPodAutoscaler

bash
kubectl autoscale deployment web -n demo --min=2 --max=10 --cpu-percent=70
kubectl get hpa -n demo
kubectl describe hpa web -n demo

Το HPA χρειάζεται Metrics, συνήθως μέσω του Metrics Server. Χωρίς Metrics δεν μπορεί να κλιμακώσει αποτελεσματικά τα Pods και ενδέχεται να εμφανίζει σφάλματα.

Έλεγχος HPA

bash
kubectl get hpa -A
kubectl describe hpa <hpa> -n <namespace>
kubectl top pods -n <namespace>
kubectl top pods -n <namespace> --containers

PodDisruptionBudget

bash
kubectl get poddisruptionbudgets -A
kubectl describe pdb web -n demo
kubectl create poddisruptionbudget web -n demo --selector=app=web --min-available=1 --dry-run=client -o yaml

Τα PDBs προστατεύουν από προγραμματισμένες διακοπές, όπως το kubectl drain. Δεν αποτρέπουν βλάβες των Nodes.

Έλεγχος διαθεσιμότητας Deployment

bash
kubectl get deployment web -n demo -o jsonpath='{.status.availableReplicas}'
kubectl get deployment web -n demo -o jsonpath='{.status.conditions}'
kubectl describe deployment web -n demo

14 / 50

15. Logs, Exec, Attach, Copy και Debug

Προβολή Logs

bash
kubectl logs pod/<pod> -n demo
kubectl logs pod/<pod> -n demo -c <container>
kubectl logs pod/<pod> -n demo --all-containers
kubectl logs deployment/web -n demo
kubectl logs deployment/web -n demo --tail=100
kubectl logs deployment/web -n demo --since=10m
kubectl logs deployment/web -n demo -f
kubectl logs pod/<pod> -n demo -c <container> --previous

Το --previous είναι σημαντικό για το CrashLoopBackOff, επειδή το τρέχον Container συχνά τερματίζεται ξανά σχεδόν αμέσως.

Logs με βάση Label

bash
kubectl logs -n demo -l app=web --all-containers=true --tail=100
kubectl logs -n demo -l app=web --prefix=true --since=30m

Exec μέσα σε Container

bash
kubectl exec -it pod/<pod> -n demo -- sh
kubectl exec -it pod/<pod> -n demo -c <container> -- bash
kubectl exec pod/<pod> -n demo -- printenv
kubectl exec pod/<pod> -n demo -- cat /etc/resolv.conf

Τα Minimal Images συχνά δεν περιέχουν bash, curl, nslookup ή Package Manager. Σε αυτή την περίπτωση χρησιμοποίησε Debug Containers.

Attach

bash
kubectl attach pod/<pod> -n demo -c <container>
kubectl attach -it pod/<pod> -n demo -c <container>

Το attach συνδέεται με μια διεργασία που ήδη εκτελείται. Για πρόσβαση σε Shell, το exec είναι συνήθως καταλληλότερο.

Αντιγραφή αρχείων

bash
kubectl cp demo/<pod>:/path/in/container ./local-file -c <container>
kubectl cp ./local-file demo/<pod>:/tmp/local-file -c <container>

Το kubectl cp συχνά απαιτεί tar μέσα στο Container. Αν λείπει, χρησιμοποίησε το kubectl exec με Streams ή ένα Debug Image.

Προσωρινό Debug Container

bash
kubectl debug -it pod/<pod> -n demo --image=busybox:1.36 --target=<container> -- sh
kubectl debug -it pod/<pod> -n demo --image=nicolaka/netshoot --target=<container> -- bash

Τα Ephemeral Containers προστίθενται στο Pod για Debugging. Δεν προορίζονται για μόνιμες αλλαγές.

Δημιουργία Debug αντιγράφου ενός Pod

bash
kubectl debug pod/<pod> -n demo -it --copy-to=<pod>-debug --container=debug --image=busybox:1.36 -- sh

Debugging ενός Node

bash
kubectl debug node/<node> -it --image=ubuntu:24.04

Στο Debug Shell το Filesystem του Host είναι συνήθως διαθέσιμο στη διαδρομή /host. Χρησιμοποίησε αυτή τη δυνατότητα μόνο για συγκεκριμένο σκοπό.


15 / 50

16. Port Forwarding, Proxy και τοπικές δοκιμές

Port Forward προς Pod

bash
kubectl port-forward pod/<pod> -n demo 8080:80

Port Forward προς Service

bash
kubectl port-forward service/web -n demo 8080:80
curl http://127.0.0.1:8080

Port Forward προς Deployment

bash
kubectl port-forward deployment/web -n demo 8080:8080

API Proxy

bash
kubectl proxy --port=8001
curl http://127.0.0.1:8001/api/
curl http://127.0.0.1:8001/apis/apps/v1/namespaces/demo/deployments

Το kubectl proxy βοηθά στην τοπική ανάπτυξη και στην εξερεύνηση του API. Μην το εκθέτεις χωρίς προστασία σε κοινόχρηστα συστήματα.

Τοπικές δοκιμές Service

bash
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- http://web.demo.svc.cluster.local
kubectl run netshoot -n demo --rm -it --image=nicolaka/netshoot --restart=Never -- bash

16 / 50

17. Services, DNS, Endpoints και EndpointSlices

Προβολή Services

bash
kubectl get services -n demo
kubectl get svc -n demo -o wide
kubectl describe service web -n demo
kubectl get service web -n demo -o yaml

Δημιουργία Service

bash
kubectl expose deployment web -n demo --port=80 --target-port=8080 --type=ClusterIP
kubectl create service clusterip web -n demo --tcp=80:8080 --dry-run=client -o yaml
kubectl create service nodeport web -n demo --tcp=80:8080 --dry-run=client -o yaml
kubectl create service loadbalancer web -n demo --tcp=80:8080 --dry-run=client -o yaml

Έλεγχος Endpoints

bash
kubectl get endpoints web -n demo -o wide
kubectl get endpointslices -n demo -l kubernetes.io/service-name=web
kubectl describe endpointslice -n demo -l kubernetes.io/service-name=web

Αν ένα Service δεν έχει Endpoints, συνήθως ο Selector δεν ταιριάζει με τα Pod Labels ή τα Pods δεν είναι Ready.

Δοκιμή DNS μέσα στο Cluster

bash
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- nslookup web.demo.svc.cluster.local
kubectl run dns-test -n demo --rm -it --image=busybox:1.36 --restart=Never -- cat /etc/resolv.conf

Έλεγχος CoreDNS

bash
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
kubectl get configmap coredns -n kube-system -o yaml

Έλεγχος κίνησης Service

bash
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- curl -sv http://web.demo.svc.cluster.local
kubectl run netshoot -n demo --rm -it --image=nicolaka/netshoot --restart=Never -- curl -sv http://web.demo.svc.cluster.local

17 / 50

18. Ingress και Gateway API

Προβολή Ingress Resources

bash
kubectl get ingress -A
kubectl describe ingress web -n demo
kubectl get ingress web -n demo -o yaml

Έλεγχος IngressClass

bash
kubectl get ingressclass
kubectl describe ingressclass <ingressclass>

Έλεγχος Ingress Controller

bash
kubectl get pods -A | grep -i ingress
kubectl get svc -A | grep -i ingress
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller --tail=100

Το Namespace και τα Labels εξαρτώνται από τον συγκεκριμένο Controller.

Προβολή Gateway API Resources

bash
kubectl get gatewayclasses
kubectl get gateways -A
kubectl get httproutes -A
kubectl get grpcroutes -A
kubectl get tlsroutes -A
kubectl get referencegrants -A

Λεπτομέρειες Gateway API Resources

bash
kubectl describe gateway <gateway> -n <namespace>
kubectl describe httproute <route> -n <namespace>
kubectl get httproute <route> -n <namespace> -o yaml

Τυπική διαδικασία Triage για Ingress και Gateway

bash
kubectl get ingress,svc,ep,endpointslice -n demo -o wide
kubectl describe ingress web -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl get pods -A -o wide | grep -i ingress
kubectl logs -n <ingress-namespace> <ingress-controller-pod> --tail=200

18 / 50

19. NetworkPolicies και δοκιμές δικτύου

Προβολή NetworkPolicies

bash
kubectl get networkpolicy -A
kubectl describe networkpolicy <policy> -n <namespace>
kubectl get networkpolicy <policy> -n <namespace> -o yaml

Pods για δοκιμές δικτύου

bash
kubectl run netshoot -n demo --rm -it --image=nicolaka/netshoot --restart=Never -- bash
kubectl run busybox -n demo --rm -it --image=busybox:1.36 --restart=Never -- sh
kubectl run curl -n demo --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- sh

Δοκιμή DNS και HTTP

bash
nslookup web.demo.svc.cluster.local
curl -sv http://web.demo.svc.cluster.local
wget -qO- http://web.demo.svc.cluster.local
nc -vz web.demo.svc.cluster.local 80

Δοκιμή επικοινωνίας μεταξύ Pods

bash
kubectl get pods -n demo -o wide
kubectl exec -it <pod> -n demo -- sh
ip addr
ip route
cat /etc/resolv.conf

Βασικός έλεγχος CNI

bash
kubectl get pods -n kube-system -o wide
kubectl get daemonsets -n kube-system
kubectl get nodes -o wide
kubectl describe node <node>

Αν τα NetworkPolicies δεν εφαρμόζονται, έλεγξε πρώτα αν το CNI της εγκατάστασής σου υποστηρίζει την επιβολή τους.


19 / 50

20. ConfigMaps, Secrets και ServiceAccounts

Δημιουργία ConfigMap

bash
kubectl create configmap app-config -n demo --from-literal=LOG_LEVEL=info
kubectl create configmap app-config -n demo --from-file=application.yaml
kubectl create configmap app-config -n demo --from-env-file=.env
kubectl create configmap app-config -n demo --from-literal=LOG_LEVEL=info --dry-run=client -o yaml > configmap.yaml

Έλεγχος ConfigMap

bash
kubectl get configmap app-config -n demo
kubectl describe configmap app-config -n demo
kubectl get configmap app-config -n demo -o yaml

Δημιουργία Secret

bash
kubectl create secret generic app-secret -n demo --from-literal=password='dummy'
kubectl create secret generic app-secret -n demo --from-file=credentials.json
kubectl create secret tls web-tls -n demo --cert=tls.crt --key=tls.key
kubectl create secret docker-registry regcred -n demo \
  --docker-server=<registry> \
  --docker-username=<user> \
  --docker-password=<password> \
  --docker-email=<email>

Δημιουργία Secret Manifest χωρίς πραγματικές τιμές

bash
kubectl create secret generic app-secret -n demo --from-literal=password='dummy' --dry-run=client -o yaml > secret.example.yaml

Τα πραγματικά Secrets δεν πρέπει να αποθηκεύονται σε Git Repositories των workshops. Χρησιμοποίησε εξωτερικά συστήματα Secrets, Sealed Secrets, External Secrets ή τη λύση διαχείρισης Secrets της πλατφόρμας σου.

Ανάγνωση Secret

bash
kubectl get secret app-secret -n demo -o yaml
kubectl get secret app-secret -n demo -o jsonpath='{.data.password}' | base64 -d; echo

Το Base64 είναι κωδικοποίηση, όχι κρυπτογράφηση.

Δημιουργία ServiceAccount και έλεγχος Token

bash
kubectl create serviceaccount app-sa -n demo
kubectl get serviceaccount app-sa -n demo -o yaml
kubectl create token app-sa -n demo

Ορισμός ImagePullSecrets

bash
kubectl patch serviceaccount default -n demo -p '{"imagePullSecrets":[{"name":"regcred"}]}'
kubectl get serviceaccount default -n demo -o yaml

20 / 50

21. RBAC, Authentication και Authorization

Έλεγχος των δικών σου δικαιωμάτων

bash
kubectl auth can-i get pods -n demo
kubectl auth can-i list secrets -n demo
kubectl auth can-i create deployments -n demo
kubectl auth can-i '*' '*' -n demo
kubectl auth whoami

Έλεγχος δικαιωμάτων ενός ServiceAccount

bash
kubectl auth can-i get pods -n demo --as system:serviceaccount:demo:app-sa
kubectl auth can-i list secrets -n demo --as system:serviceaccount:demo:app-sa
kubectl auth can-i '*' '*' --as system:serviceaccount:demo:app-sa

Προβολή Roles και Bindings

bash
kubectl get roles,rolebindings -n demo
kubectl get clusterroles,clusterrolebindings
kubectl describe role <role> -n demo
kubectl describe rolebinding <rolebinding> -n demo
kubectl describe clusterrole <clusterrole>
kubectl describe clusterrolebinding <clusterrolebinding>

Δημιουργία Role

bash
kubectl create role pod-reader -n demo --verb=get,list,watch --resource=pods
kubectl create role deployment-editor -n demo --verb=get,list,watch,update,patch --resource=deployments.apps

Δημιουργία RoleBinding

bash
kubectl create rolebinding read-pods -n demo --role=pod-reader --serviceaccount=demo:app-sa
kubectl create rolebinding read-pods-user -n demo --role=pod-reader --user=alice@example.com
kubectl create rolebinding read-pods-group -n demo --role=pod-reader --group=developers

ClusterRole και ClusterRoleBinding

bash
kubectl create clusterrole node-reader --verb=get,list,watch --resource=nodes
kubectl create clusterrolebinding node-reader-binding --clusterrole=node-reader --user=alice@example.com

Τα δικαιώματα σε ολόκληρο το Cluster είναι ιδιαίτερα ευαίσθητα. Παραχώρησέ τα μόνο όταν τα Roles σε επίπεδο Namespace δεν επαρκούν.

Reconciliation του RBAC από Manifests

bash
kubectl auth reconcile -f rbac.yaml --dry-run=server
kubectl auth reconcile -f rbac.yaml

Προβολή των ServiceAccounts που χρησιμοποιούν τα Pods

bash
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,SA:.spec.serviceAccountName'

21 / 50

22. Ασφάλεια Pods και Containers

Έλεγχος SecurityContext

bash
kubectl get pod <pod> -n demo -o jsonpath='{.spec.securityContext}'
kubectl get pod <pod> -n demo -o jsonpath='{.spec.containers[*].securityContext}'
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,SA:.spec.serviceAccountName'

Εύρεση Privileged Pods

bash
kubectl get pods -A -o json | jq -r '
  .items[] |
  select(any(.spec.containers[]?; .securityContext.privileged == true)) |
  [.metadata.namespace, .metadata.name] | @tsv'

Εύρεση Pods με Host Network, Host PID ή Host IPC

bash
kubectl get pods -A -o json | jq -r '
  .items[] |
  select(.spec.hostNetwork == true or .spec.hostPID == true or .spec.hostIPC == true) |
  [.metadata.namespace, .metadata.name, "host-level"] | @tsv'

Pod Security Admission μέσω Namespace Label

bash
kubectl label namespace demo pod-security.kubernetes.io/enforce=baseline --overwrite
kubectl label namespace demo pod-security.kubernetes.io/audit=restricted --overwrite
kubectl label namespace demo pod-security.kubernetes.io/warn=restricted --overwrite
kubectl get namespace demo --show-labels

Έλεγχος σφαλμάτων Admission

bash
kubectl apply --dry-run=server -f pod.yaml
kubectl get events -n demo --sort-by=.lastTimestamp

Έλεγχος Images και Pull Policy

bash
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{.imagePullPolicy}{";"}{end}{"\n"}{end}'

Απόφυγε ανεξέλεγκτα Tags :latest σε περιβάλλοντα που προσομοιώνουν Production.


22 / 50

23. Διαχείριση πόρων: Requests, Limits, Quotas και LimitRanges

Προβολή Requests και Limits

bash
kubectl get pod <pod> -n demo -o jsonpath='{.spec.containers[*].resources}'
kubectl describe pod <pod> -n demo
kubectl get pods -n demo -o custom-columns='POD:.metadata.name,CPU_REQ:.spec.containers[*].resources.requests.cpu,MEM_REQ:.spec.containers[*].resources.requests.memory,CPU_LIM:.spec.containers[*].resources.limits.cpu,MEM_LIM:.spec.containers[*].resources.limits.memory'

Ορισμός Requests και Limits

bash
kubectl set resources deployment/web -n demo --requests=cpu=100m,memory=128Mi --limits=cpu=500m,memory=512Mi
kubectl set resources deployment/web -n demo -c app --requests=cpu=200m,memory=256Mi --limits=cpu=1,memory=1Gi

ResourceQuota

bash
kubectl get resourcequota -n demo
kubectl describe resourcequota -n demo
kubectl create quota demo-quota -n demo \
  --hard=pods=20,requests.cpu=4,requests.memory=8Gi,limits.cpu=8,limits.memory=16Gi

LimitRange

bash
kubectl get limitrange -n demo
kubectl describe limitrange -n demo

Τα LimitRanges συντηρούνται συνήθως ως Manifests, επειδή οι εντολές δημιουργίας τους έχουν περιορισμένες δυνατότητες.

Έλεγχος Metrics Server

bash
kubectl top nodes
kubectl top pods -A
kubectl top pods -n demo --containers
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl describe apiservice v1beta1.metrics.k8s.io

Αν το kubectl top δεν λειτουργεί, έλεγξε το Metrics Server και το αντίστοιχο APIService.


23 / 50

24. Storage: StorageClasses, PVs, PVCs, CSI και VolumeAttachments

Προβολή StorageClasses

bash
kubectl get storageclass
kubectl describe storageclass <storageclass>
kubectl get storageclass -o yaml

Προβολή PVCs και PVs

bash
kubectl get pvc -A
kubectl get pv
kubectl describe pvc <pvc> -n demo
kubectl describe pv <pv>

Δημιουργία PVC

bash
cat <<'YAML' | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
  namespace: demo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard
YAML

Προσάρτηση PVC σε Debug Pod

bash
cat <<'YAML' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: pvc-debug
  namespace: demo
spec:
  restartPolicy: Never
  containers:
    - name: shell
      image: busybox:1.36
      command: ["sh", "-c", "sleep 3600"]
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: data
YAML

Έλεγχος CSI

bash
kubectl get csidrivers
kubectl get csinodes
kubectl get volumeattachments
kubectl describe volumeattachment <volumeattachment>
kubectl get pods -A | grep -i csi

Διαδικασία Triage για Storage

bash
kubectl describe pvc <pvc> -n demo
kubectl describe pod <pod> -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl get pv,pvc -A
kubectl get storageclass
kubectl get volumeattachments

24 / 50

25. Nodes, Scheduling, Taints, Drain και συντήρηση

Προβολή Nodes

bash
kubectl get nodes
kubectl get nodes -o wide
kubectl describe node <node>
kubectl get node <node> -o yaml

Προβολή Pods σε συγκεκριμένο Node

bash
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide

Node Labels

bash
kubectl get nodes --show-labels
kubectl label node <node> disktype=ssd
kubectl label node <node> disktype-

Ορισμός και αφαίρεση Taints

bash
kubectl taint nodes <node> dedicated=gpu:NoSchedule
kubectl taint nodes <node> dedicated=gpu:NoSchedule-
kubectl describe node <node> | grep -i taints -A2

Node cordon και uncordon

bash
kubectl cordon <node>
kubectl get node <node>
kubectl uncordon <node>

Το cordon αποτρέπει το νέο Scheduling στο Node. Τα Pods που ήδη εκτελούνται παραμένουν εκεί.

Node drain

bash
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=10m
kubectl uncordon <node>

Πριν από το drain, έλεγξε:

bash
kubectl get pdb -A
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl describe node <node>

Ανάλυση προβλημάτων Scheduling

bash
kubectl describe pod <pod> -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl describe node <node>
kubectl get resourcequota,limitrange -n demo
kubectl get pods -A --field-selector=status.phase=Pending

Έλεγχος πίεσης πόρων στο Node

bash
kubectl describe node <node> | grep -E 'Pressure|Allocatable|Capacity' -A5
kubectl get events -A --field-selector=reason=Evicted
kubectl top node <node>
kubectl top pods -A --sort-by=memory

25 / 50

26. Events, Metrics και Observability

Προβολή Events

bash
kubectl get events -n demo
kubectl get events -n demo --sort-by=.lastTimestamp
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get events -A --field-selector=type=Warning

Νεότερη εντολή events, εφόσον υποστηρίζεται

bash
kubectl events -n demo
kubectl events -n demo --for pod/<pod>
kubectl events -A --types=Warning

Οι παλαιότερες εκδόσεις του kubectl δεν υποστηρίζουν όλες την εντολή kubectl events με τον ίδιο τρόπο.

Προβολή Metrics

bash
kubectl top nodes
kubectl top pods -A
kubectl top pod <pod> -n demo
kubectl top pods -n demo --containers

Έλεγχος Health και Readiness του API Server

bash
kubectl get --raw /readyz?verbose
kubectl get --raw /livez?verbose
kubectl get --raw /healthz

Εξαγωγή πληροφοριών Cluster

bash
kubectl cluster-info
kubectl cluster-info dump
kubectl cluster-info dump --namespaces demo --output-directory ./cluster-dump

Το cluster-info dump μπορεί να περιέχει ευαίσθητα δεδομένα. Μη μοιράζεσαι την έξοδο χωρίς προηγούμενο έλεγχο.


26 / 50

27. Συνοπτική αναφορά βασικών εντολών kubectl

Εντολή Σκοπός Τυπική χρήση
kubectl annotate Ορίζει, αλλάζει ή αφαιρεί Annotations. Metadata, αιτία αλλαγής και πληροφορίες για Controllers.
kubectl api-resources Εμφανίζει διαθέσιμους τύπους Resources. Εξερεύνηση API και έλεγχος CRDs.
kubectl api-versions Εμφανίζει διαθέσιμες API Versions. Έλεγχος συμβατότητας Manifests.
kubectl apply Εφαρμόζει δηλωτική Configuration. Συνήθης επιλογή για αλλαγές τύπου GitOps.
kubectl attach Συνδέεται με διεργασία Container που εκτελείται. Διαδραστική διάγνωση.
kubectl auth Ελέγχει Authorization και εκτελεί Reconciliation του RBAC. can-i, whoami, reconcile.
kubectl autoscale Δημιουργεί HPA. Εκκίνηση Autoscaling με βάση το CPU.
kubectl certificate Διαχειρίζεται CertificateSigningRequests. Έγκριση ή απόρριψη CSRs.
kubectl cluster-info Εμφανίζει τα Endpoints του Cluster. Αρχική διάγνωση Cluster.
kubectl completion Δημιουργεί Shell Autocomplete. Ταχύτερη εργασία στο Shell.
kubectl config Διαχειρίζεται το kubeconfig. Context, Cluster, User και Namespace.
kubectl cordon Αποκλείει νέο Scheduling σε Node. Προετοιμασία συντήρησης.
kubectl cp Αντιγράφει αρχεία μεταξύ Container και τοπικού συστήματος. Διάγνωση και εξαγωγή μικρών αρχείων.
kubectl create Δημιουργεί Resources με Imperative εντολές. Γρήγορες δοκιμές και δημιουργία YAML.
kubectl debug Ξεκινά Debug Container ή Debug Session σε Node. Διάγνωση κατά την εκτέλεση.
kubectl delete Διαγράφει Resources. Καθαρισμός, Rollback και νέα δημιουργία από Controller.
kubectl describe Εμφανίζει λεπτομέρειες μαζί με Events. Troubleshooting.
kubectl diff Δείχνει διαφορές ανάμεσα σε Manifest και Cluster. Έλεγχος πριν από το apply.
kubectl drain Απομακρύνει Pods από Node για συντήρηση. Node Patching και συντήρηση υλικού.
kubectl edit Τροποποιεί διαδραστικά ένα Resource. Επείγουσα αλλαγή.
kubectl events Εμφανίζει Events, αν το υποστηρίζει η έκδοση. Γρήγορη διάγνωση μέσω Events.
kubectl exec Εκτελεί εντολή μέσα σε Container. Δοκιμές Shell, διεργασιών και δικτύου.
kubectl explain Εξηγεί Fields του API. Σύνταξη Manifests.
kubectl expose Δημιουργεί Service για ένα Resource. Γρήγορη δημιουργία Service.
kubectl get Παραθέτει ή ανακτά Resources. Συνήθης εντολή ανάγνωσης.
kubectl kustomize Παράγει Manifests από Kustomization. Δημιουργία Manifests.
kubectl label Ορίζει, αλλάζει ή αφαιρεί Labels. Selectors, οργάνωση και Policies.
kubectl logs Εμφανίζει Container Logs. Διάγνωση εφαρμογής.
kubectl options Εμφανίζει γενικά Options. Βοήθεια CLI.
kubectl patch Εφαρμόζει μερική αλλαγή. Στοχευμένη τροποποίηση Fields.
kubectl plugin Εμφανίζει Plugins. Επεκτάσεις CLI.
kubectl port-forward Προωθεί τοπική θύρα σε Pod ή Service. Τοπικές δοκιμές.
kubectl proxy Ξεκινά τοπικό Proxy προς το Kubernetes API. Εξερεύνηση API.
kubectl replace Αντικαθιστά ένα Resource. Πλήρης αντικατάσταση Object.
kubectl rollout Διαχειρίζεται Rollouts. Status, History, Undo και Restart.
kubectl run Ξεκινά Pod ή δημιουργεί Manifest. Debugging και γρήγορες δοκιμές.
kubectl scale Αλλάζει τον αριθμό Replicas. Χειροκίνητο Scaling.
kubectl set Ορίζει επιμέρους στοιχεία ενός Resource. Image, Env, Resources και ServiceAccount.
kubectl taint Διαχειρίζεται Node Taints. Έλεγχος Scheduling.
kubectl top Εμφανίζει Metrics. Επισκόπηση CPU και μνήμης.
kubectl uncordon Επιτρέπει ξανά το Scheduling σε Node. Ολοκλήρωση συντήρησης.
kubectl version Εμφανίζει τις εκδόσεις Client και Server. Έλεγχος συμβατότητας.
kubectl wait Περιμένει συγκεκριμένο Condition. Scripts, CI και έλεγχος Rollout.

Βοήθεια για κάθε εντολή

bash
kubectl --help
kubectl get --help
kubectl create --help
kubectl create secret --help
kubectl rollout --help
kubectl rollout history --help
kubectl options

27 / 50

28. kubeadm: επισκόπηση

Το kubeadm είναι εργαλείο Bootstrap για Kubernetes Clusters. Δημιουργεί ένα Cluster με τις ελάχιστες βασικές λειτουργίες. Δεν παρέχει αυτόματα Machine Provisioning, Cloud Integration, Monitoring, Dashboards ή πλήρη εγκατάσταση Add-ons.

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

Εντολή Σκοπός
kubeadm init Αρχικοποιεί Control Plane Node.
kubeadm join Προσθέτει Worker Node ή επιπλέον Control Plane Node στο Cluster.
kubeadm upgrade Σχεδιάζει και εκτελεί Cluster Upgrade.
kubeadm config Εμφανίζει, μετατρέπει, ελέγχει και διαχειρίζεται kubeadm Configuration και Images.
kubeadm token Διαχειρίζεται Bootstrap Tokens.
kubeadm reset Αφαιρεί τα Artifacts του kubeadm από ένα Node.
kubeadm certs Ελέγχει και ανανεώνει Kubernetes Certificates.
kubeadm kubeconfig Διαχειρίζεται αρχεία kubeconfig.
kubeadm version Εμφανίζει την έκδοση του kubeadm.
kubeadm completion Δημιουργεί Shell Completion.
kubeadm alpha Περιέχει πειραματικές λειτουργίες· μην τις χρησιμοποιείς ως σταθερή βάση Operations.

Βοήθεια

bash
kubeadm --help
kubeadm init --help
kubeadm join --help
kubeadm upgrade --help
kubeadm certs --help

28 / 50

29. kubeadm init

Ελάχιστη εκκίνηση Control Plane

bash
sudo kubeadm init

Η εντολή χρησιμοποιεί τις προεπιλεγμένες ρυθμίσεις και επαρκεί για Labs, αλλά δεν είναι αρκετά συγκεκριμένη για αναπαραγώγιμες εγκαταστάσεις.

Αρχικοποίηση με Pod CIDR

bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Το Pod CIDR πρέπει να ταιριάζει με το CNI. Το Flannel χρησιμοποιεί το 10.244.0.0/16 σε πολλά παραδείγματα· άλλα CNIs έχουν διαφορετικές προεπιλογές.

Αρχικοποίηση με Advertise Address του API Server

bash
sudo kubeadm init --apiserver-advertise-address=<ip-address>

Η παράμετρος έχει σημασία σε Hosts με περισσότερα από ένα Network Interfaces.

Αρχικοποίηση με Control Plane Endpoint

bash
sudo kubeadm init \
  --control-plane-endpoint=<dns-name-or-load-balancer>:6443 \
  --upload-certs

Το --control-plane-endpoint είναι σημαντικό για Control Planes υψηλής διαθεσιμότητας. Το --upload-certs διευκολύνει την προσθήκη επιπλέον Control Plane Nodes αργότερα.

Αρχικοποίηση με αρχείο Configuration

bash
sudo kubeadm init --config kubeadm-init.yaml

Παράδειγμα:

yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.0.2.10
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.36.0
controlPlaneEndpoint: k8s-api.example.internal:6443
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12

Μετά το init: ρύθμιση kubeconfig

bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

Μετά το init: εγκατάσταση CNI

bash
kubectl get nodes
kubectl get pods -n kube-system
kubectl apply -f <cni-manifest.yaml>
kubectl get nodes -w

Χωρίς CNI, τα Nodes συχνά παραμένουν σε κατάσταση NotReady και τα CoreDNS Pods δεν μπορούν να εκτελεστούν σωστά.

Έλεγχος του init μέσω Phases

bash
sudo kubeadm init phase --help
sudo kubeadm init phase preflight --config kubeadm-init.yaml
sudo kubeadm init phase certs all --config kubeadm-init.yaml
sudo kubeadm init phase kubeconfig all --config kubeadm-init.yaml
sudo kubeadm init phase control-plane all --config kubeadm-init.yaml
sudo kubeadm init phase etcd local --config kubeadm-init.yaml
sudo kubeadm init phase upload-config all --config kubeadm-init.yaml
sudo kubeadm init phase bootstrap-token --config kubeadm-init.yaml
sudo kubeadm init phase addon all --config kubeadm-init.yaml

Τα Phases βοηθούν στο Debugging και σε ειδικές περιπτώσεις. Για μια συνηθισμένη εγκατάσταση χρησιμοποιείς κανονικά το kubeadm init --config ....


29 / 50

30. kubeadm join

Εμφάνιση της εντολής Join

Σε υπάρχον Control Plane Node:

bash
kubeadm token create --print-join-command

Προσθήκη Worker Node

Στον νέο Worker Node:

bash
sudo kubeadm join <api-server>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

Join με αρχείο Configuration

bash
sudo kubeadm join --config kubeadm-join.yaml

Παράδειγμα:

yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: k8s-api.example.internal:6443
    token: abcdef.0123456789abcdef
    caCertHashes:
      - sha256:<hash>
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock

Προσθήκη επιπλέον Control Plane Node

bash
sudo kubeadm join <api-server>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --control-plane \
  --certificate-key <certificate-key>

Δημιούργησε ή ανανέωσε το Certificate Key με:

bash
sudo kubeadm init phase upload-certs --upload-certs

Phases της διαδικασίας Join

bash
sudo kubeadm join phase --help
sudo kubeadm join phase preflight --config kubeadm-join.yaml
sudo kubeadm join phase kubelet-start --config kubeadm-join.yaml
sudo kubeadm join phase control-plane-prepare all --config kubeadm-join.yaml
sudo kubeadm join phase control-plane-join all --config kubeadm-join.yaml

30 / 50

31. kubeadm reset

Reset ενός Node

bash
sudo kubeadm reset
sudo kubeadm reset -f

Το kubeadm reset αφαιρεί τα τοπικά Artifacts του kubeadm. Δεν επαναφέρει ολόκληρο το λειτουργικό σύστημα.

Reset με CRI Socket

bash
sudo kubeadm reset -f --cri-socket unix:///var/run/containerd/containerd.sock

Έλεγχος μετά το Reset

bash
sudo systemctl status kubelet
sudo ls -la /etc/kubernetes/
sudo ls -la /var/lib/kubelet/
sudo iptables-save | grep -i kube || true
ip link

Ανάλογα με το CNI, μπορεί να χρειαστεί χωριστός καθαρισμός Network Interfaces, κανόνων iptables/nftables ή καταλόγων CNI.

Προσεκτική αφαίρεση υπολειμμάτων CNI

bash
sudo rm -rf /etc/cni/net.d
sudo rm -rf /var/lib/cni

Εκτέλεσε αυτές τις εντολές μόνο αν το Node αφαιρείται πράγματι από το Cluster ή εγκαθίσταται ξανά.


31 / 50

32. kubeadm upgrade

Έλεγχος τρεχουσών εκδόσεων

bash
kubectl get nodes
kubectl version
kubeadm version

Προβολή σχεδίου Upgrade

bash
sudo kubeadm upgrade plan

Upgrade του Control Plane

bash
sudo kubeadm upgrade apply v1.36.0

Προσάρμοσε την εντολή στην έκδοση προορισμού. Στην πράξη εγκαθιστάς πρώτα την αντίστοιχη έκδοση του Package kubeadm.

Βήμα Upgrade των Nodes

Σε επιπλέον Control Plane Nodes και Worker Nodes:

bash
sudo kubeadm upgrade node

Προβολή διαφορών

bash
sudo kubeadm upgrade diff v1.36.0

Τυπική σειρά ενεργειών ανά Node

bash
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
# Ενημέρωσε τα kubeadm/kubelet/kubectl μέσω του Package Manager
sudo kubeadm upgrade node
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubectl uncordon <node>
kubectl get nodes

Για Control Plane Nodes έλεγξε επίσης το API Server, το Controller Manager, τον Scheduler και το etcd.


32 / 50

33. kubeadm config και Images

Εμφάνιση προεπιλεγμένων ρυθμίσεων

bash
kubeadm config print init-defaults
kubeadm config print join-defaults

Μεταφορά Configuration σε νεότερη μορφή

bash
kubeadm config migrate --old-config old.yaml --new-config new.yaml

Έλεγχος Configuration

bash
kubeadm config validate --config kubeadm-init.yaml

Ανάγνωση του Cluster Configuration από ConfigMap

bash
kubectl get configmap kubeadm-config -n kube-system -o yaml
kubectl get configmap kubeadm-config -n kube-system -o jsonpath='{.data.ClusterConfiguration}'

Λίστα και προληπτική λήψη Images

bash
kubeadm config images list
kubeadm config images list --kubernetes-version v1.36.0
sudo kubeadm config images pull
sudo kubeadm config images pull --kubernetes-version v1.36.0
sudo kubeadm config images pull --cri-socket unix:///var/run/containerd/containerd.sock

Αυτό είναι σημαντικό για Air-Gapped περιβάλλοντα ή ελεγχόμενα Registry Mirrors.


33 / 50

34. kubeadm token, certs και kubeconfig

Προβολή και δημιουργία Bootstrap Tokens

bash
kubeadm token list
kubeadm token generate
kubeadm token create
kubeadm token create --ttl 2h
kubeadm token create --print-join-command
kubeadm token delete <token-id>

Έλεγχος λήξης Certificates

bash
sudo kubeadm certs check-expiration

Ανανέωση Certificates

bash
sudo kubeadm certs renew all
sudo kubeadm certs renew apiserver
sudo kubeadm certs renew apiserver-kubelet-client
sudo kubeadm certs renew front-proxy-client
sudo kubeadm certs renew etcd-server
sudo kubeadm certs renew etcd-peer
sudo kubeadm certs renew etcd-healthcheck-client
sudo kubeadm certs renew apiserver-etcd-client

Μετά την ανανέωση των Certificates πρέπει να επανεκκινήσεις ή να ανανεώσεις τα Static Pods ή τα αντίστοιχα Components, συχνά με επανεκκίνηση του kubelet ή με εκ νέου εγγραφή ή προσωρινή μετακίνηση των Manifests.

Δημιουργία Certificate Key

bash
sudo kubeadm certs certificate-key
sudo kubeadm init phase upload-certs --upload-certs

Δημιουργία CSRs

bash
sudo kubeadm certs generate-csr

Διαχείριση αρχείων kubeconfig

bash
sudo kubeadm kubeconfig --help
sudo kubeadm kubeconfig user --client-name <name>
sudo kubeadm init phase kubeconfig admin
sudo kubeadm init phase kubeconfig kubelet
sudo kubeadm init phase kubeconfig controller-manager
sudo kubeadm init phase kubeconfig scheduler

Τα τυπικά αρχεία kubeconfig του kubeadm βρίσκονται στη διαδρομή:

bash
ls -la /etc/kubernetes/*.conf

34 / 50

35. kubeadm phases, completion, version και alpha

Έκδοση

bash
kubeadm version
kubeadm version -o yaml
kubeadm version -o json

Συμπλήρωση εντολών Shell

bash
source <(kubeadm completion bash)
kubeadm completion zsh
kubeadm completion fish

Προβολή Phases

bash
kubeadm init phase --help
kubeadm join phase --help
kubeadm reset phase --help

Alpha λειτουργίες

bash
kubeadm alpha --help

Οι Alpha λειτουργίες μπορούν να αλλάξουν ή να αφαιρεθούν. Μην τις θεωρείς σταθερή βάση για Production Runbooks.


35 / 50

36. kubelet και systemd

Το kubelet είναι ο Agent του Node. Σε εγκαταστάσεις kubeadm εκτελείται συνήθως ως υπηρεσία systemd και εκκινεί Static Pods από τον κατάλογο /etc/kubernetes/manifests.

Έλεγχος της υπηρεσίας

bash
sudo systemctl status kubelet
sudo systemctl is-enabled kubelet
sudo systemctl cat kubelet
sudo journalctl -u kubelet -n 200 --no-pager
sudo journalctl -u kubelet -f

Διαχείριση της υπηρεσίας

bash
sudo systemctl daemon-reload
sudo systemctl restart kubelet
sudo systemctl stop kubelet
sudo systemctl start kubelet

Έλεγχος του Configuration του kubelet

bash
sudo cat /var/lib/kubelet/config.yaml
sudo cat /var/lib/kubelet/kubeadm-flags.env
sudo cat /etc/default/kubelet 2>/dev/null || true
sudo cat /etc/sysconfig/kubelet 2>/dev/null || true

Άμεση κλήση του kubelet

bash
kubelet --help
kubelet --version

Η άμεση εκκίνηση του kubelet δεν είναι συνήθης στη λειτουργία ενός Cluster. Κανονικά ελέγχεις και διαχειρίζεσαι το kubelet μέσω systemd.

Έλεγχος συνηθισμένων σφαλμάτων του kubelet

bash
sudo journalctl -u kubelet -n 300 --no-pager | grep -Ei 'error|failed|certificate|cni|runtime|eviction'
crictl info
crictl ps -a
kubectl describe node <node>

36 / 50

37. Components του Control Plane: kube-apiserver, Scheduler, Controller Manager

Σε Clusters kubeadm τα Components του Control Plane εκτελούνται συνήθως ως Static Pods.

Εμφάνιση των Manifests των Static Pods

bash
sudo ls -la /etc/kubernetes/manifests
sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml
sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml
sudo cat /etc/kubernetes/manifests/kube-scheduler.yaml
sudo cat /etc/kubernetes/manifests/etcd.yaml

Έλεγχος των Pods του Control Plane

bash
kubectl get pods -n kube-system -o wide
kubectl describe pod -n kube-system kube-apiserver-<node>
kubectl logs -n kube-system kube-apiserver-<node> --tail=100
kubectl logs -n kube-system kube-controller-manager-<node> --tail=100
kubectl logs -n kube-system kube-scheduler-<node> --tail=100

kube-apiserver

bash
kube-apiserver --help
kubectl get --raw /readyz?verbose
kubectl get --raw /livez?verbose
kubectl get --raw /metrics | head

Σημαντικά θέματα για τον API Server είναι τα Certificates, οι Admission Controllers, το Authentication, το Authorization, τα Audit Logs, η σύνδεση με το etcd και τα Feature Gates.

kube-controller-manager

bash
kube-controller-manager --help
kubectl logs -n kube-system kube-controller-manager-<node> --tail=200

Ο Controller Manager περιέχει τους κεντρικούς Control Loops που συγκλίνουν την πραγματική κατάσταση προς την επιθυμητή.

kube-scheduler

bash
kube-scheduler --help
kubectl logs -n kube-system kube-scheduler-<node> --tail=200

Ο Scheduler επιλέγει Nodes για τα Pods. Τα σφάλματα Scheduling εμφανίζονται συχνά στα Pod Events και όχι μόνο στα Logs του Scheduler.


37 / 50

38. kube-proxy

Το kube-proxy υλοποιεί τους κανόνες δικτύωσης των Services. Ανάλογα με το Mode χρησιμοποιεί iptables, IPVS, nftables ή μηχανισμούς της εκάστοτε διανομής.

Έλεγχος του kube-proxy

bash
kubectl get daemonset kube-proxy -n kube-system
kubectl get pods -n kube-system -l k8s-app=kube-proxy -o wide
kubectl logs -n kube-system -l k8s-app=kube-proxy --tail=100
kubectl get configmap kube-proxy -n kube-system -o yaml

Άμεση εκτέλεση του Binary

bash
kube-proxy --help
kube-proxy --version

Έλεγχος των κανόνων Service σε Node

bash
sudo iptables-save | grep KUBE-SVC | head
sudo iptables-save | grep KUBE-SEP | head
sudo ipvsadm -Ln 2>/dev/null | head || true
sudo nft list ruleset 2>/dev/null | grep -i kube | head || true

Οι διαθέσιμες εντολές εξαρτώνται από το Mode του kube-proxy και το λειτουργικό σύστημα.


38 / 50

39. Container Runtime: crictl, ctr, nerdctl και Docker

crictl: βασικό εργαλείο για CRI Debugging

Το crictl επικοινωνεί με το Kubernetes Container Runtime Interface API. Για το Debugging ενός Node είναι συνήθως το καταλληλότερο εργαλείο.

Ρύθμιση του Endpoint

bash
sudo crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
sudo crictl config image-endpoint unix:///var/run/containerd/containerd.sock
sudo cat /etc/crictl.yaml

Για το CRI-O:

bash
sudo crictl --runtime-endpoint unix:///var/run/crio/crio.sock ps

Πληροφορίες Runtime

bash
sudo crictl info
sudo crictl version

Εμφάνιση Pods και Containers

bash
sudo crictl pods
sudo crictl pods -a
sudo crictl ps
sudo crictl ps -a
sudo crictl inspect <container-id>
sudo crictl inspectp <pod-id>

Logs και Exec

bash
sudo crictl logs <container-id>
sudo crictl logs --tail=100 <container-id>
sudo crictl exec -it <container-id> sh

Images

bash
sudo crictl images
sudo crictl pull <image>
sudo crictl rmi <image-id>
sudo crictl inspecti <image-id>

Διακοπή και αφαίρεση Containers

bash
sudo crictl stop <container-id>
sudo crictl rm <container-id>
sudo crictl rmp <pod-id>

Χρησιμοποίησε τις εντολές διακοπής και αφαίρεσης σε Kubernetes Containers μόνο για διαγνωστικούς σκοπούς. Το kubelet δημιουργεί ξανά τα Containers που διαχειρίζεται.

ctr: εγγενές εργαλείο του containerd

Το ctr επικοινωνεί απευθείας με το containerd και λειτουργεί σε χαμηλότερο επίπεδο από το crictl.

bash
sudo ctr version
sudo ctr namespaces list
sudo ctr -n k8s.io containers list
sudo ctr -n k8s.io tasks list
sudo ctr -n k8s.io images list
sudo ctr -n k8s.io snapshots list
sudo ctr -n k8s.io content ls

Τα Kubernetes Objects στο containerd βρίσκονται συνήθως στο Namespace k8s.io.

nerdctl

Το nerdctl παρέχει τρόπο χρήσης του containerd παρόμοιο με το Docker. Για Debugging του Kubernetes Runtime, το crictl είναι συνήθως καταλληλότερο επειδή εμφανίζει την κατάσταση μέσω του CRI.

bash
sudo nerdctl version
sudo nerdctl -n k8s.io ps
sudo nerdctl -n k8s.io images
sudo nerdctl -n k8s.io logs <container>
sudo nerdctl -n k8s.io inspect <container>

Docker

Στα σύγχρονα Kubernetes Clusters, το Docker δεν χρησιμοποιείται πλέον απευθείας ως Kubernetes Runtime. Οι εντολές Docker εξακολουθούν να είναι χρήσιμες για την τοπική δημιουργία Images.

bash
docker build -t <image> .
docker tag <image> <registry>/<image>:<tag>
docker push <registry>/<image>:<tag>
docker run --rm -it <image> sh
docker logs <container>
docker inspect <container>

Για Containers που εκκινούνται από το kubelet μέσω containerd ή CRI-O, χρησιμοποίησε crictl ps αντί για docker ps.


39 / 50

40. etcd, etcdctl και etcdutl

Το etcd αποθηκεύει την κατάσταση του Cluster. Οι εργασίες στο etcd είναι κρίσιμες. Πριν από αλλαγές χρειάζεσαι Backups, προγραμματισμένο χρονικό παράθυρο αλλαγής και σχέδιο Restore.

Έλεγχος του etcd Pod στο kubeadm

bash
kubectl get pods -n kube-system -l component=etcd -o wide
kubectl logs -n kube-system etcd-<node> --tail=100
sudo cat /etc/kubernetes/manifests/etcd.yaml

Περιβάλλον etcdctl για kubeadm

bash
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/healthcheck-client.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/healthcheck-client.key

Έλεγχος υγείας και κατάστασης των Endpoints

bash
sudo -E etcdctl endpoint health
sudo -E etcdctl endpoint status -w table
sudo -E etcdctl member list -w table

Δημιουργία Snapshot

bash
sudo -E etcdctl snapshot save /var/backups/etcd-snapshot.db
sudo -E etcdctl snapshot status /var/backups/etcd-snapshot.db -w table

Έλεγχος του Snapshot με etcdutl

bash
etcdutl snapshot status /var/backups/etcd-snapshot.db -w table

Επαναφορά Snapshot

bash
etcdutl snapshot restore /var/backups/etcd-snapshot.db --data-dir /var/lib/etcd-restore

Κατά την επαναφορά ενός Kubernetes Cluster, είναι σημαντικό να αυξάνεται το Revision ώστε οι Caches των Informers να μη χρησιμοποιούν δεδομένα από Revision που έχει μετακινηθεί προς τα πίσω:

bash
etcdutl snapshot restore /var/backups/etcd-snapshot.db \
  --bump-revision 1000000000 \
  --mark-compacted \
  --data-dir /var/lib/etcd-restore

Έλεγχος των Keys

bash
sudo -E etcdctl get / --prefix --keys-only | head
sudo -E etcdctl get /registry/namespaces --prefix --keys-only

Κατά την κανονική λειτουργία διάβαζε την κατάσταση του Kubernetes μέσω του API και όχι απευθείας από το etcd. Τα απευθείας Queries στο etcd χρησιμεύουν στη διάγνωση και στο Disaster Recovery.


40 / 50

41. Helm

Το Helm διαχειρίζεται Kubernetes Applications ως Charts και Releases.

Repositories

bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list
helm repo update
helm search repo nginx
helm repo remove bitnami

Έλεγχος ενός Chart

bash
helm show chart bitnami/nginx
helm show values bitnami/nginx
helm show readme bitnami/nginx
helm show crds <chart>
helm pull bitnami/nginx --untar

Έλεγχος και Render ενός Chart

bash
helm lint ./chart
helm template web ./chart -f values.yaml
helm template web ./chart -f values.yaml --debug
helm template web ./chart -n demo --include-crds

Εγκατάσταση και Upgrade

bash
helm install web ./chart -n demo --create-namespace
helm upgrade web ./chart -n demo -f values.yaml
helm upgrade --install web ./chart -n demo --create-namespace -f values.yaml
helm upgrade --install web ./chart -n demo --atomic --wait --timeout 5m
helm upgrade --install web ./chart -n demo --dry-run --debug

Το --atomic εκτελεί Rollback σε περίπτωση σφάλματος. Το --wait περιμένει να ικανοποιηθούν οι συνθήκες ετοιμότητας του Kubernetes στον βαθμό που μπορεί να τις ελέγξει το Helm.

Εμφάνιση Releases

bash
helm list -n demo
helm list -A
helm status web -n demo
helm history web -n demo

Ανάκτηση περιεχομένου ενός Release

bash
helm get values web -n demo
helm get values web -n demo --all
helm get manifest web -n demo
helm get hooks web -n demo
helm get notes web -n demo
helm get all web -n demo

Rollback και απεγκατάσταση

bash
helm rollback web 1 -n demo
helm uninstall web -n demo
helm uninstall web -n demo --keep-history

Εξαρτήσεις

bash
helm dependency list ./chart
helm dependency update ./chart
helm dependency build ./chart

Δημιουργία Package και OCI Registry

bash
helm package ./chart
helm registry login <registry>
helm push ./chart-0.1.0.tgz oci://<registry>/<repo>
helm pull oci://<registry>/<repo>/<chart> --version 0.1.0

Plugins του Helm

bash
helm plugin list
helm plugin install <plugin-url>
helm plugin update <plugin-name>
helm plugin uninstall <plugin-name>

41 / 50

42. Kustomize

Το Kustomize δημιουργεί Kubernetes Manifests από Bases και Overlays.

Kustomize ενσωματωμένο στο kubectl

bash
kubectl kustomize overlays/dev
kubectl apply -k overlays/dev
kubectl diff -k overlays/dev
kubectl delete -k overlays/dev

Αυτόνομο Binary του kustomize

bash
kustomize build overlays/dev
kustomize build overlays/prod > rendered.yaml
kustomize edit set image app=ghcr.io/example/app:1.2.3
kustomize edit set namespace demo
kustomize edit add resource deployment.yaml

Έλεγχος ενός τυπικού Overlay

bash
find overlays/dev -maxdepth 2 -type f -name 'kustomization.yaml' -print
kubectl kustomize overlays/dev | kubectl apply --dry-run=server -f -
kubectl kustomize overlays/dev | kubectl diff -f -

Generators για ConfigMaps και Secrets

bash
kustomize edit add configmap app-config --from-literal=LOG_LEVEL=info
kustomize edit add secret app-secret --from-literal=password=dummy

Μην αποθηκεύεις πραγματικά Secrets στο Git.


42 / 50

43. Τοπικά και ελαφριά Clusters: kind, minikube, k3d, k3s, k0s και Talos

Αυτά τα εργαλεία δεν αποτελούν μέρος του Kubernetes Core, αλλά χρησιμοποιούνται συχνά σε Workshops και Labs.

kind

bash
kind version
kind create cluster
kind create cluster --name workshop
kind get clusters
kind get kubeconfig --name workshop
kind load docker-image <image> --name workshop
kind export logs ./kind-logs --name workshop
kind delete cluster --name workshop

minikube

bash
minikube version
minikube start
minikube start --driver=docker
minikube status
minikube kubectl -- get pods -A
minikube addons list
minikube addons enable ingress
minikube service <service> -n <namespace>
minikube tunnel
minikube logs
minikube delete

k3d

bash
k3d version
k3d cluster create workshop
k3d cluster list
k3d kubeconfig get workshop
k3d image import <image> -c workshop
k3d cluster delete workshop

k3s

bash
sudo systemctl status k3s
sudo journalctl -u k3s -f
sudo k3s kubectl get nodes
sudo cat /etc/rancher/k3s/k3s.yaml

k0s

bash
k0s version
sudo k0s status
sudo k0s kubectl get nodes
sudo k0s kubeconfig admin
sudo systemctl status k0scontroller
sudo systemctl status k0sworker

Talos

bash
talosctl version
talosctl config endpoint <node-ip>
talosctl config node <node-ip>
talosctl health
talosctl kubeconfig .
talosctl service kubelet
talosctl logs kubelet
talosctl dmesg
talosctl dashboard

Το Talos δεν χρησιμοποιεί το κλασικό μοντέλο SSH ή Shell. Η διαχείρισή του γίνεται μέσω του talosctl.


43 / 50

44. Cloud Clusters: EKS, GKE και AKS

Τα Cloud CLIs συχνά δημιουργούν καταχωρίσεις kubeconfig. Έπειτα συνεχίζεις τη διαχείριση με kubectl.

AWS EKS

bash
aws eks list-clusters --region <region>
aws eks describe-cluster --name <cluster> --region <region>
aws eks update-kubeconfig --name <cluster> --region <region>
kubectl get nodes

Google GKE

bash
gcloud container clusters list --region <region>
gcloud container clusters get-credentials <cluster> --region <region> --project <project>
kubectl get nodes

Azure AKS

bash
az aks list -o table
az aks get-credentials --resource-group <resource-group> --name <cluster>
az aks get-credentials --resource-group <resource-group> --name <cluster> --overwrite-existing
kubectl get nodes

Τα δικαιώματα, τα μοντέλα δικτύου, οι LoadBalancers, οι StorageClasses και τα Managed Add-ons διαφέρουν σημαντικά ανά Cloud Provider. Έλεγχε πάντα την τεκμηρίωση του εκάστοτε Provider.


44 / 50

45. Εντολές για CNI, Service Mesh και Add-ons

Αυτές οι εντολές εξαρτώνται από τα εγκατεστημένα Add-ons.

Cilium

bash
cilium status
cilium version
cilium connectivity test
cilium sysdump
cilium config view
cilium policy get
hubble status
hubble observe
hubble observe --namespace demo

Calico

bash
calicoctl version
calicoctl get nodes
calicoctl get ippools
calicoctl get networkpolicy -A
calicoctl get globalnetworkpolicy
calicoctl get felixconfiguration default -o yaml

Istio

bash
istioctl version
istioctl proxy-status
istioctl analyze
istioctl x describe pod <pod> -n <namespace>
istioctl proxy-config clusters <pod> -n <namespace>
istioctl proxy-config listeners <pod> -n <namespace>
istioctl proxy-config routes <pod> -n <namespace>
istioctl proxy-config endpoints <pod> -n <namespace>

cert-manager

bash
kubectl get certificates -A
kubectl get certificaterequests -A
kubectl get issuers -A
kubectl get clusterissuers
kubectl describe certificate <certificate> -n <namespace>
kubectl describe certificaterequest <request> -n <namespace>
kubectl get challenges,orders -A

Argo CD CLI και προβολή μέσω kubectl

bash
argocd version
argocd login <server>
argocd app list
argocd app get <app>
argocd app sync <app>
argocd app diff <app>
argocd app history <app>

kubectl get applications -n argocd
kubectl describe application <app> -n argocd

Flux CLI

bash
flux version
flux check
flux get sources all -A
flux get kustomizations -A
flux get helmreleases -A
flux reconcile kustomization <name> -n <namespace>
flux reconcile source git <name> -n <namespace>

Krew και Plugins του kubectl

bash
kubectl plugin list
kubectl krew version
kubectl krew search
kubectl krew install ctx
kubectl krew install ns
kubectl krew install neat
kubectl krew update
kubectl krew upgrade

Τα Plugins είναι χρήσιμα, αλλά δεν είναι διαθέσιμα σε κάθε Cluster ή σε κάθε σταθμό διαχείρισης. Τα Runbooks πρέπει να παραμένουν κατανοητά και χωρίς μη απαραίτητα Plugins.


45 / 50

46. Βοηθητικές εντολές Linux για τη λειτουργία του Kubernetes

Αυτές οι εντολές εκτελούνται σε Nodes ή σε σταθμούς διαχείρισης.

systemd και Logs

bash
sudo systemctl status kubelet
sudo systemctl status containerd
sudo systemctl status crio
sudo journalctl -u kubelet -n 200 --no-pager
sudo journalctl -u containerd -n 200 --no-pager
sudo journalctl -u crio -n 200 --no-pager

Δίκτυο

bash
ip addr
ip route
ss -lntup
ss -antp | grep 6443
sudo iptables-save | grep -i kube
sudo nft list ruleset | grep -i kube
sudo ipvsadm -Ln
conntrack -L 2>/dev/null | head

DNS

bash
resolvectl status 2>/dev/null || true
cat /etc/resolv.conf
nslookup kubernetes.default.svc.cluster.local <cluster-dns-ip>
dig kubernetes.default.svc.cluster.local @<cluster-dns-ip>

Αρχεία και Mounts

bash
df -h
df -ih
mount | grep kubelet
findmnt | grep kubelet
sudo du -sh /var/lib/kubelet/* 2>/dev/null | sort -h
sudo du -sh /var/lib/containerd/* 2>/dev/null | sort -h

Έλεγχος Certificates

bash
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | less
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -subject -issuer

Διεργασίες

bash
ps aux | grep kubelet
ps aux | grep containerd
ps aux | grep kube-apiserver
sudo crictl ps -a

46 / 50

47. JSONPath, jq, yq, custom-columns και Templates

Παραδείγματα JSONPath

bash
kubectl get pods -n demo -o jsonpath='{.items[*].metadata.name}'
kubectl get pod <pod> -n demo -o jsonpath='{.status.phase}'
kubectl get pod <pod> -n demo -o jsonpath='{.spec.nodeName}'
kubectl get secret app-secret -n demo -o jsonpath='{.data.password}' | base64 -d; echo

Λίστα με αλλαγές γραμμής

bash
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'

custom-columns

bash
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,NODE:.spec.nodeName,PHASE:.status.phase'
kubectl get nodes -o custom-columns='NODE:.metadata.name,VERSION:.status.nodeInfo.kubeletVersion,RUNTIME:.status.nodeInfo.containerRuntimeVersion'

jq

bash
kubectl get pods -A -o json | jq '.items[] | {namespace: .metadata.namespace, name: .metadata.name, phase: .status.phase}'
kubectl get pods -A -o json | jq -r '.items[] | [.metadata.namespace, .metadata.name, .status.phase] | @tsv'

yq

bash
yq '.spec.template.spec.containers[].image' deployment.yaml
kubectl get deployment web -n demo -o yaml | yq '.spec.template.spec.containers[].image'

Template της Go

bash
kubectl get pods -A -o go-template='{{range .items}}{{.metadata.namespace}}{{"\t"}}{{.metadata.name}}{{"\n"}}{{end}}'

47 / 50

48. Οδηγίες Troubleshooting

Γρήγορη αρχική διάγνωση του Cluster

bash
kubectl config current-context
kubectl get nodes -o wide
kubectl get pods -A --field-selector=status.phase!=Running
kubectl get events -A --sort-by=.lastTimestamp | tail -100
kubectl get componentstatuses 2>/dev/null || true
kubectl get --raw /readyz?verbose

Pod σε κατάσταση Pending

bash
kubectl describe pod <pod> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl get nodes -o wide
kubectl describe nodes | grep -E 'Taints:|Allocatable:|Allocated resources:' -A10
kubectl get resourcequota,limitrange -n <namespace>

Συνήθεις αιτίες: ανεπαρκείς πόροι, Taints χωρίς αντίστοιχα Tolerations, ασυμφωνία NodeSelector ή Affinity, PVC χωρίς Binding ή εξάντληση Quota.

CrashLoopBackOff

bash
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --all-containers --previous
kubectl logs <pod> -n <namespace> --all-containers --tail=200
kubectl get pod <pod> -n <namespace> -o jsonpath='{.status.containerStatuses}'

Συνήθεις αιτίες: τερματισμός της διεργασίας, λανθασμένο Configuration, Secret που λείπει, υπερβολικά αυστηρό Probe, πρόβλημα δικαιωμάτων ή αποτυχία εκκίνησης του Container από το Image.

ImagePullBackOff ή ErrImagePull

bash
kubectl describe pod <pod> -n <namespace>
kubectl get secret -n <namespace>
kubectl get serviceaccount -n <namespace> <serviceaccount> -o yaml
kubectl get events -n <namespace> --sort-by=.lastTimestamp

Συνήθεις αιτίες: λανθασμένο όνομα Image, Tag που λείπει, μη προσβάσιμο Registry, ImagePullSecret που λείπει ή Rate Limit.

Service χωρίς Endpoints

bash
kubectl get svc <service> -n <namespace> -o yaml
kubectl get endpoints <service> -n <namespace> -o wide
kubectl get endpointslices -n <namespace> -l kubernetes.io/service-name=<service>
kubectl get pods -n <namespace> --show-labels
kubectl describe pod -n <namespace> -l <selector>

Συνήθεις αιτίες: λανθασμένος Selector, Pods που δεν είναι Ready, λανθασμένο όνομα Port ή Pods σε διαφορετικό Namespace.

Πρόβλημα DNS

bash
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
kubectl get configmap coredns -n kube-system -o yaml
kubectl run dns-test -n <namespace> --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default.svc.cluster.local

Το Ingress δεν δρομολογεί την κίνηση

bash
kubectl get ingress -A
kubectl describe ingress <ingress> -n <namespace>
kubectl get ingressclass
kubectl get svc,ep,endpointslice -n <namespace>
kubectl get pods -A | grep -i ingress
kubectl logs -n <ingress-namespace> <ingress-controller-pod> --tail=200

Το Gateway Route δεν λειτουργεί

bash
kubectl get gatewayclasses,gateway,httproute -A
kubectl describe gateway <gateway> -n <namespace>
kubectl describe httproute <route> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp

PVC Pending

bash
kubectl describe pvc <pvc> -n <namespace>
kubectl get storageclass
kubectl get pv
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl get pods -A | grep -i csi

Node NotReady

bash
kubectl describe node <node>
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
sudo systemctl status kubelet
sudo journalctl -u kubelet -n 300 --no-pager
sudo crictl info
sudo crictl ps -a

RBAC Forbidden

bash
kubectl auth can-i <verb> <resource> -n <namespace>
kubectl auth can-i <verb> <resource> -n <namespace> --as system:serviceaccount:<namespace>:<serviceaccount>
kubectl get role,rolebinding -n <namespace>
kubectl get clusterrole,clusterrolebinding | grep <name>

OOMKilled

bash
kubectl describe pod <pod> -n <namespace>
kubectl get pod <pod> -n <namespace> -o jsonpath='{.status.containerStatuses[*].lastState.terminated.reason}'
kubectl top pod <pod> -n <namespace> --containers
kubectl get pod <pod> -n <namespace> -o jsonpath='{.spec.containers[*].resources}'

Το Rollout έχει κολλήσει

bash
kubectl rollout status deployment/<deployment> -n <namespace> --timeout=60s
kubectl describe deployment <deployment> -n <namespace>
kubectl get rs,pods -n <namespace> -l app=<app>
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl logs deployment/<deployment> -n <namespace> --all-containers --tail=100

Ο API Server δεν είναι προσβάσιμος

bash
kubectl cluster-info
kubectl get --raw /readyz?verbose
curl -k https://<api-server>:6443/readyz
sudo crictl ps -a | grep kube-apiserver
sudo crictl logs <apiserver-container-id>
sudo journalctl -u kubelet -n 300 --no-pager

48 / 50

49. Checklists λειτουργίας

Πριν από μια αλλαγή

bash
kubectl config current-context
kubectl get namespace <namespace>
kubectl auth can-i patch deployments -n <namespace>
kubectl diff -f manifest.yaml
kubectl apply --dry-run=server -f manifest.yaml

Έλεγξε επίσης:

  • Είναι το σωστό Cluster;
  • Είναι το σωστό Namespace;
  • Υπάρχει σχέδιο Rollback;
  • Υπάρχει Backup αν επηρεάζονται δεδομένα;
  • Έχουν αποκλειστεί τα πραγματικά Secrets;
  • Επαρκούν τα PDBs και η διαθέσιμη χωρητικότητα;

Μετά από μια αλλαγή

bash
kubectl rollout status deployment/<deployment> -n <namespace> --timeout=120s
kubectl get pods -n <namespace> -o wide
kubectl get events -n <namespace> --sort-by=.lastTimestamp | tail -50
kubectl logs deployment/<deployment> -n <namespace> --all-containers --tail=100
kubectl get svc,ep,endpointslice -n <namespace>

Πριν από τη συντήρηση ενός Node

bash
kubectl get node <node> -o wide
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl get pdb -A
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=10m

Μετά τη συντήρηση ενός Node

bash
sudo systemctl restart kubelet
kubectl uncordon <node>
kubectl get node <node> -o wide
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50

Πριν από το Upgrade με kubeadm

bash
kubectl get nodes
kubectl get pods -A
kubectl get pdb -A
sudo kubeadm upgrade plan
sudo kubeadm certs check-expiration
sudo -E etcdctl endpoint health
sudo -E etcdctl snapshot save /var/backups/etcd-before-upgrade.db

Μετά το Upgrade με kubeadm

bash
kubectl get nodes -o wide
kubectl get pods -A
kubectl get --raw /readyz?verbose
kubectl top nodes
kubectl get events -A --sort-by=.lastTimestamp | tail -100

49 / 50

50. Πηγές και περαιτέρω αναφορές

50 / 50

K8S · Orthevs Academy

31 modules ως ενιαία διαδρομή μάθησης.

Η σειρά παραμένει αμετάβλητη: από τη βασική δομή του lab μέσω τεχνικών θεμελίων και λειτουργικών μοντέλων έως το τελικό troubleshooting. Τα τεχνικά ονόματα καταλόγων διατηρούνται σκόπιμα.

Orthevs – Η μηχανική ως βάση για όσα ακολουθούν.

Το Orthevs ως εφαρμογή

Εγκατάσταση του Orthevs

Η web app του Orthevs μπορεί να εγκατασταθεί σε υποστηριζόμενες κινητές συσκευές και browsers υπολογιστή.

iPhone και iPad

Ανοίξτε το Orthevs στο Safari. Πατήστε Κοινή χρήση και μετά Προσθήκη στην οθόνη αφετηρίας. Ενεργοποιήστε το Άνοιγμα ως web app, αν εμφανίζεται, και πατήστε Προσθήκη.

Android

Για τη web app, ανοίξτε το μενού του browser και επιλέξτε Εγκατάσταση εφαρμογής ή Προσθήκη στην αρχική οθόνη. Επιβεβαιώστε την εγκατάσταση.

Browser υπολογιστή

Ανοίξτε το μενού του browser ή το εικονίδιο εγκατάστασης στη γραμμή διευθύνσεων και επιλέξτε Εγκατάσταση εφαρμογής ή Προσθήκη στο Dock.

Η εγκατάσταση της web app εξαρτάται από τον browser. Αν δεν εμφανιστεί διάλογος εγκατάστασης, ακολουθήστε τα βήματα του browser που αναφέρονται παραπάνω.