1 - Czytam dokumentację i jestem nieco mylony z brzmieniem. To mówi:
ClusterIP : udostępnia usługę pod wewnętrznym adresem IP klastra. Wybranie tej wartości sprawia, że usługa jest dostępna tylko z poziomu klastra. Jest to domyślny typ usługi
NodePort : Odsłania usługę na adresie IP każdego węzła w porcie statycznym (NodePort). Usługa ClusterIP, do której będzie kierowana usługa NodePort, jest tworzona automatycznie. Będziesz mógł skontaktować się z usługą NodePort spoza klastra, wysyłając zapytanie
<NodeIP>:<NodePort>
.LoadBalancer : Odsłania usługę zewnętrznie za pomocą modułu równoważenia obciążenia dostawcy chmury. Usługi NodePort i ClusterIP, do których będzie kierowany zewnętrzny moduł równoważenia obciążenia, są tworzone automatycznie.
Czy typ usługi NodePort nadal korzysta z ClusterIP
innego portu, ale jest otwarty dla klientów zewnętrznych? Więc w tym przypadku jest <NodeIP>:<NodePort>
to samo co <ClusterIP>:<NodePort>
?
A może NodeIP
faktycznie znajduje się adres IP podczas uruchamiania, kubectl get nodes
a nie wirtualny adres IP używany dla typu usługi ClusterIP?
2 - Również na schemacie z linku poniżej:
http://kubernetes.io/images/docs/services-iptables-overview.svg
Czy jest jakiś konkretny powód, dla którego Client
jest w środku Node
? Cluster
Zakładam, że będzie musiał znajdować się w przypadku usługi typu ClusterIP.
Jeśli ten sam schemat został narysowany dla NodePort, czy poprawne byłoby narysowanie klienta całkowicie poza Node
i Cluster
czy całkowicie brakuje mi sensu?
źródło
externalIPs
zmienia się tutaj równanie? W szczególności można przypisaćexternalIPs
tablicę do usługiClusterIP
typu, a następnie usługa stanie się dostępna również na zewnętrznym adresie IP? Kiedy wybrałbyś to zamiast NodePort?spec.clusterIp
. Czy ClusterIP można wyraźnie wymienić w service.yaml. I podobniespec.loadBalancerIp
Wyjaśnienie dla każdego, kto szuka różnicy między 3 na prostszym poziomie. Możesz udostępnić swoją usługę przy minimalnym ClusterIp (w klastrze k8s) lub większym ekspozycji za pomocą NodePort (w klastrze zewnętrznym w klastrze k8s) lub LoadBalancer (świat zewnętrzny lub cokolwiek zdefiniowano w LB).
Ekspozycja ClusterIp <Ekspozycja NodePort <Ekspozycja LoadBalancer
Expose za pośrednictwem klastra k8s przy pomocy
ip/name:port
Expose przez maszynę wirtualną sieci wewnętrznej również zewnętrzną wobec k8s
ip/name:port
Expose przez świat zewnętrzny lub cokolwiek zdefiniowano w LB.
źródło
ClusterIP: Usługi są osiągalne przez pods / usługi w klastrze
Jeśli utworzę usługę o nazwie myservice w domyślnej przestrzeni nazw typu: ClusterIP, to zostanie utworzony następujący przewidywalny statyczny adres DNS dla usługi:
I tę nazwę DNS można rozwiązać tylko za pomocą zasobników i usług w klastrze.
NodePort: Usługi są dostępne dla klientów w tej samej sieci LAN / klientach, którzy mogą pingować węzły hosta K8s (i pods / usługi w klastrze) (uwaga dla bezpieczeństwa twoje węzły hosta K8s powinny znajdować się w prywatnej podsieci, dlatego klienci w Internecie wygrywają nie będzie w stanie uzyskać
dostępu do tej usługi) Jeśli wykonam usługę o nazwie mynodeportservice w przestrzeni nazw mynamespace typu: NodePort w 3-węzłowym klastrze Kubernetes. Następnie zostanie utworzona usługa typu: ClusterIP i będzie ona dostępna dla klientów w klastrze pod następującym przewidywalnym statycznym adresem DNS:
Dla każdego portu, który mynodeportservice nasłuchuje na porcie węzłowym w zakresie 30000 - 32767, zostanie losowo wybrany. Aby klienci zewnętrzni spoza klastra mogli trafić do usługi ClusterIP, która istnieje w klastrze. Powiedzmy, że nasze 3 węzły hosta K8 mają adresy IP 10.10.10.1, 10.10.10.2, 10.10.10.3, usługa Kubernetes nasłuchuje na porcie 80, a losowo wybrany Nodeport to 31852.
Klient, który istnieje poza klastrem, może odwiedzić 10.10.10.1:31852, 10.10.10.2:31852 lub 10.10.10.3:31852 (jak nasłuchuje NodePort przez każdy węzeł hosta Kubernetes) Kubeproxy przekaże żądanie do portu 80 mynodeportservice.
LoadBalancer: Usługi są dostępne dla wszystkich podłączonych do Internetu * (wspólna architektura to L4 LB jest publicznie dostępny w Internecie, umieszczając go w strefie DMZ lub nadając mu zarówno prywatny, jak i publiczny adres IP, a węzły hosta K8s są w prywatnej podsieci)
( Uwaga: jest to jedyny typ usługi, który nie działa w 100% implementacjach Kubernetes, takich jak Kubernetes od zera, działa, gdy Kubernetes ma integracje z dostawcą chmury.)
Jeśli wykonasz mylbservice, zostanie odrodzona maszyna wirtualna L4 LB (usługa IP klastra, a także usługa NodePort). Tym razem naszym węzłem NodePort jest 30222. Idea polega na tym, że L4 LB będzie miał publiczny adres IP 1.2.3.4 i załaduje równowagę i przekaże ruch do 3 węzłów hosta K8, które mają prywatne adresy IP. (10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222), a następnie Kube Proxy prześle go do usługi typu ClusterIP, która istnieje wewnątrz klastra.
Zapytałeś również: Czy typ usługi NodePort nadal korzysta z ClusterIP? Tak *
Czy NodeIP faktycznie znajduje adres IP po uruchomieniu kubectl get nodes? Również Tak *
Narysujmy równolegle Podstawy:
Pojemnik znajduje się w kapsule. kapsuła znajduje się w replice. replika znajduje się we wdrożeniu.
Podobnie:
usługa ClusterIP jest częścią usługi NodePort. Usługa NodePort jest częścią usługi modułu równoważenia obciążenia.
Na pokazanym diagramie klient będzie kapsułą wewnątrz klastra.
źródło
Załóżmy, że utworzyłeś Ubuntu VM na swoim komputerze lokalnym. Jego adres IP to 192.168.1.104 .
Zaloguj się do VM i zainstalowałeś Kubernetes. Następnie utworzyłeś kapsułę, na której działa obraz Nginx.
1- Jeśli chcesz uzyskać dostęp do tego urządzenia Nginx wewnątrz maszyny wirtualnej, utworzysz ClusterIP powiązany z tym urządzeniem na przykład:
Następnie w przeglądarce możesz wpisać adres IP nginxclusterip z portem 80, na przykład:
http://10.152.183.2:80
2- Jeśli chcesz uzyskać dostęp do tego urządzenia Nginx z komputera hosta, musisz ujawnić swoje wdrożenie za pomocą NodePort . Na przykład:
Teraz z komputera hosta możesz uzyskać dostęp do nginx, takich jak:
http://192.168.1.104:31865/
Na moim pulpicie są one wyświetlane jako:
Poniżej znajduje się schemat pokazujący podstawową zależność.
źródło
Nawet jeśli to pytanie ma już odpowiedź, przedstawię jeszcze jedno, może jeszcze kilka zdjęć, aby lepiej zrozumieć.
1. ClusterIP to domyślny typ usługi w Kubernetes i ten typ zapewnia usługę wewnątrz klastra. Dzięki temu inne aplikacje z klastra mogą uzyskać dostęp do usługi za pośrednictwem serwera proxy Kubernetes.
Powinienem wspomnieć, że tego rodzaju usług nie należy wykorzystywać do udostępniania usług produkcyjnych. Można go jednak użyć do
Sposób realizacji żądania jest następujący: ruch -> serwer proxy K8s -> usługa K8s (ClusterIP) -> zasobniki i jest wyświetlany na poniższym obrazku.
2. NodePort jest najbardziej prymitywnym sposobem na akceptację ruchu zewnętrznego i przekazanie go do usług kubernetes. Jak sama nazwa wskazuje, typ usługi NodePort otwiera określony port na wszystkich maszynach wirtualnych, które w rzeczywistości są węzłami Kubernetes, aby umożliwić przesyłanie ruchu do tego konkretnego portu do usługi.
Typ usługi NodePort ma kilka wad:
Sposób realizacji tego żądania jest następujący: ruch -> port udostępniony na maszynie wirtualnej -> usługa K8s (NodePort) -> zasobniki i jest wyświetlany na poniższym obrazku:
3. LoadBalancer to standardowy sposób na ujawnienie usługi w Internecie. Jeśli pragniesz bezpośrednio ujawnić usługę i cały ruch na określonym porcie, który ma zostać przekazany do usługi, to jest to sposób, aby to zrobić. Ponadto typ usługi LoadBalancer nie wymaga żadnego filtrowania ani routingu. Ponadto możesz wysyłać do niego ruch TCP, UDP, HTTP gRPC.
Wada: każda usługa ujawniona za pośrednictwem LoadBalancer będzie miała własny adres IP, a każda usługa zostanie ujawniona za pośrednictwem jednego LoadBalancer, co może stać się kosztowne.
Żądanie ma następującą ścieżkę: ruch -> LoadBalancer -> Usługa K8s -> zasobniki i jest wyświetlane na poniższym obrazku.
źródło
pod3 może rozmawiać z pod1 za pośrednictwem sieci klastrIPIP.
możesz uzyskać dostęp do usługi na pod1 albo przez nodeIPA: nodeportX LUB nodeIPB: nodeportX. Tak czy inaczej, zadziała, ponieważ kube-proxy (zainstalowany w każdym węźle) otrzyma twoje żądanie i roześle je [przekieruje (termin iptables)] między węzłami za pomocą sieci klasterIP.
po prostu umieszczając LB na pierwszym planie, aby ruch przychodzący był rozprowadzany do węzła IPA: nodeportX i węzła IPB: nodeportX, a następnie kontynuuj przepływ procesu nr 2 powyżej.
źródło