如何从其他 pod 中解析 pod 主机名?

11
  • 我有两个Pod在两个节点上运行,每个Pod在不同的节点上运行。
  • 这些节点位于同一子网中,可以通过TCP/UDP/ICMP相互通信。

这些Pod具有一些主机名,例如:

  • drill-staging-75cddd789-kbzsq
  • drill-staging-75cddd789-amsrj

从Pod drill-staging-75cddd789-kbzsq无法解析drill-staging-75cddd789-amsrj的主机名,反之亦然。 解析自身Pod的名称可以正常工作。

我尝试了设置各种dnsPolicies:

  • ClusterFirst:没有成功
  • Default:没有成功
  • ClusterFirstWithHostNet:没有成功,甚至无法解析其自己节点的主机名
  • None:未尝试(我认为这不是一个好方法)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "app.name" . }}
  namespace: {{ .Values.global.namespace }}
spec:
  replicas: 2
  selector:
    matchLabels:
      app: {{ include "app.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "app.name" . }}
    spec:
      containers:
      - name: {{ include "app.name" . }}
        image: ...
        resources:
          ...
        ports:
          ...
        imagePullPolicy: Always
      restartPolicy: Always

这个回答解决了你的问题吗?如何为Pod使用Kubernetes DNS? - David Maze
我认为你需要明确地使用 podname.namespace.pod.cluster.local。在大多数情况下,通过 Service 更好的做法。 - David Maze
3
@DavidMaze 好的,也许我把问题表述错了。 我想要完成的是创建一个用于Apache Drill的集群。每个Drill pod都会使用自己的主机名注册到zookeeper。Pod内部的主机名不是完全限定域名(FQDN),因此它们将使用无法解析的地址进行注册。但是它们需要解析并相互通信...如果主机名可以在yaml中设置为FQDN,那么这就足够了。遗憾的是,Drill本身没有任何关于此的配置...这种情况是否有其他解决方案? - rudolfdobias
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ - Tummala Dhanvi
1个回答

28

通常,只有服务可以获得DNS名称,而不是Pod。因此,默认情况下,您不能直接使用域名引用另一个Pod,只能使用其IP地址。

仅在某些条件下,例如文档中所述的无头服务,Pod才会获得DNS名称。特别是,这些条件包括:

  • Pod具有hostname字段
  • Pod具有subdomain字段
  • 存在选择Pod的无头服务(在同一命名空间中)
  • 无头服务的名称等于Pod的subdomain字段

在这种情况下,每个Pod都会获得以下形式的完全限定域名:

my-hostname.my-subdomain.default.svc.cluster.local

在这里,my-hostname是 Pod 的 hostname 字段,而 my-subdomain 是 Pod 的 subdomain 字段。

注意:DNS名称是为Pod的“hostname”创建的,而不是Pod的“name”。

您可以使用以下设置进行测试:

apiVersion: v1
kind: Service
metadata:
  name: my-subdomain
spec:
  selector:
    name: my-test
  clusterIP: None
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    name: my-test
spec:
  hostname: my-hostname-1
  subdomain: my-subdomain
  containers:
  - image: weibeld/ubuntu-networking
    command: [sleep, "3600"]
    name: ubuntu-networking
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-2
  labels:
    name: my-test
spec:
  hostname: my-hostname-2
  subdomain: my-subdomain
  containers:
  - image: weibeld/ubuntu-networking
    command: [sleep, "3600"]
    name: ubuntu-networking

应用完成后,您可以执行以下操作进入其中一个 Pod:

kubectl exec -ti my-pod-1 bash

您应该能够解析两个Pod的完全限定域名:

host my-hostname-1.my-subdomain.default.svc.cluster.local
host my-hostname-2.my-subdomain.default.svc.cluster.local

由于您正在与目标Pods相同的命名空间中发出请求,因此可以将域名缩写为:

host my-hostname-1.my-subdomain
host my-hostname-2.my-subdomain

非常有用的答案和示例规范。文档并不是很清楚。 - Riccardo Manfrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接