提问者:小点点

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


我正在使用基于DNS的服务发现来发现K8s集群中的服务。从这个链接可以清楚地看出,要发现一个名为my-service的服务,我们可以进行名称查找“my-service.my”,pod应该能够找到服务。

然而,在端口发现服务的情况下,解决方案是使用"_http._tcp.my-service.my-ns",其中

_http指的是my-service中名为超文本传输协议的端口。

但是即使使用_http_tcp.my服务后,它也不能解析端口号。下面是详细信息。

我的服务需要被发现

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

客户端服务yaml片段试图发现my-service及其端口。

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个答案

匿名用户

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

- name: PORT
  value: "80"

DNS支持几种不同的记录类型;例如,A记录将主机名转换为其IPv4地址,将AAAA转换为IPv6地址。

您可以执行DNSSRV查询…来查找"超文本传输协议"的端口号。

虽然SRV记录似乎解决了这个问题的两半(它们为服务提供了一个端口和一个主机名),但实际上它们似乎很少有用。链接的维基百科页面有一个使用它的服务列表,但是“连接到这个SRV记录指向的东西”在我所知道的主流TCP客户端中不是一个选项。

您应该能够使用类似于(运行此调试映像)的命令来验证这一点

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

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

大多数需要PORT环境变量或类似变量的东西都需要一个数字,或者如果没有,他们可以在/etc/services文件中找到一个名称。您在这里尝试使用并尝试提供一个DNSSRV名称的语法可能无法工作,除非您知道特定的软件支持它。