如何通过查询DNS srv记录获取kubernetes容器的IP地址?

时间:2019-06-11 09:50:52

标签: kubernetes kubernetes-pod kube-dns kubernetes-jobs srv-record

我正在尝试创建一个kubernetes作业,在其中运行“ dig srv”查询,以查找同一集群上运行的任何特定服务的所有Pod的IP地址。

这可以实现吗?

我想详细说明问题陈述。群集上已在运行一些服务。要求是要有一个能够接受服务名称并列出属于该服务的所有Pod的IP地址的工具。

我能够通过使用kubectl命令以及选择器和jq工具来做到这一点。但是由于某些原因,不允许在此环境中运行kubectl命令。

我想使用dig srv查询来解析提供的服务名称的pod IP。

2 个答案:

答案 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记录返回。