虚拟机部署容器后如何为容器设置DNS转发?

虚拟机部署了容器 Docker 和 Kubernetes (K8S) 后,应正确设置域名转发,否则无法正确使用数据中心提供的存储(NAS)、数据库租户等服务。

数据中心提供的存储(NAS)、数据库租户服务,均使用域名方式访问,严禁使用固定IP地址访问这些服务。

域名转发是指将特定域名的 DNS 查询请求发送到指定的 DNS 服务器的过程。这对于确保容器中应用能够正确解析外部服务的地址至关重要。

数据中心接受容器域名解析转发的 DNS 服务器为:202.116.64.1 和 202.116.64.2

当然,下面是一个关于如何在使用 Docker 和 Kubernetes 部署应用时正确设置域名转发的技术支持 FAQ。这份 FAQ 包含了基本的概念解释、配置步骤以及常见问题解答。

以下设置方法仅供参考,容器管理员应根据自己的情况做出判断,及选用恰当的 DNS 转发设置。配置案例中,除 202.116.64.1 和 202.116.64.2 外,所有域名均为假设。

在 Docker 中如何设置域名转发

1. 使用 Docker 守护进程配置

编辑 Docker 守护进程配置文件(通常位于 /etc/docker/daemon.json)。

添加或修改 dns 属性,指定您希望使用的 DNS 服务器。

  {
    "dns": ["202.116.64.1", "202.116.64.2"]
  }  

重启 Docker 服务以应用更改。

 sudo systemctl restart docker

2. 在 Docker Compose 文件中设置

在 docker-compose.yml 文件中,为每个服务定义 dns 属性。

version: '3'
services:
    web:
      image: nginx
      dns:
        - 202.116.64.1
        - 202.116.64.2

在 Kubernetes 中如何设置域名转发

1. 修改 CoreDNS 配置

访问 Kubernetes 集群的 CoreDNS 配置文件(通常是 `Corefile`),通常位于 `kube-system` 命名空间下的 ConfigMap `coredns` 中。

添加或修改转发规则,以便将特定域名的查询请求转发到外部 DNS 服务器。

nas.storage.local:53 {
    forward . 202.116.64.1 202.116.64.2
}

应用更改并重启 CoreDNS Pods。

kubectl -n kube-system edit configmap coredns

2. 使用 Pod 的 DNSPolicy

在 Pod 定义中设置 dnsPolicy 和 dnsConfig 字段,直接为特定的 Pod 指定 DNS 服务器。

apiVersion: v1
  kind: Pod
  metadata:
    name: my-pod
  spec:
    containers:
    - name: my-container
      image: my-image
    dnsPolicy: "None"
    dnsConfig:
      nameservers:
        - 202.116.64.1
        - 202.116.64.2
      searches:
        - ns1.svc.cluster-domain.example
        - my.domain.com
      options:
        - name: ndots
          value: "2"

如修改了 CoreDNS 配置,不需要重启整个集群。只需更新 CoreDNS 的 ConfigMap 并重启 CoreDNS Pods 即可。CoreDNS 会自动检测配置变化并重新加载。

可使用 nslookup 或 dig 工具从 Pod 内部执行 DNS 查询,以验证配置是否按预期工作。

kubectl run -i --tty --image busybox:test --restart=Never dns-test --rm /bin/sh

在 Pod 内部执行

nslookup nas.storage.local

如应用需要访问多个外部服务,每个服务都有不同的 DNS 服务器,可为每个需要特殊 DNS 配置的服务单独设置 Pod 的 dnsConfig。这样,每个服务都可以指向正确的 DNS 服务器。

修改 DNS 配置对集群中的 Pod 影响问题,如果修改的是 CoreDNS 的全局配置,那么这些更改将影响所有使用集群内 DNS 服务的 Pod。如果只修改特定 Pod 的dnsConfig,则仅影响该 Pod。