Kubernetes DNS支持

一、介绍:

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容