kube-dns

kube-dns为Kubernetes集群提供命名服务,一般通过addon的方式部署,从v1.3版本开始,成为了一个内建的自启动服务。

支持的DNS格式

  • Service
    • A record:生成my-svc.my-namespace.svc.cluster.local,解析IP分为两种情况
      • 普通Service解析为Cluster IP
      • Headless Service解析为指定的Pod IP列表
    • SRV record:生成_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
  • Pod
    • A record:pod-ip-address.my-namespace.pod.cluster.local
    • 指定hostname和subdomain:hostname.custom-subdomain.default.svc.cluster.local,如下所示
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: busybox2
  5. labels:
  6. name: busybox
  7. spec:
  8. hostname: busybox-2
  9. subdomain: default-subdomain
  10. containers:
  11. - image: busybox
  12. command:
  13. - sleep
  14. - "3600"
  15. name: busybox

3.7 kube-dns - 图1

支持配置私有DNS服务器和上游DNS服务器

从Kubernetes 1.6开始,可以通过为kube-dns提供ConfigMap来实现对存根域以及上游名称服务器的自定义指定。例如,下面的配置插入了一个单独的私有根DNS服务器和两个上游DNS服务器。

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: kube-dns
  5. namespace: kube-system
  6. data:
  7. stubDomains: |
  8. {“acme.local”: [“1.2.3.4”]}
  9. upstreamNameservers: |
  10. [“8.8.8.8”, 8.8.4.4”]

使用上述特定配置,查询请求首先会被发送到kube-dns的DNS缓存层(Dnsmasq 服务器)。Dnsmasq服务器会先检查请求的后缀,带有集群后缀(例如:”.cluster.local”)的请求会被发往kube-dns,拥有存根域后缀的名称(例如:”.acme.local”)将会被发送到配置的私有DNS服务器[“1.2.3.4”]。最后,不满足任何这些后缀的请求将会被发送到上游DNS [“8.8.8.8”, “8.8.4.4”]里。

3.7 kube-dns - 图2

启动kube-dns示例

一般通过addon的方式部署DNS服务,这会在Kubernetes中启动一个包含三个容器的Pod,运行着DNS相关的三个服务:

  1. # kube-dns container
  2. kube-dns --domain=cluster.local. --dns-port=10053 --config-dir=/kube-dns-config --v=2
  3. # dnsmasq container
  4. dnsmasq-nanny -v=2 -logtostderr -configDir=/etc/k8s/dns/dnsmasq-nanny -restartDnsmasq=true -- -k --cache-size=1000 --log-facility=- --server=127.0.0.1#10053
  5. # sidecar container
  6. sidecar --v=2 --logtostderr --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,A --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,A

参考文档