diff --git a/docs/dns-stack.md b/docs/dns-stack.md index 54a0081c181ee7808017ec69076a5d24b7a0f5f5..808b8aae46e9b0eb2171d556e534fc2bbb0648f3 100644 --- a/docs/dns-stack.md +++ b/docs/dns-stack.md @@ -39,15 +39,17 @@ Later, the nameservers will be reconfigured to the DNS service IP that Kargo configures for K8s cluster. Also note, existing records will be purged from the `/etc/resolv.conf`, -including base/head/cloud-init config files and those that come from dhclient. +including resolvconf's base/head/cloud-init config files and those that come from dhclient. This is required for hostnet pods networking and for [kubelet to not exceed search domains limits](https://github.com/kubernetes/kubernetes/issues/9229). -New search, nameserver records and options will be defined from the aforementioned vars: -* Via resolvconf's head file, if resolvconf installed. -* Via dhclient's DNS update hook. -* Via cloud-init (CoreOS only). -* Statically in the `/etc/resolv.conf`, if none of above is applicable. +Instead, new domain, search, nameserver records and options will be defined from the +aforementioned vars: +* Superseded via dhclient's DNS update hook. +* Generated via cloud-init (CoreOS only). +* Statically defined in the `/etc/resolv.conf`, if none of above is applicable. +* Resolvconf's head/base files are disabled from populating anything into the + `/etc/resolv.conf`. DNS configuration details ------------------------- diff --git a/roles/kubernetes/preinstall/tasks/dhclient-hooks.yml b/roles/kubernetes/preinstall/tasks/dhclient-hooks.yml index 914ffca92e3a1d89cad9604b9ad41614daeb6e63..a574ea1e7c4cd9b559b95245a07d006c7a7626c2 100644 --- a/roles/kubernetes/preinstall/tasks/dhclient-hooks.yml +++ b/roles/kubernetes/preinstall/tasks/dhclient-hooks.yml @@ -1,8 +1,8 @@ --- -- name: Configure dhclient to prepend nameservers and supersede search/domain +- name: Configure dhclient to supersede search/domain/nameservers blockinfile: block: |- - {% for item in [ supersede_domain, supersede_search, prepend_nameserver ] -%} + {% for item in [ supersede_domain, supersede_search, supersede_nameserver ] -%} {{ item }} {% endfor %} dest: "{{dhclientconffile}}" diff --git a/roles/kubernetes/preinstall/tasks/set_resolv_facts.yml b/roles/kubernetes/preinstall/tasks/set_resolv_facts.yml index 288c80afe0292068496453ab6149f9b5529af987..da8664e365a26dd5f0732e621aac90a874e8baab 100644 --- a/roles/kubernetes/preinstall/tasks/set_resolv_facts.yml +++ b/roles/kubernetes/preinstall/tasks/set_resolv_facts.yml @@ -64,18 +64,13 @@ supersede_domain: supersede domain-name "{{ dns_domain }}"; -- name: decide on dns server IP - set_fact: - dns_server_real: >- - {%- if dns_early|bool -%}{{default_resolver}}{%- else -%}{{dns_server}}{%- endif -%} - - name: pick dnsmasq cluster IP or default resolver set_fact: dnsmasq_server: |- {%- if skip_dnsmasq|bool and not dns_early|bool -%} {{ [ skydns_server ] + upstream_dns_servers|default([]) }} {%- elif dns_early|bool -%} - {{ [ dns_server_real ] + upstream_dns_servers|default([]) }} + {{ upstream_dns_servers|default([default_resolver]) }} {%- else -%} {{ [ dns_server ] }} {%- endif -%} @@ -83,6 +78,6 @@ - name: generate nameservers to resolvconf set_fact: nameserverentries: - nameserver {{( dnsmasq_server|default([]) + nameservers|default([])) | join(',nameserver ')}} - prepend_nameserver: - prepend domain-name-servers {{( dnsmasq_server|default([]) + nameservers|default([])) | join(', ') }}; + nameserver {{( dnsmasq_server + nameservers|default([])) | join(',nameserver ')}} + supersede_nameserver: + supersede domain-name-servers {{( dnsmasq_server + nameservers|default([])) | join(', ') }}; diff --git a/roles/kubernetes/preinstall/templates/dhclient_dnsupdate.sh.j2 b/roles/kubernetes/preinstall/templates/dhclient_dnsupdate.sh.j2 index 84eb239267b59c20845a648e9743635025510346..b40a80ae497a895fe4e160c664127039b5a62731 100644 --- a/roles/kubernetes/preinstall/templates/dhclient_dnsupdate.sh.j2 +++ b/roles/kubernetes/preinstall/templates/dhclient_dnsupdate.sh.j2 @@ -5,7 +5,7 @@ # if [ $reason = "BOUND" ]; then if [ -n "$new_domain_search" -o -n "$new_domain_name_servers" ]; then - RESOLV_CONF=$(cat /etc/resolv.conf) + RESOLV_CONF=$(cat /etc/resolv.conf | sed -r '/^options (timeout|attempts|ndots).*$/d') OPTIONS="options timeout:2\noptions attempts:2\noptions ndots:{{ ndots }}" printf "%b\n" "$RESOLV_CONF\n$OPTIONS" > /etc/resolv.conf diff --git a/roles/kubernetes/preinstall/templates/dhclient_dnsupdate_rh.sh.j2 b/roles/kubernetes/preinstall/templates/dhclient_dnsupdate_rh.sh.j2 index 514863663a2d9713b42b1f2aeca5c9a4e4156b90..028f0fd89e0ebba60438e7421f8bc10f3f6fe72f 100644 --- a/roles/kubernetes/preinstall/templates/dhclient_dnsupdate_rh.sh.j2 +++ b/roles/kubernetes/preinstall/templates/dhclient_dnsupdate_rh.sh.j2 @@ -5,7 +5,7 @@ # zdnsupdate_config() { if [ -n "$new_domain_search" -o -n "$new_domain_name_servers" ]; then - RESOLV_CONF=$(cat /etc/resolv.conf) + RESOLV_CONF=$(cat /etc/resolv.conf | sed -r '/^options (timeout|attempts|ndots).*$/d') OPTIONS="options timeout:2\noptions attempts:2\noptions ndots:{{ ndots }}" echo -e "$RESOLV_CONF\n$OPTIONS" > /etc/resolv.conf