Kubernetes'te ClusterIP, NodePort ve LoadBalancer hizmet türleri arasındaki fark nedir?


230

1 - Belgeleri okuyorum ve ifadelerle biraz kafam karıştı. Diyor ki:

ClusterIP : Hizmeti bir küme iç IP'sinde gösterir . Bu değerin seçilmesi, hizmete yalnızca kümenin içinden erişilmesini sağlar. Bu, varsayılan ServiceType

NodePort : Her Düğümün IP'sindeki hizmeti statik bir bağlantı noktasında (NodePort) gösterir. NodePort hizmetinin yönlendirileceği bir ClusterIP hizmeti otomatik olarak oluşturulur. İsteyerek, küme dışından NodePort hizmetine başvurabilirsiniz <NodeIP>:<NodePort>.

LoadBalancer : Bulut sağlayıcısının yük dengeleyicisini kullanarak hizmeti harici olarak sunar. Harici yük dengeleyicisinin yönlendirileceği NodePort ve ClusterIP hizmetleri otomatik olarak oluşturulur.

NodePort hizmet türü hala ClusterIPharici istemcilere açık olan farklı bir bağlantı noktasında mı kullanıyor? Yani bu durumda ile <NodeIP>:<NodePort>aynı <ClusterIP>:<NodePort>mı?

Ya da NodeIPaslında çalıştırdığınızda bulunan kubectl get nodesve ClusterIP hizmet türü için kullanılan sanal IP değil mi?

2 - Ayrıca aşağıdaki bağlantıdan şemada:

http://kubernetes.io/images/docs/services-iptables-overview.svg

Clientİçinde olmasının özel bir nedeni var mı Node? ClusterBir ClusterIP hizmet türü durumunda bir içinde olması gerektiğini düşündüm.

Aynı diyagram NodePort için çizilmiş, tamamen dışarıda hem müşteri çekmek için geçerli olacak Nodeve Clusterya tamamen noktayı kaçırıyorum?

Yanıtlar:


217

Bir KümeIP aşağıdakileri ortaya koyar:

  • spec.clusterIp:spec.ports[*].port

Bu hizmete yalnızca kümenin içindeyken erişebilirsiniz. spec.clusterIpBağlantı noktasından erişilebilir . A spec.ports[*].targetPortayarlanırsa, bağlantı noktasından targetPort'a yönlendirilir. Arama yaparken aldığınız CLUSTER-IP kubectl get services, kümede bu hizmete dahili olarak atanan IP'dir.

Bir NodePort aşağıdakileri ortaya koyar:

  • <NodeIP>:spec.ports[*].nodePort
  • spec.clusterIp:spec.ports[*].port

Bu hizmete düğümün harici IP'sinden bir nodePort üzerinden erişirseniz, istek yönlendirilir ve ayarlanırsa isteğinize spec.clusterIp:spec.ports[*].portyönlendirilir spec.ports[*].targetPort. Bu hizmete KümeIP ile aynı şekilde erişilebilir.

Düğüm IP'leriniz düğümlerin harici IP adresleridir. Hizmetinize adresinden erişemezsiniz <ClusterIP>:spec.ports[*].nodePort.

Bir LoadBalancer aşağıdakileri ortaya koyar:

  • spec.loadBalancerIp:spec.ports[*].port
  • <NodeIP>:spec.ports[*].nodePort
  • spec.clusterIp:spec.ports[*].port

Bu hizmete, yük dengeleyicinizin isteğinizi bir nodePort'a yönlendiren IP isteğinden erişebilirsiniz ve bu da isteği kümeIP bağlantı noktasına yönlendirir. Bu hizmete bir NodePort veya bir KümeIP hizmeti gibi erişebilirsiniz.


3
externalIPsBuradaki denklemi nasıl değiştirdiği hakkında yorum yapabilir misiniz ? Özellikle, externalIPsbir tür ClusterIPHizmete bir dizi atamak mümkündür ve daha sonra hizmet harici IP'den de erişilebilir hale gelir mi? Bunu bir NodePort üzerinden ne zaman seçersiniz?
Bosh

Soru hariciIP'lerden bahsetmiyor - muhtemelen en iyisi bunu yeni bir soru olarak göndererek size sunulacak.
kellanburket

39
Bu yazı aslında bu farklılıkları açıklığa kavuşturmak için resmi Kubernetes belgelerinin kendisinden daha yararlıdır.
adrpino

@kellanburket, bu nasıl çalışır: spec.clusterIp. ClusterIP, service.yaml dosyasında açıkça belirtilebilir. Ve benzer şekildespec.loadBalancerIp
samshers

