如何从其他 pods 解析 pod 主机名?
How to resolve pod hostnames from other pods?
- 我在2个节点上有2个pods 运行,每个pod运行在不同的节点。
- 这些节点在同一个子网上,可以 TCP/UDP/ICMP 它们自己。
这些 pods 得到了一些主机名,即:
- drill-staging-75cddd789-kbzsq
- drill-staging-75cddd789-amsrj
从 pod drill-staging-75cddd789-kbzsq 我无法解析 drill-staging-75cddd789-amsrj 的主机名,反之亦然。 解析自身 pod 的名称有效。
我尝试设置各种 dnsPolicies:
- ClusterFirst:运气不好
- 默认:没有运气
- 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
通常 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
- 我在2个节点上有2个pods 运行,每个pod运行在不同的节点。
- 这些节点在同一个子网上,可以 TCP/UDP/ICMP 它们自己。
这些 pods 得到了一些主机名,即:
- drill-staging-75cddd789-kbzsq
- drill-staging-75cddd789-amsrj
从 pod drill-staging-75cddd789-kbzsq 我无法解析 drill-staging-75cddd789-amsrj 的主机名,反之亦然。 解析自身 pod 的名称有效。
我尝试设置各种 dnsPolicies:
- ClusterFirst:运气不好
- 默认:没有运气
- 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
通常 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