DNS策略配置和域名解析说明

本文介绍如何在容器计算服务 ACS(Container Compute Service)中针对不同的场景使用dnsPolicy字段为集群的Pod配置DNS策略。

背景信息

集群DNS域名解析原理详情,请参见Kubernetes集群中DNS域名解析原理

ACS集群下CoreDNS部署在云托管侧,并通过kube-dns的服务名暴露DNS服务。集群会根据Pod内的配置,将域名请求发送至集群DNS服务器获取结果。可以执行以下命令查看kube-dns的服务详情。

kubectl get svc kube-dns -n kube-system

使用dnsPolicy字段为集群的Pod配置DNS策略

ACS支持通过dnsPolicy字段为每个Pod配置不同的DNS策略。目前ACS集群支持四种策略:

  • ClusterFirst:这是默认的DNS策略,意味着当Pod需要进行域名解析时,首先会查询集群内部的CoreDNS服务。通过CoreDNS来做域名解析,表示Pod的/etc/resolv.conf文件被自动配置指向kube-dns服务地址。

  • None:使用该策略,Kubernetes会忽略集群的DNS策略。需要您提供dnsConfig字段来指定DNS配置信息,否则Pod可能无法正确解析任何域名。

  • Default:采用阿里云云解析来提供DNS服务。

  • ClusterFirstWithHostNet:ACS不支持hostnetwork,当dnsPolicy配置为ClusterFirstWithHostNet 时,等同于dnsPolicy配置为ClusterFirst 。具体内容,请参见Kubernetes应用限制

针对上述策略,本文列举三种场景分别介绍如何配置dnsPolicy。

场景一:使用ACS集群提供的CoreDNS来做域名解析

如需使用ACS集群提供的CoreDNS来做域名解析,可使用dnsPolicy: ClusterFirst策略。示例配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine # 此镜像仅作为示例,请替换后再进行验证。
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: ClusterFirst

场景二:Pod层面自定义DNS配置

当您需要使用自定义DNS配置时,可使用dnsPolicy: NonednsConfig策略。示例配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine # 此镜像仅作为示例,请替换后再进行验证。
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: None
  dnsConfig:
    nameservers: ["169.254.xxx.xxx"]
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local
    options:
    - name: ndots
      value: "2"

其中,dnsConfig中的参数说明如下:

参数

描述

nameservers

  • 将用作Pod的DNS服务器的IP地址列表,最多可以指定3个IP地址。

  • 当Pod的dnsPolicy设置为None时,列表必须至少包含一个IP地址,否则此属性是可选的。

  • 列出的DNS的IP列表将合并到基于dnsPolicy生成的域名解析文件的nameserver字段中,并删除重复的地址。

searches

  • Pod中主机名查找的DNS搜索域列表,此属性是可选的。

  • 指定后,提供的列表将合并到从所选DNS策略生成的基本搜索域名中,并删除重复的域名。

  • Kubernetes最多允许6个搜索域。

options

  • 可选的对象列表,其中每个对象可以具有name属性(必需)和value属性(可选)。

  • 此属性中的内容将合并到从指定的DNS策略生成的选项中,并删除重复的条目。

更多信息,请参见Kubernetes官网的DNS配置说明

场景三:采用阿里云云解析来提供DNS服务

当您的应用Pod不需要访问集群内的其他服务,只需要通过阿里云DNS来做解析,也不希望DNS解析经过CoreDNS,可以采用dnsPolicy: Default策略。示例配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine # 此镜像仅作为示例,请替换后再进行验证。
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: Default

相关文档

关于DNS解析及缓存策略的相关内容,请参见DNS解析及缓存策略说明