【问题标题】:How to resolve the hostname between the pods in the kubernetes cluster?如何解析 kubernetes 集群中 pod 之间的主机名?
【发布时间】:2025-12-06 06:25:03
【问题描述】:

我正在使用自定义 docker 映像创建两个 pod(ubuntu 是基础映像)。我正在尝试从他们的终端 ping 豆荚。我可以使用 IP 地址而不是主机名来访问它。在pods中不手动添加/etc/hosts如何实现?

注意:我没有在节点中运行任何服务。我基本上是在尝试使用它来设置 slurm。

Pod 清单文件:

apiVersion: v1
kind: Pod
metadata:
  name: slurmctld
  labels:
    app: slurm
spec:
  nodeName: docker-desktop
  hostname: slurmctld
  containers:
    - name: slurmctld
      image: slurmcontroller
      imagePullPolicy: Always
      ports:
        - containerPort: 6817
      resources:
        requests:
          memory: "1000Mi"
          cpu: "1000m"
        limits:
          memory: "1500Mi"
          cpu: "1500m"  
      command: [ "/bin/bash", "-c", "--" ]
      args: [ "while true; do sleep 30; done;" ]
---
apiVersion: v1
kind: Pod
metadata:
  name: worker1
  labels:
    app: slurm
spec:
  nodeName: docker-desktop
  hostname: worker1        
  containers:
    - name: worker1
      image: slurmworker
      imagePullPolicy: Always
      ports:
        - containerPort: 6818
      resources:
        requests:
          memory: "1000Mi"
          cpu: "1000m"
        limits:
          memory: "1500Mi"
          cpu: "1500m"    
      command: [ "/bin/bash", "-c", "--" ]
      args: [ "while true; do sleep 30; done;" ]

【问题讨论】:

  • 你需要一个匹配每个 Pod 的 Service。通常你不会使用裸 Pod,而是使用更高级别的控制器,例如 Deployment。

标签: docker kubernetes dns slurm kube-dns


【解决方案1】:

来自文档here

通常一个 pod 具有以下 DNS 解析:

pod-ip-address.my-namespace.pod.cluster-domain.example.

例如,如果 default 命名空间中的 pod 具有 IP 地址 172.17.0.3,而你的集群的域名是cluster.local,那么Pod就有了DNS名称:

172-17-0-3.default.pod.cluster.local.

由服务公开的 Deployment 或 DaemonSet 创建的任何 pod 有以下可用的 DNS 解析:

pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example

如果您不喜欢处理 Pod 不断变化的 IP,那么您需要创建 service 以使用 DNS 主机名公开 Pod。下面是公开slurmctld pod 的服务示例。

apiVersion: v1
kind: Service
metadata:
  name: slurmctld-service
spec:
  selector:
    app: slurm
  ports:
    - protocol: TCP
      port: 80
      targetPort: 6817

假设您在 default 命名空间上执行这些操作,您现在应该可以通过 slurmctld-service.default.svc.cluster.local 访问它

【讨论】: