2016-05-25 25 views
5

Sto tentando di esporre il servizio "kube-dns" per essere disponibile per essere interrogato all'esterno del cluster Kubernetes. Per fare questo ho modificato la definizione "Servizio" per cambiare "tipo" da "ClusterIP" a "NodePort" che sembrava funzionare bene.Come esporre il servizio kube-dns per query al di fuori del cluster?

Tuttavia, quando provo a interrogare sulla porta del nodo, sono in grado di ottenere una sessione TCP (test con Telnet) ma non riesco a ottenere alcuna risposta dal server DNS (test con dig).

Ho dato un'occhiata ai registri su ciascuno dei contenitori sul Pod "kube-dns" ma non vedo nulla di negativo. Inoltre, l'interrogazione del DNS all'interno del cluster (da un contenitore in esecuzione) sembra funzionare senza problemi.

Qualcuno ha provato a esporre il servizio kube-dns in precedenza? In tal caso, ci sono dei passaggi di installazione aggiuntivi o hai qualche consiglio per il debug?

La definizione di servizio è la seguente:

$ kubectl get service kube-dns -o yaml --namespace kube-system 
apiVersion: v1 
kind: Service 
metadata: 
... 
spec: 
    clusterIP: 10.0.0.10 
    ports: 
    - name: dns 
    nodePort: 31257 
    port: 53 
    protocol: UDP 
    targetPort: 53 
    - name: dns-tcp 
    nodePort: 31605 
    port: 53 
    protocol: TCP 
    targetPort: 53 
    selector: 
    k8s-app: kube-dns 
    sessionAffinity: None 
    type: NodePort 
status: 
    loadBalancer: {} 

risposta

2

Stai l'interrogazione sulla porta TCP o la porta UDP?

ho cambiato Kube-dns per essere un servizio NodePort:

$ kubectl describe services kube-dns --namespace kube-system 
Name:   kube-dns 
Namespace:  kube-system 
Labels:   k8s-app=kube-dns 
      kubernetes.io/cluster-service=true 
      kubernetes.io/name=KubeDNS 
Selector:  k8s-app=kube-dns 
Type:   NodePort 
IP:   10.171.240.10 
Port:   dns 53/UDP 
NodePort:  dns 30100/UDP 
Endpoints:  10.168.0.6:53 
Port:   dns-tcp 53/TCP 
NodePort:  dns-tcp 30490/TCP 
Endpoints:  10.168.0.6:53 
Session Affinity: None 

e poi interrogato sulla porta UDP al di fuori del cluster e tutto sembrava funzionare:

$ dig -p 30100 @10.240.0.4 kubernetes.default.svc.cluster.local 

; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> -p 30100 @10.240.0.4 kubernetes.default.svc.cluster.local 
; (1 server found) 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45472 
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 

;; QUESTION SECTION: 
;kubernetes.default.svc.cluster.local. IN A 

;; ANSWER SECTION: 
kubernetes.default.svc.cluster.local. 30 IN A 10.171.240.1 

;; Query time: 3 msec 
;; SERVER: 10.240.0.4#30100(10.240.0.4) 
;; WHEN: Thu May 26 18:27:32 UTC 2016 
;; MSG SIZE rcvd: 70 

questo momento , Kubernetes non consente ai servizi NodePort di condividere la stessa porta per tcp & udp (vedere Numero #20092). Ciò rende questo un po 'funky per qualcosa come DNS.

MODIFICA: il bug è stato risolto in Kubernetes 1.3.

+0

Infatti, l'interrogazione della porta UDP funziona come previsto. Grazie per questo! Insetto interessante. – srkiNZ84

+0

Sì. Un caso trascurato quando i servizi NodePort sono stati progettati. Sono contento che abbia funzionato per te. –

+0

Il bug è stato corretto in Kubernetes 1.3. – iTayb