一、介绍:
Kubernetes DNS 在集群中会启动dns pod(coredns)和service(kube-dns)。集群中的container使用kube-dns service进行dns解析。
在集群中,每个service都会分配一个域名,默认一个pod会查找他自己namespace和集群中的default域。如:在bar namespace中分配一个service foo,运行在bar namespace中的pod可以通过foo查找这个服务,运行在quux namespace中的pod需要foo.bar查找这个服务
二、service dns解析
service 记录
正常service的A 记录:
一个正常的service (非headless)会被分配一个dns A记录,如:my-svc.my-namespace.svc,cluster.local.被解析到集群中的serivce ip上。
测试DNS解析服务:
创建服务kubectl create service nodeport redis --tcp=6379:6379
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d13h
redis NodePort 10.101.45.89 <none> 6379:32082/TCP 13s
运行测试pod kubectl run busybox --rm -ti --image=busybox /bin/sh
/ # nslookup redis
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: redis.default.svc.cluster.local
Address: 10.101.45.89
/ # nslookup redis.default.svc.cluster.local.
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: redis.default.svc.cluster.local
Address: 10.101.45.89
/ # nslookup kube-dns.kube-system.svc.cluster.local.
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: kube-dns.kube-system.svc.cluster.local
Address: 10.96.0.10
可以发现域名被解析了。
Headless serivce
Headless 服务,会解析一出来一个pod的ip list.客户端自己选择IP。
SRV records
SRE解析记录格式为:_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
对于无头服务,这将解析为多个答案,每个答案对应支持该服务的pod,并包含表单auto-generate -name.my- namespace - pace. svg .cluster.local的pod端口号和域名
POD记录
每个pod都会分配一个:pod-ip-address.my-namespace.pod.cluster.local记录。比如一个pod在default namespace的IP为 1.2.3.4 ,它将有一个1-2-3-4.default.pod.cluster.local.记录。
/ # nslookup 10-32-0-3.default.pod.cluster.local.
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: 10-32-0-3.default.pod.cluster.local
Address: 10.32.0.3
pod的hostname&subdomain也会有一个记录:foo(hostname).bar(subdomain).my-namespace.svc.cluster.local
Pod DNS 策略
POD里的DNS策略可以对每个pod进行设置,他支持四种策略default,ClusterFirst,ClusterFirstWithHostNet,None:
default: 表示 Pod 里面的 DNS 配置继承了宿主机上的 DNS 配置。简单来说,就是该 Pod 的 DNS 配置会跟宿主机完全一致。也就是和node上的dns配置是一样的
ClusterFirst:相对于上述的 Default,ClusterFirst 是完全相反的操作,它会预先把 kube-dns(或 CoreDNS)的信息当作预设参数写入到该 Pod 内的 DNS 配置。ClusterFirst 是默认的pod设置,若没有在 Pod 內特別描述 PodPolicy, 则会将 dnsPolicy 预设为 ClusterFirst.不过ClusterFirst 还有一个冲突,如果你的 Pod 设置了 HostNetwork=true,则 ClusterFirst 就会被强制转换成 Default。
ClusterFirstWithHostNet:如果pod是桥接的模式, dnsPolicy 将设置为ClusterFirstWithHostNet,他将同时解决default和ClusterFirst的DNS解析。
None: 表示会清除 Pod 预设的 DNS 配置,当 dnsPolicy 设置成这个值之后,Kubernetes 不会为 Pod 预先载入任何自身逻辑判断得到的 DNS 配置。因此若要将 dnsPolicy 的值设为 None,为了避免 Pod 里面没有配置任何 DNS,最好再添加 dnsConfig 来描述自定义的 DNS 参数
以下为pod DNS策略为none,然后自定义DNSpod
service/networking/custom-dns.yaml
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 1.2.3.4
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0