2

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

这是可以实现的吗?

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

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

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

4

2 回答 2

1

您可以使用无头服务(因此没有 ClusterIP 也没有内部负载平衡)。如果提供选择器,则可以查询服务的 A 记录。

请参阅:https ://kubernetes.io/docs/concepts/services-networking/service/#headless-services

考虑以下示例:

部署一些 pod:

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

于 2019-06-11T11:08:17.347 回答
0

这在DNS for Services 和 Pods中进行了解释。

集群中定义的每个服务(包括 DNS 服务器本身)都被分配了一个 DNS 名称。默认情况下,客户端 Pod 的 DNS 搜索列表将包括 Pod 自己的命名空间和集群的默认域。最好通过示例来说明这一点:

假设 foo 在 Kubernetes 命名空间中 命名了一个服务bar。在命名空间中运行的 Pod bar 可以通过简单地对 foo. 在命名空间中运行的 Pod quux 可以通过对 foo.bar.

这是Kubernetes 基于 DNS 的服务发现的详细文档。

至于查询PODip地址,就看是否spec.hostname指定了。

如果在与 Pod 相同的命名空间中存在与子域同名的无头服务,则集群的 KubeDNS Server 也会返回一条 A 记录,用于记录 Pod 的完全限定主机名。例如,给定一个 Pod,其主机名设置为“<code>busybox-1”,子域设置为“<code>default-subdomain”,以及同一个命名空间中名为“<code>default-subdomain”的无头服务,该 pod 会将其自己的 FQDN 视为“<code>busybox-1.default-subdomain.my-namespace.svc.cluster.local”。DNS 以该名称提供一条 A 记录,指向 Pod 的 IP。“<code>busybox1”和“<code>busybox2”两个 pod 都可以有各自不同的 A 记录。

Endpoints 对象可以指定 hostname 任何端点地址及其 IP。

注意: 由于不是为 Pod 名称创建 hostname A 记录,因此需要创建 Pod 的 A 记录。一个没有 hostname 但 有的 Podsubdomain 只会为无头服务 ( default-subdomain.my-namespace.svc.cluster.local) 创建 A 记录,指向 Pod 的 IP 地址。此外,除非在服务上设置,否则 Pod 需要准备好才能有记录 publishNotReadyAddresses=True

希望这足以解释。

于 2019-06-11T11:08:04.043 回答