我正在尝试创建一个kubernetes作业,在其中运行“ dig srv”查询,以查找同一集群上运行的任何特定服务的所有Pod的IP地址。
这可以实现吗?
我想详细说明问题陈述。群集上已在运行一些服务。要求是要有一个能够接受服务名称并列出属于该服务的所有Pod的IP地址的工具。
我能够通过使用kubectl命令以及选择器和jq工具来做到这一点。但是由于某些原因,不允许在此环境中运行kubectl命令。
我想使用dig srv
查询来解析提供的服务名称的pod IP。
答案 0 :(得分:0)
这在DNS for Services and Pods中有解释。
为群集中定义的每个服务(包括DNS服务器本身)分配一个DNS名称。默认情况下,客户端Pod的DNS搜索列表将包含Pod自己的名称空间和群集的默认域。最好通过示例来说明:
在Kubernetes命名空间
foo
中假设一个名为bar
的服务。在命名空间bar
中运行的Pod可以通过对foo
进行DNS查询来查找此服务。在命名空间quux
中运行的Pod可以通过对foo.bar
进行DNS查询来查找此服务。
这是Kubernetes DNS-Based Service Discovery的详细文档。
对于查询POD
ip地址,取决于是否指定了spec.hostname
。
如果在与Pod相同的名称空间中存在无头服务,并且与子域具有相同的名称,则群集的KubeDNS服务器还将为Pod的全限定主机名返回A记录。例如,给定一个Pod,该Pod的主机名设置为“
busybox-1
”,子域设置为“default-subdomain
”,并且在同一名称空间中使用名为“default-subdomain
”的无头服务,该Pod将其自己的FQDN视为“busybox-1.default-subdomain.my-namespace.svc.cluster.local
”。 DNS以该名称提供A记录,指向Pod的IP。 “busybox1
”和“busybox2
”两个窗格可以有各自不同的A记录。Endpoints对象可以为任何端点地址及其IP指定
hostname
。注意:由于未为Pod名称创建A记录,因此创建Pod的A记录需要
hostname
。没有hostname
但带有subdomain
的Pod只会创建无头服务(default-subdomain.my-namespace.svc.cluster.local
)的A记录,指向Pod的IP地址。另外,除非在服务上设置了publishNotReadyAddresses=True
,否则Pod需要准备好进行记录。
希望这足以说明问题。
答案 1 :(得分:0)
您可以使用无头服务(因此,没有ClusterIP,也没有内部负载平衡)。如果提供选择器,则可以查询服务的A记录。
请参阅:https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
考虑以下示例:
部署一些吊舱:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16
ports:
- containerPort: 80
为此部署添加了以下无头服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
现在可以使用DNS(在群集内部)查询此问题
$ kubectl run shell -i --rm --tty --restart=Never --image=busybox
# nslookup -type=A nginx
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: nginx.default.svc.cluster.local
Address: 10.34.0.2
Name: nginx.default.svc.cluster.local
Address: 10.42.0.2
Name: nginx.default.svc.cluster.local
Address: 10.46.0.1
所有内部Pod IP均作为DNS A记录返回。