1. Báza znalostí
  2. Cloud a servery
  3. Kontajnery
  4. Kubernetes
  5. Kubernetes – 8. Sieť – Ingress a Egress

Kubernetes – 8. Sieť – Ingress a Egress

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.

Chcete si vytvoriť vlastný Kubernetes (K8s) klaster? Vyskúšajte si ho vo Virtuálnom dátovom centre od Websupportu.

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

Hľadáte manažovaný Kubernetes? Využite služby našich skúsených profesionálov na cloud native – radi vám pripravíme riešnie na mieru.

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

Aktualizované 14. júna 2022

Bol pre vás tento návod nápomocný?

Mohlo by vás tiež zaujímať:

Spýtajte sa nás, radi poradíme
Po - Ne 8:00-22:00
Kontaktovať podporu