kube-dns服务发现无法发现服务的端口号
Kube-dns service discovery cannot discover port number of service
我正在使用基于 DNS 的服务发现来发现 K8s 集群中的服务。
从 this link 很明显,要发现名为 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 的服务发现来发现端口吗?我的理解是错误的,它将 return 端口的字面值?
集群详细信息
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 看起来他们解决了这个问题的两半(他们为服务提供端口和主机名),但实际上他们似乎很少使用。链接的维基百科页面有一个使用它的服务列表,但 "connect to the thing this SRV record points at" 不是我所知道的主流 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 名称的语法可能行不通,除非您知道特定软件支持它。
我正在使用基于 DNS 的服务发现来发现 K8s 集群中的服务。 从 this link 很明显,要发现名为 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 的服务发现来发现端口吗?我的理解是错误的,它将 return 端口的字面值?
集群详细信息
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 看起来他们解决了这个问题的两半(他们为服务提供端口和主机名),但实际上他们似乎很少使用。链接的维基百科页面有一个使用它的服务列表,但 "connect to the thing this SRV record points at" 不是我所知道的主流 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 名称的语法可能行不通,除非您知道特定软件支持它。