Kube-dns服务发现无法发现服务的端口号

时间:2019-01-20 12:24:28

标签: kubernetes google-kubernetes-engine kube-dns

我正在使用基于DNS的服务发现来发现K8s集群中的服务。 从this链接很明显,要发现名为my-service的服务,我们可以将其命名为“ my-service.my-ns”,并且pod可以找到该服务。

但是,如果发现服务端口,则使用该解决方案 是“ _http._tcp.my-service.my-ns” 在哪里

_http是指my-service中名为http的端口。

但是即使使用_http._tcp.my-service后,它也无法解析端口号。下面是详细信息。

需要发现的我的服务

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-service
  ports:
    - name: http
      protocol: TCP
      port: 5000
      targetPort: 5000

客户端服务Yaml代码段试图发现我的服务及其端口。

spec:
  containers:
  - name: client-service
    image: client-service
    imagePullPolicy: Always
    ports:
      - containerPort: 7799
    resources:
      limits:
        cpu: "100m"
        memory: "500Mi"
    env:
    - name: HOST
      value: my-service
    - name: PORT
      value: _http._tcp.my-service

现在,当我发出请求时,它失败并记录以下请求,这显然是错误的,因为它没有发现端口号。

 http://my-service:_http._tcp.my-service

我不确定我在做什么错,但是我遵循的是文档中提到的相同说明。

有人可以建议这里有什么问题吗,以及我们如何使用基于DNS的服务发现来发现端口?我的理解是否错误,因为它将返回端口的字面值?

集群详细信息

K8s集群版本为1.11.5-gke.5  并且Kube-dns正在运行

试图从busybox发现服务且无法发现端口值5000的其他详细信息

kubectl exec  busybox -- nslookup my-service
Server:         10.51.240.10
Address:        10.51.240.10:53

Name:   my-service.default.svc.cluster.local
Address: 10.51.253.236

*** Can't find my-service.svc.cluster.local: No answer
*** Can't find my-service.cluster.local: No answer
*** Can't find my-service.us-east4-a.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.google.internal: No answer
*** Can't find my-service.default.svc.cluster.local: No answer
*** Can't find my-service.svc.cluster.local: No answer
*** Can't find my-service.cluster.local: No answer
*** Can't find my-service.us-east4-a.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.google.internal: No answer


kubectl exec  busybox -- nslookup _http._tcp.my-service
Server:         10.51.240.10
Address:        10.51.240.10:53

** server can't find _http._tcp.my-service: NXDOMAIN

*** Can't find _http._tcp.my-service: No answer

1 个答案:

答案 0 :(得分:2)

由于服务带有其自己的(Kubernetes内部)IP地址,因此这里的简单答案是不要为服务选择任意端口。在服务定义中更改为port: 80,客户端将可以使用默认的HTTP端口访问它。设置环境变量时,设置

- name: PORT
  value: "80"

DNS支持几种不同的记录类型;例如,一条A记录将主机名转换为其IPv4地址,将AAAA转换为IPv6地址。您引用的Kubernetes服务文档(重点是我的内容)

  

您可以执行 DNS SRV查询 ...以发现"http"的端口号。

尽管SRV records似乎解决了这个问题的两半(它们为服务提供了端口和主机名),但实际上他们似乎很少使用。链接的Wikipedia页面上有使用它的服务列表,但是在我所知道的主流TCP客户端中,“连接到此SRV记录所指向的内容”并不是一个选择。

您应该可以使用(运行this debugging image)之类的命令进行验证

kubectl run debug --rm -it --image giantswarm/tiny-tools sh
# dig -t srv _http._tcp.my-service

(但是请注意-t srv参数;它不是默认的记录类型。)

大多数期望使用PORT环境变量或类似变量的事物都期望使用数字,如果没有,则期望可以在/etc/services文件中找到的名称。除非您知道特定的软件支持该语法,否则您将在此处尝试使用该语法并尝试提供DNS SRV名称的语法将不起作用。