我正在使用基于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
由于服务有自己的(库伯内特斯内部)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名称的语法可能无法工作,除非您知道特定的软件支持它。