假设我们有两个命名空间namespace-a
和namespace-b
。
Pod pod-name
运行在Deployment
中,并通过Service
上的service-name
在内部显示为ClusterIP
namespace-a
。 Kubernetes 1.17群集具有群集域名cluster-domain
。 cluster-domain
不是默认的cluster.local
。
batman
上的另一个Pod namespace-b
尝试解析pod-name
的IP地址。
batman
的作品:
ping/telnet pod-name.service-name.namespace-a.svc.cluster-domain
batman
中无效:ping/telnet pod-name.service-name.namespace-a.svc
但是,如果batman
在namespace-a
上运行:
3.以下可以在batman
中起作用:ping/telnet pod-name.service-name.namespace-a.svc
这与DNS配置有关吗?这是应该如何工作的吗?我找不到有关此问题的任何具体材料。
答案 0 :(得分:0)
如果要使用cluster.domain
而不是默认的cluster.local
,则需要在kubelet中使用标志--cluster-domain=cluster.domain
配置
还需要修改CoreDNS Corefile的ConfigMap来更改默认值
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.domain in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
要验证您是否检查了pod内的/etc/resolve.conf
文件
search default.svc.cluster.domain svc.cluster.domain cluster.domain google.internal c.gce_project_id.internal
nameserver 10.0.0.10
options ndots:5
答案 1 :(得分:0)
据我所知,这是应该起作用的方式。
我建议阅读Debugging DNS Resolution,在那里您可以找到Are DNS queries being received/processed
您可以通过将
log
插件添加到CoreDNS配置(也称为Corefile)来验证CoreDNS是否正在接收查询。 CoreDNS Corefile保存在名为coredns
的ConfigMap中。要对其进行编辑,请使用命令...
kubectl -n kube-system edit configmap coredns
然后按照以下示例在Corefile部分添加
log
。
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
log
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
保存更改后,Kubernetes最多可能需要一两分钟的时间才能将这些更改传播到CoreDNS pod。
接下来,进行一些查询,并按照本文档上面的各个部分查看日志。如果CoreDNS Pod正在接收查询,则应在日志中看到它们。