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

时间:2019-12-09 23:42:20

标签: networking kubernetes kube-dns kubernetes-networking

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

这些吊舱有一些主机名,即:

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

从Pod Drill-Staging-75cddd789-kbzsq中,我无法解析Drill-Staging-75cddd789-amsrj的主机名,反之亦然。解析自身Pod的名称有效。

我尝试设置各种dnsPolicies:

  • ClusterFirst:没有运气
  • 默认:没有运气
  • ClusterFirstWithHostNet:不走运,it事件无法解析其自身节点的主机名
  • 没有:没有尝试过(我认为这不是一个好方法)
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

1 个答案:

答案 0 :(得分:4)

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

仅在包括无头服务的某些条件下,豆荚才能获得DNS名称,例如explained in the documentation。具体来说,条件是:

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

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

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

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

  

注意: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

应用此选项后,您可以执行到其中一个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

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

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