You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
8.7 KiB

  1. # K8s DNS stack by Kubespray
  2. For K8s cluster nodes, Kubespray configures a [Kubernetes DNS](https://kubernetes.io/docs/admin/dns/)
  3. [cluster add-on](https://releases.k8s.io/master/cluster/addons/README.md)
  4. to serve as an authoritative DNS server for a given ``dns_domain`` and its
  5. ``svc, default.svc`` default subdomains (a total of ``ndots: 5`` max levels).
  6. Other nodes in the inventory, like external storage nodes or a separate etcd cluster
  7. node group, considered non-cluster and left up to the user to configure DNS resolve.
  8. ## DNS variables
  9. There are several global variables which can be used to modify DNS settings:
  10. ### ndots
  11. ndots value to be used in ``/etc/resolv.conf``
  12. It is important to note that multiple search domains combined with high ``ndots``
  13. values lead to poor performance of DNS stack, so please choose it wisely.
  14. ### searchdomains
  15. Custom search domains to be added in addition to the cluster search domains (``default.svc.{{ dns_domain }}, svc.{{ dns_domain }}``).
  16. Most Linux systems limit the total number of search domains to 6 and the total length of all search domains
  17. to 256 characters. Depending on the length of ``dns_domain``, you're limited to less than the total limit.
  18. Please note that ``resolvconf_mode: docker_dns`` will automatically add your systems search domains as
  19. additional search domains. Please take this into the accounts for the limits.
  20. ### nameservers
  21. This variable is only used by ``resolvconf_mode: host_resolvconf``. These nameservers are added to the hosts
  22. ``/etc/resolv.conf`` *after* ``upstream_dns_servers`` and thus serve as backup nameservers. If this variable
  23. is not set, a default resolver is chosen (depending on cloud provider or 8.8.8.8 when no cloud provider is specified).
  24. ### upstream_dns_servers
  25. DNS servers to be added *after* the cluster DNS. Used by all ``resolvconf_mode`` modes. These serve as backup
  26. DNS servers in early cluster deployment when no cluster DNS is available yet.
  27. ### coredns_external_zones
  28. Array of optional external zones to coredns forward queries to. It's injected into
  29. `coredns`' config file before default kubernetes zone. Use it as an optimization for well-known zones and/or internal-only
  30. domains, i.e. VPN for internal networks (default is unset)
  31. Example:
  32. ```yaml
  33. coredns_external_zones:
  34. - zones:
  35. - example.com
  36. - example.io:1053
  37. nameservers:
  38. - 1.1.1.1
  39. - 2.2.2.2
  40. cache: 5
  41. - zones:
  42. - https://mycompany.local:4453
  43. nameservers:
  44. - 192.168.0.53
  45. cache: 0
  46. ```
  47. or as INI
  48. ```ini
  49. coredns_external_zones='[{"cache": 30,"zones":["example.com","example.io:453"],"nameservers":["1.1.1.1","2.2.2.2"]}]'
  50. ```
  51. ### dns_etchosts (coredns)
  52. Optional hosts file content to coredns use as /etc/hosts file. This will also be used by nodelocaldns, if enabled.
  53. Example:
  54. ```yaml
  55. dns_etchosts: |
  56. 192.168.0.100 api.example.com
  57. 192.168.0.200 ingress.example.com
  58. ```
  59. ### enable_coredns_reverse_dns_lookups
  60. Whether reverse DNS lookups are enabled in the coredns config. Defaults to `true`.
  61. ## DNS modes supported by Kubespray
  62. You can modify how Kubespray sets up DNS for your cluster with the variables ``dns_mode`` and ``resolvconf_mode``.
  63. ### dns_mode
  64. ``dns_mode`` configures how Kubespray will setup cluster DNS. There are four modes available:
  65. #### dns_mode: coredns (default)
  66. This installs CoreDNS as the default cluster DNS for all queries.
  67. #### dns_mode: coredns_dual
  68. This installs CoreDNS as the default cluster DNS for all queries, plus a secondary CoreDNS stack.
  69. #### dns_mode: manual
  70. This does not install coredns, but allows you to specify
  71. `manual_dns_server`, which will be configured on nodes for handling Pod DNS.
  72. Use this method if you plan to install your own DNS server in the cluster after
  73. initial deployment.
  74. #### dns_mode: none
  75. This does not install any of DNS solution at all. This basically disables cluster DNS completely and
  76. leaves you with a non functional cluster.
  77. ## resolvconf_mode
  78. ``resolvconf_mode`` configures how Kubespray will setup DNS for ``hostNetwork: true`` PODs and non-k8s containers.
  79. There are three modes available:
  80. ### resolvconf_mode: docker_dns (default)
  81. This sets up the docker daemon with additional --dns/--dns-search/--dns-opt flags.
  82. The following nameservers are added to the docker daemon (in the same order as listed here):
  83. * cluster nameserver (depends on dns_mode)
  84. * content of optional upstream_dns_servers variable
  85. * host system nameservers (read from hosts /etc/resolv.conf)
  86. The following search domains are added to the docker daemon (in the same order as listed here):
  87. * cluster domains (``default.svc.{{ dns_domain }}``, ``svc.{{ dns_domain }}``)
  88. * content of optional searchdomains variable
  89. * host system search domains (read from hosts /etc/resolv.conf)
  90. The following dns options are added to the docker daemon
  91. * ndots:{{ ndots }}
  92. * timeout:2
  93. * attempts:2
  94. These dns options can be overridden by setting a different list:
  95. ```yaml
  96. docker_dns_options:
  97. - ndots:{{ ndots }}
  98. - timeout:2
  99. - attempts:2
  100. - rotate
  101. ```
  102. For normal PODs, k8s will ignore these options and setup its own DNS settings for the PODs, taking
  103. the --cluster_dns (either coredns or coredns_dual, depending on dns_mode) kubelet option into account.
  104. For ``hostNetwork: true`` PODs however, k8s will let docker setup DNS settings. Docker containers which
  105. are not started/managed by k8s will also use these docker options.
  106. The host system name servers are added to ensure name resolution is also working while cluster DNS is not
  107. running yet. This is especially important in early stages of cluster deployment. In this early stage,
  108. DNS queries to the cluster DNS will timeout after a few seconds, resulting in the system nameserver being
  109. used as a backup nameserver. After cluster DNS is running, all queries will be answered by the cluster DNS
  110. servers, which in turn will forward queries to the system nameserver if required.
  111. #### resolvconf_mode: host_resolvconf
  112. This activates the classic Kubespray behavior that modifies the hosts ``/etc/resolv.conf`` file and dhclient
  113. configuration to point to the cluster dns server (either coredns or coredns_dual, depending on dns_mode).
  114. As cluster DNS is not available on early deployment stage, this mode is split into 2 stages. In the first
  115. stage (``dns_early: true``), ``/etc/resolv.conf`` is configured to use the DNS servers found in ``upstream_dns_servers``
  116. and ``nameservers``. Later, ``/etc/resolv.conf`` is reconfigured to use the cluster DNS server first, leaving
  117. the other nameservers as backups.
  118. Also note, existing records will be purged from the `/etc/resolv.conf`,
  119. including resolvconf's base/head/cloud-init config files and those that come from dhclient.
  120. #### resolvconf_mode: none
  121. Does nothing regarding ``/etc/resolv.conf``. This leaves you with a cluster that works as expected in most cases.
  122. The only exception is that ``hostNetwork: true`` PODs and non-k8s managed containers will not be able to resolve
  123. cluster service names.
  124. ## Nodelocal DNS cache
  125. Setting ``enable_nodelocaldns`` to ``true`` will make pods reach out to the dns (core-dns) caching agent running on the same node, thereby avoiding iptables DNAT rules and connection tracking. The local caching agent will query core-dns (depending on what main DNS plugin is configured in your cluster) for cache misses of cluster hostnames(cluster.local suffix by default).
  126. More information on the rationale behind this implementation can be found [here](https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/0030-nodelocal-dns-cache.md).
  127. **As per the 2.10 release, Nodelocal DNS cache is enabled by default.**
  128. ### External zones
  129. It's possible to extent the `nodelocaldns`' configuration by adding an array of external zones. For example:
  130. ```yaml
  131. nodelocaldns_external_zones:
  132. - zones:
  133. - example.com
  134. - example.io:1053
  135. nameservers:
  136. - 1.1.1.1
  137. - 2.2.2.2
  138. cache: 5
  139. - zones:
  140. - https://mycompany.local:4453
  141. nameservers:
  142. - 192.168.0.53
  143. ```
  144. ### dns_etchosts (nodelocaldns)
  145. See [dns_etchosts](#dns_etchosts-coredns) above.
  146. ## Limitations
  147. * Kubespray has yet ways to configure Kubedns addon to forward requests SkyDns can
  148. not answer with authority to arbitrary recursive resolvers. This task is left
  149. for future. See [official SkyDns docs](https://github.com/skynetservices/skydns)
  150. for details.
  151. * There is
  152. [no way to specify a custom value](https://github.com/kubernetes/kubernetes/issues/33554)
  153. for the SkyDNS ``ndots`` param.
  154. * the ``searchdomains`` have a limitation of a 6 names and 256 chars
  155. length. Due to default ``svc, default.svc`` subdomains, the actual
  156. limits are a 4 names and 239 chars respectively.
  157. * the ``nameservers`` have a limitation of a 3 servers, although there
  158. is a way to mitigate that with the ``upstream_dns_servers``,
  159. see below. Anyway, the ``nameservers`` can take no more than a two
  160. custom DNS servers because of one slot is reserved for a Kubernetes
  161. cluster needs.