Cevabımla günümü yaptın, çok teşekkür ederim! (bir yan not olarak, 2020'de hala ağ dokümantasyonu biraz belirsizdir)
user430191

103

Daha basit bir düzeyde 3 arasındaki farkı arayan herkese açıklık getirmek. Hizmetinizi en az ClusterIp (k8s kümesi içinde) veya NodePort (k8s kümesinin dışındaki küme içinde) veya LoadBalancer (harici dünya veya LB'nizde tanımladığınız herhangi bir şey) ile daha fazla maruz bırakabilirsiniz.

ClusterIp pozlama <NodePort pozlama <LoadBalancer pozlama

  • ClusterIp
    aracılığıyla hizmet Açığa K8S küme ileip/name:port
  • NodePort k8'lere harici dahili ağ VM'leri
    aracılığıyla hizmet sunmaip/name:port
  • LoadBalancer Harici dünya veya LB'nizde tanımladığınız her şey için
    hizmet sunun .

53

ClusterIP: Hizmetlere Küme'deki kapsüller / hizmetler tarafından erişilebilir
. Varsayılan ad alanında myservice adlı bir hizmet yaparsam: ClusterIP sonra hizmet için aşağıdaki öngörülebilir statik DNS adresi oluşturulur:

myservice.default.svc.cluster.local (veya sadece myservice.default veya varsayılan ad alanındaki kapsüller tarafından yalnızca "myservice" çalışır)

Ve bu DNS adı yalnızca küme içindeki kapsüller ve hizmetler tarafından çözümlenebilir.

NodePort: K8s Ana Bilgisayar Düğümlerine (ve kümedeki kapsüller / hizmetlere) ping atabilen aynı LAN'daki istemciler / istemciler tarafından erişilebilir (K8s ana bilgisayar düğümlerinizin özel bir alt ağda olması gerekir, dolayısıyla internetteki istemciler kazanır) Bu hizmete erişemiyorum)
3 Düğüm Kubernetes Kümesi üzerinde NodePort türünün mynamespace ad alanında mynodeportservice adlı bir hizmet yaparsam. Sonra bir tür Hizmet: KümeIP oluşturulur ve küme içindeki istemciler tarafından aşağıdaki öngörülebilir statik DNS adresinden erişilebilir:

mynodeportservice.mynamespace.svc.cluster.local (veya sadece mynodeportservice.mynamespace)

Mynodeportservice'in 30000 - 32767 aralığındaki bir düğüm noktasını dinlediği her bağlantı noktası için rasgele seçilecektir. Kümenin dışındaki dış istemciler, küme içinde varolan KümeIP hizmetini vurabilir. 3 K8s ana bilgisayar düğümümüzün 10.10.10.1, 10.10.10.2, 10.10.10.3 IP'lerine sahip olduğunu, Kubernetes hizmetinin 80 numaralı bağlantı noktasını dinlediğini ve rastgele seçilen Nodeport'un 31852 olduğunu söyleyelim.

olduğunu . Küme dışında bulunan bir istemci 10.10.10.1:31852, 10.10.10.2:31852 veya 10.10.10.3:31852 (NodePort her Kubernetes Ana Bilgisayar Düğümü tarafından dinlenirken) Kubeproxy, isteği mynodeportservice bağlantı noktası 80'e iletecektir.

LoadBalancer: Hizmetlere internete bağlı herkes erişebilir * (Ortak mimari L4'tür LB, bir DMZ'ye yerleştirerek veya hem özel hem de genel IP ve k8s ana bilgisayar düğümleri özel bir alt ağda yer alarak internette herkese açıktır)
( Not: Bu, çıplak metal Kubernetes gibi Kubernetes uygulamalarının% 100'ünde çalışmayan tek hizmet türüdür, Kubernetes'te bulut sağlayıcı entegrasyonları olduğunda çalışır.)

Mylbservice yaparsanız, bir L4 LB VM üretilir (bir küme IP hizmeti ve bir NodePort Hizmeti de örtülü olarak üretilir). Bu kez NodePort'umuz 30222'dir. Fikir, L4 LB'nin genel IP'si 1.2.3.4 olacak ve özel IP adresleri olan 3 K8s ana bilgisayar düğümüne denge yükleyecek ve trafiği iletecektir. (10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222) ve ardından Kube Proxy bunu küme içinde bulunan ClusterIP türünün hizmetine iletecektir.


Ayrıca sordunuz: NodePort hizmet türü hala KümeIP kullanıyor mu? Evet *
Yoksa NodeIP aslında kubectl get nodes çalıştırdığınızda IP bulundu mu? Ayrıca Evet *

Temel Bilgiler arasında bir paralel çizelim:
Bir kap, kapsülün içinde. bir bölme bir çoğaltma kümesinin içindedir. bir dağıtım bir dağıtım içinde.
Benzer şekilde:
KümeIP Hizmeti, NodePort Hizmetinin bir parçasıdır. NodePort Hizmeti, Yük Dengeleme Hizmetinin bir parçasıdır.


Gösterdiğiniz şemada, Müşteri kümenin içinde bir bölme olacaktır.


Takip sorularınıza dayanarak, trafiğin kümeye nasıl girdiğini bilmek istediğiniz izlenimindeydim. Eğer ilgilenirseniz, bu konuda bir soru-cevap yapma özgürlüğünü aldım. stackoverflow.com/questions/52241501/…
neokyle

1
Hey, gerçekten iyi bir açıklama, LoadBalancer'ı merak ediyorum. LoadBalancer herhangi bir trafiği bir NodeIP: NodePort'a (round robin içinde sonraki düğüm) iletir ve çağrı bu düğümde nasıl ilerler? Düğüm bağlantı noktası bunun bir hizmet çağrısı olduğunu ve bunu kube-proxy üzerinden hizmetin sanal IP'sine dağıtması gerektiğini nasıl biliyor? Kube-proxy ileriye basit bir bağlantı noktası yapacak mı?
ItFreak

kube-proxy 3 ana rol oynar: 1. düğümdeki iptables vbd hizmet istenen durumuna uygun hale getirerek hizmet var / çalışma yapmak. 2. pod hizmetine düğüm bağlantı noktası eşleme sorumludur (benim anlayış bunu iptables üzerinden yapar) + liman remapings 3. her bakla benzersiz bir ip olduğundan emin olun. Düğüm noktası 1 düğüme girebilir, her düğümün / hizmetin iptables'ında hizmet tanımları her düğümde bulunur, bölmeler genellikle sanallaştırılmış bir bindirme ağındadır ve düğümler yönlendirici olarak ikiye katlanır, bu nedenle trafik 1 düğüme girse de başka bir düğümde mevcut kapsüle yönlendirilir.
neokyle

Bunun bundan daha derin bir seviyede nasıl çalıştığını bilmek anlamsızdır, çünkü kubernet'ler modüler parçalardan yapılmıştır ve linux'un bazı kapsayıcı temalarla biraz farklı çalışan lezzetler / dağıtımlara sahip olması gibi, her k8s dağıtımı biraz farklıdır. Örnek cilium cni, kube-proxy'yi tamamen değiştirmek istiyor, bu da sahnelerin arkasında nasıl çalıştığı hareketli bir hedef olduğu için, projeye gerçekten katkıda bulunmadıkça / bir hatayı düzeltmeye çalışmadığınız sürece anlaşılmaya değmez.
neokyle

Sizinle iletişim kurmanın bir yolu var mı? K8'lerde güvenlik hakkında bir lisans tezi yazıyorum ve proxy'nin stajyer işlevleri hakkında bilgi edinmek isterim, örneğin IP adreslerini düğümlere ve kapsüllere nasıl dağıtır ve hizmetlerin sanal IP'lerini nasıl alır?
ItFreak

45

Yerel makinenizde bir Ubuntu VM oluşturduğunuzu varsayalım. IP adresi 192.168.1.104'tür .

VM'ye giriş yaptınız ve Kubernetes'i kurdunuz. Sonra nginx görüntüsünün üzerinde çalıştığı bir kapsül oluşturdunuz.

1- VM'nizdeki bu nginx kapsülüne erişmek istiyorsanız, söz konusu kapsüle bağlı bir KümeIP oluşturacaksınız :

$ kubectl expose deployment nginxapp --name=nginxclusterip --port=80 --target-port=8080

Daha sonra tarayıcınıza nginxclusterip'nin ip adresini 80 numaralı bağlantı noktasıyla yazabilirsiniz, örneğin:

http://10.152.183.2:80

2- Bu nginx kapsülüne ana makinenizden erişmek istiyorsanız, NodePort ile dağıtımınızı göstermeniz gerekecektir . Örneğin:

$ kubectl expose deployment nginxapp --name=nginxnodeport --port=80 --target-port=8080 --type=NodePort

Artık ana makinenizden nginx'e şu şekilde erişebilirsiniz:

http://192.168.1.104:31865/

Gösterge panelimde şu şekilde görünürler:

resim açıklamasını buraya girin

Aşağıda temel ilişkiyi gösteren bir şema bulunmaktadır.

resim açıklamasını buraya girin


31865 nereden geldi? üretildi mi?
HoaPhan

1
@HoaPhan 30000-32767 aralığındaki limanınızı açıkça belirtebilir veya bu aralıktaki Kubernetes tarafından rastgele seçilmesine izin verebilirsiniz
Mohammad Torkashvand

20

Bu sorunun zaten bir cevabı olsa bile, daha iyi bir anlayışa sahip olmak için başka bir soru daha sunacağım.

1. KümeIP , Kubernetes'teki varsayılan hizmet türüdür ve bu tür size küme içinde bir hizmet verir. Bunu kullanarak, kümedeki diğer uygulamalar Kubernetes proxy'si aracılığıyla hizmete erişebilir.

Bu tür hizmetlerin üretim hizmetlerini ortaya çıkarmak için kullanılmaması gerektiğini belirtmeliyim. Ancak,

  • hizmetler arasında hata ayıklama entegrasyonu;
  • işle ilgili olmayan verileri ortaya koyan dahili hizmetlere erişmek (izleme panoları).

İsteğin devam etmesi şu şekildedir: trafik -> K8s proxy -> K8s hizmeti (ClusterIP) -> kapsüller ve aşağıdaki resimde görüntülenir.

resim açıklamasını buraya girin

2. NodePort harici trafiği kabul etmenin ve bunu kubernetes hizmetlerine iletmenin en ilkel yoludur. Adından da anlaşılacağı gibi, NodePort hizmet türü, tüm Sanal Makinelerde, aslında Kubernetes düğümleri olan, belirli bir bağlantı noktasına gönderilen trafiğin hizmete iletilmesini sağlamak için belirli bir bağlantı noktası açar.

NodePort hizmet türünün bazı dezavantajları vardır:

  • her port için sadece bir servis gereklidir;
  • sanal makinenin ipi değişecekse, kümede bazı değişiklikler yapılması gerekir;
  • yalnızca 3000-32767 arasındaki bağlantı noktası kullanılabilir.

İsteğin yolu şudur: trafik -> sanal makinede görünen bağlantı noktası -> K8s hizmeti (NodePort) -> kapsüller ve aşağıdaki resimde görüntülenir:

resim açıklamasını buraya girin

3. LoadBalancer , bir servisi internete sunmanın standart yoludur. Arzunuz doğrudan bir hizmeti ve belirli bir bağlantı noktasındaki tüm trafiği, hizmete sunulacak şekilde göstermekse, bunu yapmanın yolu budur. Ayrıca, LoadBalancer hizmet türü herhangi bir filtreleme veya yönlendirme içermez. Ayrıca, ona TCP, UDP, HTTP gRPC trafiği gönderebilirsiniz.

Dezavantajı: Bir LoadBalancer aracılığıyla maruz kalan her hizmetin kendi IP adresi olacaktır ve her hizmet, pahalı hale gelebilecek tek bir LoadBalancer aracılığıyla açıklanacaktır.

İstek şu yola sahiptir: trafik -> LoadBalancer -> K8s Hizmeti -> bölmeler ve aşağıdaki resimde görüntülenir.

resim açıklamasını buraya girin


7
  1. clusterIP: Kümenin içinden IP erişilebilir (d kümesindeki düğümler arasında).
nodeA : pod1 => clusterIP1, pod2 => clusterIP2
nodeB : pod3 => clusterIP3.

pod3, puster1 ile kümeIP ağı üzerinden konuşabilir.

  1. nodeport: bölmeleri nodeIP: nodeport aracılığıyla küme dışından erişilebilir hale getirmek için, clusterIP'i kümeIP ağı olarak yukarıda oluşturur / saklar.
nodeA => nodeIPA : nodeportX
nodeB => nodeIPB : nodeportX

pod1 hizmetine nodeIPA: nodeportX VEYA nodeIPB: nodeportX üzerinden erişebilirsiniz. Her iki şekilde de çalışır, çünkü kube-proxy (her bir düğüme yüklenir) isteğinizi alır ve clusterIP ağını kullanarak düğümlere [yönlendir (iptables terimi)] dağıtır.

  1. Yük dengeleyici

temel olarak LB'yi öne koyarak, gelen trafiğin nodeIPA: nodeportX ve nodeIPB: nodeportX'e dağıtılması için yukarıdaki işlem akış numarası 2 ile devam edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.