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

rud*_*ias 4 networking kubernetes kube-dns kubernetes-networking

  • 我有 2 个 Pod 在 2 个节点上运行,每个 Pod 运行在不同的节点上。
  • 这些节点位于同一个子网上,并且它们本身可以使用 TCP/UDP/ICMP。

这些 pod 有一些主机名,即:

  • 钻孔分段 75cddd789-kbzsq
  • 钻孔分段 75cddd789-amsrj

从 podrill-staging-75cddd789-kbzsq 我无法解析drill-staging-75cddd789-amsrj的主机名,反之亦然。解析 self pod 的名称有效。

我尝试设置各种 dnsPolicies:

  • ClusterFirst:没有运气
  • 默认:没有运气
  • ClusterFirstWithHostNet:没有运气,它事件无法解析它自己节点的主机名
  • 无:未尝试(我认为这不是一个好方法)
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
Run Code Online (Sandbox Code Playgroud)

wei*_*eld 14

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

Pod 仅在包含无头服务的特定条件下获取 DNS 名称,如文档中所述。具体来说,条件是:

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

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

my-hostname.my-subdomain.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

哪里my-hostnamehostnamePodmy-subdomainsubdomain字段,是Pod的字段。

注意:DNS 名称是为 Pod 的“主机名”而不是 Pod 的“名称”创建的。

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

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
Run Code Online (Sandbox Code Playgroud)

应用此操作后,您可以执行到其中一个 Pod:

kubectl exec -ti my-pod-1 bash
Run Code Online (Sandbox Code Playgroud)

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

host my-hostname-1.my-subdomain.default.svc.cluster.local
host my-hostname-2.my-subdomain.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

由于您从与目标 Pod 相同的命名空间发出请求,您可以将域名缩写为:

host my-hostname-1.my-subdomain
host my-hostname-2.my-subdomain
Run Code Online (Sandbox Code Playgroud)