2016-05-25 10 views
5

Ich versuche, den "kube-dns" -Service verfügbar zu machen, um außerhalb des Kubernetes-Clusters abgefragt zu werden. Um dies zu tun, habe ich die "Service" -Definition bearbeitet, um "Typ" von "ClusterIP" zu "NodePort" zu ändern, was gut zu funktionieren schien.Wie wird der kube-dns-Dienst für Abfragen außerhalb des Clusters verfügbar gemacht?

Wenn ich jedoch versuche, auf dem Node-Port abzufragen, bin ich in der Lage, eine TCP-Sitzung zu erhalten (Test mit Telnet), kann aber keine Antwort vom DNS-Server bekommen (Test mit dig).

Ich habe die Logs auf jedem der Container auf dem "kube-dns" Pod durchgesehen, kann aber nichts Ungewöhnliches sehen. Darüber hinaus scheint das Abfragen des DNS innerhalb des Clusters (von einem aktiven Container) ohne Probleme zu funktionieren.

Hat jemand versucht, den kube-dns-Dienst vorher zu entlarven? Wenn ja, gibt es zusätzliche Einrichtungsschritte oder haben Sie einen Debugging-Tipp für mich?

Die Service-Definition lautet wie folgt:

$ 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: {} 

Antwort

2

Sind Sie auf dem TCP-Port oder den UDP-Port abfragen?

änderte ich meinen kube-dns ein NodePort Dienst zu sein:

$ 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 

und abgefragt dann auf dem UDP-Port von außerhalb des Clusters und alles schien zu funktionieren:

$ 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 

Gerade jetzt , Kubernetes erlaubt NodePort-Diensten nicht, den gleichen Port für TCP & UDP zu teilen (siehe Problem #20092). Das macht das ein wenig funky für etwas wie DNS.

EDIT: Der Fehler wurde in Kubernetes 1.3 behoben.

+0

Tatsächlich funktioniert die Abfrage des UDP-Ports wie erwartet. Danke für das! Interessanter Fehler. – srkiNZ84

+0

Yup. Ein übersehener Fall, als NodePort-Dienste entworfen wurden. Froh, dass das für dich funktioniert hat. –

+0

Der Bug wurde in Kubernetes 1.3 behoben. – iTayb