使用Annotation配置自定义DNS

更新时间:2025-03-05 01:52:40

如果您需要使用自建DNS服务来解析镜像仓库以及其他应用的域名,需要将ACS Pod使用的DNS配置为您自建的DNS服务器。本文介绍如何为ACS Pod配置自定义DNS。

适用范围

以下3种情况可以通过Annotation配置自定义DNS:

  • 场景一:使用DefaultDNS策略,并且希望在集群层面通过acs-profile统一做自定义DNS配置。

  • 场景二:使用ClusterFirstDNS策略,同时需要从自建DNS服务器解析镜像仓库的域名,用于拉取镜像。

  • 场景三:使用DefaultDNS策略,并且希望在集群层面通过acs-profile统一做自定义DNS配置, 同时需要从自建DNS服务器解析镜像仓库的域名,用于拉取镜像。

不适用范围:

  • 希望使用云解析的DNS服务器域名来解析包括应用层的解析以及镜像仓库域名的解析。推荐直接使用DefaultDNS策略, 不需要额外自定义DNS。

  • 希望使用自建DNS服务解析域名, 但是仍然希望使用云解析的DNS服务器来做镜像拉取时的镜像仓库域名的解析,同时希望在应用层面做单独的自定义DNS配置。推荐使用NoneDNS策略, 通过Pod Spec中的dnsConfig字段来设置自建DNS服务器。 具体操作,请参见场景二:Pod层面自定义DNS配置

配置说明

重要

以下内容仅为了演示Annotation的使用方法。在实际应用场景中,一般不会单独在PodDeployment上通过Annotation来配置自定义DNS, 而是通过acs-profile等机制在集群层面统一配置。

您可以在Pod metadata中添加network.alibabacloud.com/custom-dnsconfigAnnotation来指定ACS Pod使用自定义DNS。该Annotation的取值格式为标准Kubernetes spec.dnsConfig结构{"servers":["20.1.xx.xx","30.1.xx.xx"],"searches":["xx.com","yy.com"],"options":["ndots:2","edns0"]}

配置整体结构如下:

{
    "servers": [
        "20.1.xx.xx",
        "30.1.xx.xx"
    ],
    "searches": [
        "xx.com",
        "yy.com"
    ],
    "options": [
        "ndots:2",
        "edns0"
    ]
}

各字段说明如下:

key

value

子项

类型

示例值

描述

key

value

子项

类型

示例值

描述

network.alibabacloud.com/custom-dnsconfig

{"servers":["20.1.xx.xx","30.1.xx.xx"],"searches":["xx.com","yy.com"],"options":["ndots:2","edns0"]}

servers

[]String

["20.1.xx.xx","30.1.xx.xx"]

DNS服务器的IP地址列表。仅支持填入2IP地址,多余的会自动忽略。

同时,系统会在最后自动追加阿里云DNS服务器的IP地址,以保证系统服务正常。

searches

[]String

["xx.com","yy.com"]

DNS搜索域列表。最多允许32个。

进行域名解析时,如果输入的域名不完整,系统会自动尝试使用该列表中的域名后缀来补全并进行解析。

options

[]String

["ndots:2","edns0"]

DNS解析选项。可包含多个Key:Value值。以下为一些常见选项:

  • ndots:设置DNS在主机名中必须至少包含多少个点号(.)才会将其视为绝对域名,否则会尝试在搜索域中进行解析。

  • edns0:开启EDNS0扩展支持,以支持更大的UDP数据包大小和提高安全性。

  • timeout:设置DNS查询超时时间。

  • attempts:设置DNS查询尝试次数。

重要

请您根据实际业务需求为Pod配置dnsPolicy。例如,当您的需求与场景二匹配时,您需要配置dnsPolicyClusterFirst

若修改配置后,PodPending并报错InternalError,请检查您的配置内容是否正确。

操作步骤

下面以无状态应用为例:

  1. 使用以下内容,创建deploy.yaml。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: test
      name: test-default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          annotations:
            network.alibabacloud.com/custom-dnsconfig: '{"servers":["20.1.XXX.XXX","30.1.X.X"],"searches":["xx.com","yy.com"],"options":["ndots:2","edns0"]}'
          labels:
            app: test
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
            command: ["sh","-c","i=1; while true; do echo $i; i=$((i=i+1)); sleep 1; done;"]
            name: busybox
            resources:
              requests:
                cpu: "2"
                memory: "8Gi"
              limits:
                cpu: "2"
                memory: "8Gi"
          dnsPolicy: Default
  2. 部署应用 。

    kubectl apply -f deploy.yaml
  3. 查看结果

    kubectl  exec  <pod name>  cat /etc/resolv.conf

    预期输出:

    search xx.com yy.com
    nameserver 20.1.XXX.XXX
    nameserver 30.1.XXX.XXX
    nameserver 100.100.2.136
    options ndots:6 edns

集群统一配置说明

acs-profile支持配置Pod的自动注入,包括域名解析模式的集群维度的配置。 以下展示了一个通过acs-profile统一为default命名空间的Pod,自动注入自定义DNS配置的方法。应用此配置后,Pod/Deployment不再需要添加Annotation,只需要将dnsPolicy设置为Default。acs-profile的详细用法,请参见配置acs-profile实现Pod配置自动注入

apiVersion: v1
kind: ConfigMap
metadata:
  name: acs-profile
  namespace: kube-system
data:
  selectors: |
    [
      {
        "name": "selector-demo1",
        "namespaceSelector": {
          "matchLabels": {
            "kubernetes.io/metadata.name": "default"
          }
        },
        "effect": {
          "annotations": {
            "network.alibabacloud.com/custom-dnsconfig": "{\"servers\":[\"20.1.XXX.XXX\",\"30.1.X.X\"],\"searches\":[\"xx.com\",\"yy.com\"],\"options\":[\"ndots:2\",\"edns0\"]}"
          }
        }
      }
    ]
  • 本页导读 (0)
  • 适用范围
  • 配置说明
  • 操作步骤
  • 集群统一配置说明
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等