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