给 Kubernetes 集群新增外部 DNS 服务

1. 给主机添加 DNS

1.1 CentOS

第一种方法: /etc/resolv.conf 管理 DNS

  • 禁用 NetworkManager
  • 如果不禁用 NetworkManager,在重启 NetworkManager 组件之后,直接在 /etc/resolv.conf 中添加的 DNS 记录会丢失。

    1
    2
    3
    4
    vim /etc/NetworkManager/NetworkManager.conf
    [main]
    dns=none

    [main] 部分添加 dns=none

  • 此时重启 NetworkManager,对已经添加到 /etc/resolv.conf 的记录无影响
  • 1
    
    systemctl restart network 
    

    第二种方式: NetworkManager 管理 DNS

  • 查看本地网络
  • 1
    2
    3
    4
    5
    6
    nmcli connection show
    NAME UUID TYPE DEVICE
    ens192 03da7500-2101-c722-2438-d0d006c28c73 ethernet ens192
    br-006fb59057ed 07e61d55-0c2e-4d63-bba9-52854cf9ad75 bridge br-006fb59057ed
    virbr0 ff8cf6fe-0613-4ba8-ac32-0afd2c6044b6 bridge virbr0
  • 修改 NetworkManager 网卡配置文件
  • 获取到本地网卡名为 ens192 之后,即可编辑该网卡的配置文件,添加 DNS。

    1
    2
    3
    4
    5
    vim /etc/sysconfig/network-scripts/ifcfg-ens192
    #添加
    DNS1=119.29.29.29
    DNS2=2114.114.114.114
  • 重启 NetworkManager 生成配置文件
  • 需要注意的是,此时在 /etc/resolv.conf 文件中的 DNS 记录会被清理掉,请注意备份。

    1
    
    cp /etc/resolv.conf /etc/resolv.conf.backup-$(date +%Y%m%d-%H%M%S)
    
    1
    
    systemctl restart network 
    
  • 查看生成的 /etc/resolv.conf 文件
  • 1
    2
    3
    4
    5
    cat /etc/resolv.conf
    # Generated by NetworkManager
    nameserver 119.29.29.29
    nameserver 114.114.114.114

    1.2 Ubuntu

    由于 resolv.conf 是自动生成的,需要改 resolved.conf 才行。

    1
    2
    3
    4
    5
    vim /etc/systemd/resolved.conf
    [Resolve]
    DNS=114.114.114.114
    DNS=8.8.8.8

    接着重启 resolve 服务。

    1
    
    systemctl restart systemd-resolved.service
    

    最后,还可以确认下配置是否生效。

    1
    
    systemd-resolve --status
    

    2. 重启 Nodelocaldns

    在 Pod 中发起外部请求时,解析逻辑是 nodelocaldns -> 节点配置的 DNS -> 返回 IP。

    1
    
    kubectl -n kube-system rollout restart ds nodelocaldns
    

    3. 参考

    • Kubernetes 中的 DNS 服务