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

标签 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 之后,它也无法解析端口号。以下是详细信息。

需要被发现的my-service

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

client-service 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

最佳答案

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

- name: PORT
  value: "80"

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

you can do a DNS SRV query ... to discover the port number for "http".

同时SRV records似乎他们解决了这个问题的两部分(他们为服务提供了端口和主机名),但实际上他们似乎没有什么用处。链接的维基百科页面有一个使用它的服务列表,但据我所知,“连接到此 SRV 记录指向的对象”并不是主流 TCP 客户端的选项。

您应该能够使用类似(运行 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 名称的语法可能行不通,除非您知道特定软件支持它。

关于kubernetes - kube-dns服务发现无法发现服务的端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54276406/

相关文章:

go - Helm go sdk 从外部位置安装图表

kubernetes - 如何在Windows Server 2019上安装Kubernetes?

https - 如何使用 GKE 和 kube-lego 在 Gitlab Auto DevOps 上制作 SSL/HTTPS 证书

kubernetes - 在专用节点池上调度 kube-dns

docker - 如何修复 namespace [non-default-namespace] 中名称为 [spark-wordcount-driver] 的种类 [pod] 的错误“操作 [get] 失败”

kubernetes - 当 kubernetes cron 作业 pod 被 "replace"并发策略终止时,它的关闭是什么样子的?

Kubernetes, active 探测失败,但 Pod 处于运行状态

docker - 无法从谷歌计算引擎实例运行 gcloud docker push

kubernetes - RabbitMQ 管理 - 加载队列或交换时出现 404

kubernetes - kube-dns 不断在 coreos 上使用 kubernetes 重新启动