Έργο projet11-kubernetes-services · όλες οι εντολές για ανάπτυξη, έκθεση και δοκιμή των Services.
Από τον φάκελο του έργου (projet11-kubernetes-services):
kubectl config use-context docker-desktop
docker build -t demo-k8s:1.0 ./app # (αν δεν έχει ήδη κατασκευαστεί στο έργο 10)
kubectl apply -f k8s/ # deployment + 3 services
kubectl get pods # 3 Pods Runningkubectl get svc # TYPE, CLUSTER-IP, EXTERNAL-IP, PORT(S)
kubectl get svc -o wide
kubectl describe svc demo-clusterip # λεπτομέρειες + EndpointsΑνάγνωση του kubectl get svc:
| Στήλη | Σημασία |
|---|---|
TYPE | ClusterIP / NodePort / LoadBalancer |
CLUSTER-IP | Εσωτερική IP (πάντα παρούσα) |
EXTERNAL-IP | Εξωτερική IP (LoadBalancer) ή <none> |
PORT(S) | port του Service (και :nodePort για NodePort) |
Ένα ClusterIP δεν είναι προσβάσιμο από τον οικοδεσπότη: το καλούμε από ένα Pod, με το όνομά του.
# Προσωρινό Pod πελάτη (--rm : διαγράφεται στην έξοδο)
kubectl run client --rm -it --image=curlimages/curl -- shΈπειτα, στο κέλυφος του Pod:
curl http://demo-clusterip # κλήση ΜΕ ΟΝΟΜΑ (επιλύεται από το CoreDNS)
curl http://demo-clusterip # ξανατρέξτε : το όνομα του Pod αλλάζει
exitΔοκιμή της επίλυσης DNS:
kubectl run dnstest --rm -it --image=busybox:1.36 -- sh
# μέσα στο Pod :
nslookup demo-clusterip
wget -qO- http://demo-clusteripkubectl get svc demo-nodeport
# Άνοιγμα στον περιηγητή :
start http://localhost:30082
# ή δοκιμή από τη γραμμή εντολών :
curl http://localhost:30082kubectl get svc demo-lb # το EXTERNAL-IP πρέπει να γίνει "localhost"
start http://localhost:8090
curl http://localhost:8090Αν το
EXTERNAL-IPμείνει<pending>, περιμένετε μερικά δευτερόλεπτα (το Docker Desktop προμηθεύει τον LB). Σε σύμπλεγμα kind, ο τύπος LoadBalancer μένει<pending>χωρίς MetalLB: χρησιμοποιήστεkubectl port-forward(βλ. παράρτημα).
kubectl get endpoints demo-clusterip # IP των Pods πίσω από το Service
kubectl get pods -o wide --show-labels # ετικέτες των Pods
kubectl get pods --selector app=demo-back # ίδια Pods με τον επιλογέα του ServiceΠροβολή της κατανομής (10 αιτήματα μέσω port-forward):
kubectl port-forward svc/demo-clusterip 8091:80
# σε ΑΛΛΟ τερματικό :
1..10 | ForEach-Object { (Invoke-WebRequest -Headers @{Accept="application/json"} http://localhost:8091).Content }kubectl delete -f k8s/
# ή ανά αντικείμενο :
kubectl delete svc demo-clusterip demo-nodeport demo-lb
kubectl delete deployment demo-back| Σύμπτωμα | Πιθανή αιτία | Λύση |
|---|---|---|
Το curl http://demo-clusterip αποτυγχάνει | Όχι από ένα Pod, ή υπηρεσία απόυσα | Κλήση από ένα Pod· επαληθεύστε kubectl get svc |
| Κενά Endpoints | Ο επιλογέας δεν αντιστοιχεί σε καμία ετικέτα Pod | Ευθυγραμμίστε selector (Service) και labels (Pods) |
EXTERNAL-IP σε <pending> | Χωρίς εξισορροπητή φορτίου (kind, μη διαμορφωμένο νέφος) | Docker Desktop: περιμένετε· αλλιώς kubectl port-forward |
localhost:30082 απρόσιτο | NodePort μη δημιουργημένο / θύρα κατειλημμένη | kubectl get svc demo-nodeport· αλλάξτε το nodePort |
ImagePullBackOff | Εικόνα demo-k8s:1.0 απόυσα από το σύμπλεγμα | Κατασκευάστε την· σε kind: kind load docker-image demo-k8s:1.0 |
# Καθολική λύση προσωρινής πρόσβασης σε οποιοδήποτε Service :
kubectl port-forward svc/demo-clusterip 8091:80 # -> http://localhost:8091Μάθημα δημιουργημένο από τον Dr. Haythem REHOUMA — Ανάπτυξη και ανάπτυξη λύσεων δεδομένων