如何为集群外的查询公开 kube-dns 服务?
How to expose kube-dns service for queries outside cluster?
我正在尝试公开 "kube-dns" 服务,以便在 Kubernetes 集群之外进行查询。为此,我编辑了 "Service" 定义,将 "type" 从 "ClusterIP" 更改为 "NodePort",这似乎工作正常。
但是,当我尝试查询节点端口时,我能够获得 TCP 会话(使用 Telnet 进行测试),但似乎无法从 DNS 服务器获得任何响应(使用 dig 进行测试)。
我查看了 "kube-dns" Pod 上每个容器的日志,但没有发现任何异常。此外,从集群内(从 运行 容器)查询 DNS 似乎没有任何问题。
有没有人试过暴露kube-dns服务?如果是这样,是否有任何额外的设置步骤或您对我有任何调试建议?
服务定义如下:
$ 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: {}
你查询的是tcp端口还是udp端口?
我将我的 kube-dns 更改为 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
然后从集群外部查询 udp 端口,一切正常:
$ 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
目前,Kubernetes 不允许 NodePort 服务为 tcp 和 udp 共享同一个端口(参见问题 #20092)。这使得像 DNS 这样的东西有点古怪。
编辑:该错误已在 Kubernetes 1.3 中修复。
我正在尝试公开 "kube-dns" 服务,以便在 Kubernetes 集群之外进行查询。为此,我编辑了 "Service" 定义,将 "type" 从 "ClusterIP" 更改为 "NodePort",这似乎工作正常。
但是,当我尝试查询节点端口时,我能够获得 TCP 会话(使用 Telnet 进行测试),但似乎无法从 DNS 服务器获得任何响应(使用 dig 进行测试)。
我查看了 "kube-dns" Pod 上每个容器的日志,但没有发现任何异常。此外,从集群内(从 运行 容器)查询 DNS 似乎没有任何问题。
有没有人试过暴露kube-dns服务?如果是这样,是否有任何额外的设置步骤或您对我有任何调试建议?
服务定义如下:
$ 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: {}
你查询的是tcp端口还是udp端口?
我将我的 kube-dns 更改为 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
然后从集群外部查询 udp 端口,一切正常:
$ 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
目前,Kubernetes 不允许 NodePort 服务为 tcp 和 udp 共享同一个端口(参见问题 #20092)。这使得像 DNS 这样的东西有点古怪。
编辑:该错误已在 Kubernetes 1.3 中修复。