有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
命名空间是默认的。我该如何解决这个问题?
答案 0 :(得分:2)
根据本教程,您必须更改一些部分:
spec.selector
更新为app: test
。spec.subdomain
相同。headless
(spec.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。希望这会有所帮助。