如何通过查询DNS srv记录获得kubernetes吊舱的Ip地址?
我正在尝试创建一个kubernetes作业,在该作业中,我将运行“dig srv”查询,以找出在同一集群上运行的任何特定服务的所有POD的IP地址 这是可以实现的吗 我想就问题陈述再详细阐述一下。集群上已经有一些服务在运行。需求是要有一个能够接受服务名称并列出属于该服务的所有POD的IP地址的工具 我可以通过使用kubectl命令以及选择器和jq工具来实现这一点。但由于某些原因,我不允许在此环境中运行kubectl命令 我想使用如何通过查询DNS srv记录获得kubernetes吊舱的Ip地址?,kubernetes,kubernetes-pod,kube-dns,kubernetes-jobs,srv-record,Kubernetes,Kubernetes Pod,Kube Dns,Kubernetes Jobs,Srv Record,我正在尝试创建一个kubernetes作业,在该作业中,我将运行“dig srv”查询,以找出在同一集群上运行的任何特定服务的所有POD的IP地址 这是可以实现的吗 我想就问题陈述再详细阐述一下。集群上已经有一些服务在运行。需求是要有一个能够接受服务名称并列出属于该服务的所有POD的IP地址的工具 我可以通过使用kubectl命令以及选择器和jq工具来实现这一点。但由于某些原因,我不允许在此环境中运行kubectl命令 我想使用dig srv查询来解析所提供服务名称的pod IP。这在内部进行了
dig srv
查询来解析所提供服务名称的pod IP。这在内部进行了解释
为群集中定义的每个服务(包括DNS服务器本身)分配一个DNS名称。默认情况下,客户端Pod的DNS搜索列表将包括Pod自己的命名空间和集群的默认域。这可以通过以下示例得到最好的说明:
假设Kubernetes命名空间bar
中有一个名为foo
的服务。在命名空间栏中运行的Pod可以通过对foo
执行DNS查询来查找此服务。在命名空间qux
中运行的Pod可以通过对foo.bar
执行DNS查询来查找此服务
这里是一个详细的文档
至于查询POD
ip地址,则取决于是否指定了spec.hostname
如果在与pod相同的命名空间中存在与子域同名的无头服务,则集群的KubeDNS服务器还将返回pod完全限定主机名的a记录。例如,给定一个主机名设置为“busybox-1
”且子域设置为“default subdomain
”的Pod,以及同一命名空间中名为“default subdomain
”的无头服务,Pod将看到自己的FQDN为“busybox-1.default subdomain.my namespace.svc.cluster.local
”。DNS在该名称处提供A记录,指向Pod的IP。两个POD“busybox1
”和“busybox2
”都可以有各自不同的A记录
Endpoints对象可以为任何端点地址及其IP指定主机名
注意:因为没有为Pod名称创建A记录,所以创建Pod的A记录需要hostname
。没有主机名
但有子域
的Pod只会为无头服务创建A记录(默认子域.my namespace.svc.cluster.local
),指向Pod的IP地址。此外,Pod需要准备就绪才能拥有记录,除非服务上设置了publishNotReadyAddresses=True
希望这足以说明问题。这已在内部解释
为群集中定义的每个服务(包括DNS服务器本身)分配一个DNS名称。默认情况下,客户端Pod的DNS搜索列表将包括Pod自己的命名空间和集群的默认域。这可以通过以下示例得到最好的说明:
假设Kubernetes命名空间bar
中有一个名为foo
的服务。在命名空间栏中运行的Pod可以通过对foo
执行DNS查询来查找此服务。在命名空间qux
中运行的Pod可以通过对foo.bar
执行DNS查询来查找此服务
这里是一个详细的文档
至于查询POD
ip地址,则取决于是否指定了spec.hostname
如果在与pod相同的命名空间中存在与子域同名的无头服务,则集群的KubeDNS服务器还将返回pod完全限定主机名的a记录。例如,给定一个主机名设置为“busybox-1
”且子域设置为“default subdomain
”的Pod,以及同一命名空间中名为“default subdomain
”的无头服务,Pod将看到自己的FQDN为“busybox-1.default subdomain.my namespace.svc.cluster.local
”。DNS在该名称处提供A记录,指向Pod的IP。两个POD“busybox1
”和“busybox2
”都可以有各自不同的A记录
Endpoints对象可以为任何端点地址及其IP指定主机名
注意:因为没有为Pod名称创建A记录,所以创建Pod的A记录需要hostname
。没有主机名
但有子域
的Pod只会为无头服务创建A记录(默认子域.my namespace.svc.cluster.local
),指向Pod的IP地址。此外,Pod需要准备就绪才能拥有记录,除非服务上设置了publishNotReadyAddresses=True
希望这就足够了。您可以使用无头服务(因此没有集群,也没有内部负载平衡)。如果提供选择器,则可以查询服务的记录
见:
考虑以下示例:
一些吊舱的部署:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16
ports:
- containerPort: 80
对于此部署,添加了以下无头服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
现在可以使用DNS(在集群内)查询
所有内部Pod IP都作为DNS A记录返回。您可以使用无头服务(因此没有集群IP和内部负载平衡)。如果提供选择器,则可以查询服务的记录
见:
考虑以下示例:
一些吊舱的部署:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16
ports:
- containerPort: 80
对于此部署,添加了以下无头服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
现在可以使用DNS查询此信息(