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

How to resolve pod hostnames from other pods?

这些 pods 得到了一些主机名,即:

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

我尝试设置各种 dnsPolicies:

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

通常 only Services get DNS names,而不是 Pods。因此,默认情况下,您不能通过域名直接引用另一个 Pod,只能通过其 IP 地址。

Pods 仅在包含无头服务的特定条件下获取 DNS 名称,如 explained in the documentation。具体来说,条件是:

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

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

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

其中my-hostname是Pod的hostname字段,my-subdomain是Pod的subdomain字段。

Note: the DNS name is created for the "hostname" of the Pod and not the "name" of the 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

应用此后,您可以执行 Pods:

之一
kubectl exec -ti my-pod-1 bash

并且您应该能够解析两个 Pods:

的完全限定域名
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