如何使用dns获得Pod IP?

时间:2018-11-20 02:07:22

标签: kubernetes

有Centos的Pod。我想通过DNS获取Pod IP。但是有一个错误。

[root@namenode /]# nslookup namenode.space.default.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10#53
** server can't find namenode.space.default.svc.cluster.local: NXDOMAIN

[root@namenode /]# nslookup namenode
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   namenode.default.svc.cluster.local
Address: 10.107.117.123

这是我的Yaml文件

apiVersion: v1
kind: Pod
metadata:
 name: test-con
 labels:
  app: test
spec:
 hostname: namenode
 subdomain: space
 containers:
 - name: test-con
   image: 192.168.50.130:5000/test
   command: [ "/usr/sbin/sshd", "-D"]

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: namenode
spec:
  selector:
    name: test
  ports:
   -  name: "ssh"
      port: 22
      targetPort: 22
  type: NodePort

命名空间是默认的。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

首先查看https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-hostname-and-subdomain-fields

根据本教程,您必须更改一些部分:

  • 在您的服务中将spec.selector更新为app: test
  • 服务名称必须与spec.subdomain相同。
  • 服务必须headlessspec.clusterIP设置为None

一切准备就绪后,尝试$ namenode.space.default.svc.cluster.local

答案 1 :(得分:1)

当您查找常规服务名称nslookup namenode时,它将返回为其分配的clusterIP。每当对该服务有任何请求时,它都会使用kube-proxy自动发现pod并将其发送到该pod。因此,kube-dns并不事先知道podIP,它只知道clusterIP,而剩下的责任就是kube-proxy来找到pod。

要以自己的方式进行Pod发现,您需要使用无头服务,该服务会返回附加到该服务的所有Pod IP。但是,无头服务的用例是在您拥有状态集并且每个副本都有其自己的PV,PVC的情况下。要定义无头服务,您需要在服务定义中提供clusterIP: None。请查看我有关无头服务的答案

Kubernetes service architecture

根据您的问题,如果您仅需要Pod IP,则可以使用环境变量为您完成操作。将下面的配置块添加到您的pod定义中:

env:
- name: MY_POD_NAME
  valueFrom:
    fieldRef:
      fieldPath: metadata.name
- name: MY_POD_NAMESPACE
  valueFrom:
    fieldRef:
      fieldPath: metadata.namespace
- name: MY_POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

现在,echo $MY_POD_IP将为您提供容器内的pod IP。希望这会有所帮助。