V predošlom diele sme ukázali, ako nasadený deployment aktualizovať bez akéhokoľvek výpadku. Tiež sme demonštrovali, ako sa v prípade chyby vrátiť do bodu, kedy všetko fungovalo správne – a to bez potreby reštartovania či vypnutia servera.
V tomto diele nastavíme pravidlá, podľa ktorých budú medzi sebou pody komunikovať, a tiež ako budú komunikovať s inými sieťami. Všetko za pomoci štítkov (labels) a možnosti druhu NetworkPolicy. Predstavíme si spôsob komunikácie typu ingress (smerom do podu) a egress (smerom von z podu).
Mažeme nepotrebné služby a nasadenia
Pred tým, ako budeme pokračovať, vymažeme nepotrebné služby (services) a nasadenia (deployments), aby sme Kubernetes Cluster zbytočne nezaťazovali. Najskôr vypíšeme zoznam spustených služieb (prvý riadok) a aktívnych nasadení (druhý riadok) na VPS master
:
kubectl get services
kubectl get deployments
Potom nepotrebné služby (prvý riadok) a nasadenia (druhý riadok) na VPS master
zmažeme (tu je nepotrebná služba nazvaná nginx-service
a nepotrebné nasadenie nginx-deployment
):
kubectl delete service nginx-service
kubectl delete deployment nginx-deployment
Vytvárame pod so sieťovou politikou Ingress
Nasadíme pod s názvom hello-web
so štítkom app-destination-pod
a spustíme službu, na ktorej povolíme prichádzajúcu komunikáciu cez port 8080:
kubectl run hello-web --labels app=destination-pod --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
Overíme, či sa nasadil pod s názvom hello-web
a či sa spustila služba s názvom hello-web
:
kubectl get pod | grep hello-web
kubectl get service | grep hello-web
Nasadíme ešte jeden pod s názvom test-1
a so štítkom app=unknown
, z ktorého sa pripojíme na pod s názvom hello-web
:
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
Zobrazí sa príkazový riadok, v ktorom budeme komunikovať s podom hello-web
:
wget -qO- --timeout=2 http://hello-web:8080
Komunikácia prebehla úspešne. Môžeme ukončiť prácu s príkazovým riadkom podu test-1
:
exit
Dvakrát stlačíme klávesovú skratku Ctrl + C
a vymažeme pod s názvom test-1
:
kubectl delete pod test-1
Teraz nasadíme sieťovú politiku, podľa ktorej sa už nebude dať pripojiť na pod s názvom hello-web
z iného podu, ktorý nemá štítok app=destination-pod
. Vytvoríme súbor s názvom pod-ingress.yaml
(prvý riadok), do ktorého zapíšeme definíciu sieťovej politiky (ostatné riadky):
nano ~/pod-ingress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: destination-pod-allow-from-source-pod
spec:
policyTypes:
- Ingress
podSelector:
matchLabels:
app: destination-pod
ingress:
- from:
- podSelector:
matchLabels:
app: source-pod
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Sieťovú politiku nasadíme z vyššie vytvoreného konfiguračného súboru:
kubectl create -f ~/pod-ingress.yaml
Teraz opäť spustíme pod, ktorý nemá sieťovou politikou povolený štítok (tu app=unknown
):
kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1
Ak teraz opäť do príkazového riadku novovytvoreného podu zadamé pokus o komunikáciu s podom hello-web, komunikácia nebude úspešná:
wget -qO- --timeout=2 http://hello-web:8080
Môžeme ukončiť prácu s príkazovým riadkom podu test-1
:
exit
Dvakrát stlačíme klávesovú skratku Ctrl + C
a vymažeme pod s názvom test-1
:
kubectl delete pod test-1
Ak však teraz spustíme pod, ktorý bude mať sieťovou politikou povolený štítok app=source-pod
, komunikácia už úspešná bude:
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-1
Do príkazového riadku zadáme pokus o pripojenie na pod hello-web a zistíme, že komunikácia bola úspešná:
wget -qO- --timeout=2 http://hello-web:8080
Môžeme ukončiť prácu s príkazovým riadkom podu test-1
:
exit
Dvakrát stlačíme klávesovú skratku Ctrl + C
a vymažeme pod s názvom test-1
:
kubectl delete pod test-1
Zároveň vymažeme sieťovú politiku Ingress:
kubectl delete networkpolicy destination-pod-allow-from-source-pod
Vytvárame pod so sieťovou politikou Egress
Nasadíme pod s názvom hello-web
so štítkom app-destination-pod
a spustíme službu, na ktorej povolíme prichádzajúcu komunikáciu cez port 8080
:
kubectl run hello-web-2 --labels app=hello-2 --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
Overíme, či sa nasadil pod s názvom hello-web-2
a či sa spustila služba s názvom hello-web-2
:
kubectl get pod | grep hello-web-2
kubectl get service | grep hello-web-2
Nasadíme ešte jeden pod s názvom test-2
a so štítkom app=source-pod
, z ktorého sa pripojíme na pod s názvom hello-web-2
:
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-2
Zobrazí sa príkazový riadok, v ktorom budeme komunikovať s podom hello-web-2
:
wget -qO- --timeout=2 http://hello-web-2:8080
Komunikácia prebehla úspešne. Môžeme ukončiť prácu s príkazovým riadkom podu test-2
:
exit
Dvakrát stlačíme klávesovú skratku Ctrl + C
a vymažeme pod s názvom test-2
:
kubectl delete pod test-2
Teraz nasadíme sieťovú politiku, podľa ktorej sa už nebude dať pripojiť na pod s názvom hello-web-2
z iného podu, ktorý nemá štítok app=source-pod
. Vytvoríme súbor s názvom pod-egress.yaml
(prvý riadok), do ktorého zapíšeme definíciu sieťovej politiky (ostatné riadky):
nano ~/pod-egress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: source-pod-allow-to-destination-pod
spec:
policyTypes:
- Egress
podSelector:
matchLabels:
app: source-pod
egress:
- to:
- podSelector:
matchLabels:
app: destination-pod
- ports:
- port: 53
protocol: TCP
- port: 53
protocol: UDP
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Sieťovú politiku nasadíme z vyššie vytvoreného konfiguračného súboru:
kubectl create -f ~/pod-egress.yaml
Teraz vytvoríme pod s názvom test-3
a so štítkom app=source-pod
(prvý riadok), z ktorého sa pokúsime spojiť s podom hello-web-2
(druhý riadok):
kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-3
wget -qO- --timeout=2 http://hello-web-2:8080
Komunikácia v tomto prípade prebehla neúspešne, pretože pod hello-web-2
podľa sietovej politiky egress nemôže byť kontaktovaný nodom, ktorý nemá štítok app=destination-pod
.
Môžeme ukončiť prácu s príkazovým riadkom podu test-3
:
exit
Dvakrát stlačíme klávesovú skratku Ctrl + C
a vymažeme pod s názvom test-3
:
kubectl delete pod test-3
Zároveň vymažeme sieťovú politiku Ingress:
kubectl delete networkpolicy source-pod-allow-to-destination-pod
Zhrnutie
V tomto diele sme nastavili pravidlá, podľa ktorých budú medzi sebou pody komunikovať, a tiež ako budú komunikovať s inými sieťami. Všetko za pomoci štítkov (labels) a možnosti druhu NetworkPolicy – konkrétne spôsob komunikácie typu ingress (smerom do podu) a egress (smerom von z podu).