Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes Kube dns服务发现无法发现服务的端口号_Kubernetes_Google Kubernetes Engine_Kube Dns - Fatal编程技术网

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

Kubernetes Kube dns服务发现无法发现服务的端口号,kubernetes,google-kubernetes-engine,kube-dns,Kubernetes,Google Kubernetes Engine,Kube Dns,我正在使用基于DNS的服务发现来发现K8s集群中的服务。 从链接中可以很清楚地看到,要发现名为my service的服务,我们可以进行名称查找“my service.my ns”,pod应该能够找到这些服务 但是,在服务的端口发现情况下,解决方案是使用 是“\u http.\u tcp.my service.my ns” 在哪里 _http是指我的服务中名为http的端口 但即使使用了_http._tcp.my-service,它也无法解析端口号。详情如下 需要查找的我的服务 apiVersio

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

但是,在服务的端口发现情况下,解决方案是使用 是“\u http.\u tcp.my service.my ns” 在哪里

_http是指我的服务中名为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

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

- name: PORT
  value: "80"
DNS支持几种不同的记录类型;例如,A记录将主机名转换为其IPv4地址,将AAAA转换为IPv6地址。您引用的Kubernetes服务文档注释(我的重点)

您可以执行DNS SRV查询。。。查找
“http”
的端口号

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

您应该能够使用类似(running)的命令来验证这一点

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


大多数需要
端口
环境变量或类似变量的东西都需要一个数字,如果没有,则需要一个可以在
/etc/services
文件中找到的名称。除非您知道特定的软件支持,否则您尝试在此处使用的语法以及尝试提供DNS SRV名称可能不会起作用。

kubectl exec-it busybox/bin/bash | nslookup my service
肯定不能满足您的需要;(a) busybox没有
bash
(b)该命令正在您的机器上运行
nslookup
,而不是busybox Pod(c)该语法绝对疯狂,因为您正在将bash的输出传输到
nslookup
命令中感谢@MatthewLDaniel指出错误。最初我试着使用正确的语法,但在编写问题的过程中,不知何故我犯了这个错误。我现在已经改正了。我提到的仍然是busybox的例子是为了获得更多的信息,以消除任何关于坏yaml配置可能性的猜测,你能现在撤销你的否决票吗?我认为它的内容现在是有效的。谢谢你解释它背后的概念。这真的很有帮助。
kubectl run debug --rm -it --image giantswarm/tiny-tools sh
# dig -t srv _http._tcp.my-service