Kubernetes hizmeti, atanan bağlantı noktasından farklı bağlantı noktasında yanıt veriyor
Birkaç hizmet dağıttım ve bir hizmetin diğerlerinden farklı davrandığını gördüm. Onu 8090 bağlantı noktasını dinleyecek şekilde yapılandırdım (dahili olarak 8443 ile eşleşir), ancak istek yalnızca 8080 bağlantı noktasından gönderirsem çalışır. İşte hizmet için yaml dosyam (esaslara indirgenmiştir) ve hizmeti kapsayan bir dağıtım var ve konteyner
apiVersion: v1
kind: Service
metadata:
name: uisvc
namespace: default
labels:
helm.sh/chart: foo-1
app.kubernetes.io/name: foo
app.kubernetes.io/instance: rb-foo
spec:
clusterIP: None
ports:
- name: http
port: 8090
targetPort: 8080
selector:
app.kubernetes.io/component: uisvc
Dümeni kurduktan sonra çalıştırdığımda kubectl get svc
aşağıdaki çıktıyı alıyorum
fooaccess ClusterIP None <none> 8888/TCP 119m
fooset ClusterIP None <none> 8080/TCP 119m
foobus ClusterIP None <none> 6379/TCP 119m
uisvc ClusterIP None <none> 8090/TCP 119m
Ancak, çalışan diğer konteynerlerden birine ssh attığımda ve 8090'da bir curl isteği yaptığımda, "Bağlantı reddedildi" mesajı alıyorum. "Http: // uisvc: 8080" ile kıvrılırsam, doğru yanıtı alıyorum. Konteyner, varsayılan olarak 8080'i dinleyen bir yaylı önyükleme uygulaması çalıştırıyor. Bulabildiğim tek açıklama, bağlantı noktası / targetPort'un bir şekilde bu yapılandırmada göz ardı edilmesi ve diğer bölmelerin içerideki yay hizmetine doğrudan ulaşması.
Bu davranış doğru mu? Neden 8090'da dinlemiyor? Nasıl bu şekilde çalıştırmalıyım?
Düzenleme: Çıktı kubectl describe svc uisvc
Name: uisvc
Namespace: default
Labels: app.kubernetes.io/instance=foo-rba
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=rba
helm.sh/chart=rba-1
Annotations: meta.helm.sh/release-name: foo
meta.helm.sh/release-namespace: default
Selector: app.kubernetes.io/component=uisvc
Type: ClusterIP
IP: None
Port: http 8090/TCP
TargetPort: 8080/TCP
Endpoints: 172.17.0.8:8080
Session Affinity: None
Events: <none>
Yanıtlar
Bu, kullandığınızdan beri beklenen bir davranıştır headless service
.
Başsız Hizmetleri servis keşif mekanizması böylece yerine tek döndürmek için kullanılacak DNS A records
, DNS server
çoklu dönecektir A records
bireysel bölmelerin IP o sırtları hizmet için hizmet için her işaret. Böylece, basit bir DNS A records
arama yapar ve hizmetin parçası olan tüm bölmelerin IP'sini alırsınız.
Yana headless service
yaratmaz iptables
kuralları ancak yaratır dns records
yerine, kendi pod yerine bir proxy ile doğrudan etkileşime girebilir. Yani eğer çözerseniz <servicename:port>
, alacaksınız <podN_IP:port>
ve ardından bağlantınız doğrudan bölmeye gidecek. Tüm bunlar aynı ad alanında olduğu sürece, tam DNS adıyla çözemezsiniz.
Birkaç bölmeyle, DNS size hepsini verir ve yalnızca rastgele sıraya (veya RR sırasına göre) yerleştirir. Sıra, DNS sunucusu uygulamasına ve ayarlarına bağlıdır.
Daha fazla okumak için lütfen şu adresi ziyaret edin:
- Hizmetler-netowrking / headless-services
- Başsız hizmetlerin nasıl çalıştığını açıklayan harika yanıtlı bu yığın soru