Exposing Services in Kubernetes
Postoje različiti načini izlaganja usluga u Kubernetesu tako da ih mogu pristupiti kako interni tako i eksterni endpointi. Ova konfiguracija Kubernetesa je prilično kritična jer administrator može omogućiti pristup napadačima uslugama do kojih ne bi trebali imati pristup.
Automatsko nabrojavanje
Pre nego što počnete nabrojavati načine na koje K8s omogućava izlaganje usluga javnosti, znajte da ako možete izlistati namespace-ove, usluge i ingress-e, možete pronaći sve što je izloženo javnosti pomoću:
ClusterIP
ClusterIP servis je podrazumevani Kubernetes servis. Pruža vam servis unutar vašeg klastera kojem drugi programi unutar klastera mogu pristupiti. Nema spoljnog pristupa.
Međutim, ovome se može pristupiti korišćenjem Kubernetes Proxy-ja:
Sada možete navigirati kroz Kubernetes API kako biste pristupili uslugama koristeći ovu šemu:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Na primer, možete koristiti sledeći URL:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
da pristupite ovoj usluzi:
Ova metoda zahteva da pokrenete kubectl
kao autentifikovanog korisnika.
NodePort
Kada se koristi NodePort, određeni port je dostupan na svim čvorovima (koji predstavljaju virtuelne mašine). Saobraćaj usmeren ka ovom specifičnom portu se zatim sistematski preusmerava na servis. Ova metoda se obično ne preporučuje zbog svojih nedostataka.
Primer specifikacije NodePort-a:
Ako ne navedete nodePort u yaml (to je port koji će biti otvoren), koristiće se port u opsegu 30000-32767.
LoadBalancer
Izlaže Servis spolja koristeći load balancer cloud provajdera. Na GKE, ovo će pokrenuti Network Load Balancer koji će vam dati jednu IP adresu koja će preusmeravati sav saobraćaj ka vašem servisu.
Morate platiti za LoadBalancer po izloženom servisu, što može biti skupo.
ExternalName
Iz dokumentacije: Servisi tipa ExternalName mapiraju Servis na DNS ime, a ne na tipični selektor kao što su my-service
ili cassandra
. Ove Servise definišete sa parametrom spec.externalName
.
Na primer, ovaj definisani Servis mapira my-service
Servis u prod
namespace-u na my.database.example.com
:
Kada se pretražuje host my-service.prod.svc.cluster.local
, DNS usluga klastera vraća CNAME
zapis sa vrednošću my.database.example.com
. Pristupanje my-service
radi na isti način kao i ostale usluge, ali sa ključnom razlikom da preusmeravanje se dešava na nivou DNS-a, umesto putem proksiranja ili prosleđivanja.
Spoljni IP-ovi
Saobraćaj koji ulazi u klaster sa spoljnim IP-om (kao odredišni IP), na portu usluge, će biti usmeren ka jednom od krajnjih tačaka usluge. externalIPs
nisu upravljani od strane Kubernetes-a i odgovornost je administratora klastera.
U specifikaciji usluge, externalIPs
mogu biti navedeni zajedno sa bilo kojim od ServiceTypes
. U primeru ispod, "my-service
" može biti pristupljen od strane klijenata na "80.11.12.10:80
" (externalIP:port
)
Ingress
Za razliku od svih prethodnih primera, Ingress NIJE vrsta servisa. Umesto toga, on se nalazi ispred više servisa i deluje kao "pametni ruter" ili ulaz u vaš klaster.
Možete uraditi mnogo različitih stvari sa Ingress-om, i postoje mnoge vrste kontrolera Ingress-a koji imaju različite mogućnosti.
Podrazumevani GKE kontroler Ingress-a će pokrenuti HTTP(S) Load Balancer za vas. To će vam omogućiti rutiranje na osnovu putanje i poddomena ka pozadinskim servisima. Na primer, možete poslati sve sa foo.yourdomain.com na servis foo, a sve ispod putanje yourdomain.com/bar/ na servis bar.
YAML za Ingress objekat na GKE sa L7 HTTP Load Balancer može izgledati ovako:
Reference
Last updated