ACS Pod配置自定义DNS

如果需要使用内网的镜像仓库来拉取镜像,或者容器需要访问内网中的域名,则需要配置ACS Pod使用的DNS为用户内网DNS,以便解析内网域名。本文介绍如何为ACS Pod配置自定义DNS。

适用范围

可以在以下三种情况下配置自定义DNS:

  • 使用默认DNS策略且未指定DNS配置:如果集群已配置 dnsPolicy=Default 且未指定任何DNS配置,则默认情况下将使用云解析的DNS服务器地址。

  • 使用默认DNS策略但指定了DNS配置:如果集群已配置 dnsPolicy=Default 并且指定了DNS配置,可以自定义DNS服务器地址。

  • 使用自建DNS服务器拉取镜像:如果需要从使用了自建DNS服务器解析域名的自建镜像仓库中拉取镜像,则应配置自定义DNS。

配置说明

您可以在Pod metadata中添加network.alibabacloud.com/custom-dnsconfig的Annotation来指定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

子项

类型

示例值

描述

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地址列表。仅支持填入2个IP地址,多余的会自动忽略。

同时,系统会在最后自动追加阿里云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且配置了CoreDNS时,只适用场景3。

当配置错误,Pod会Pending并报错InternalError。请检查配置

操作步骤

下面以无状态应用为例:

通过控制台使用

  1. 登录容器计算服务控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面,单击使用镜像创建

  4. 在您填写完应用基本信息后,点击下一步

  5. 填写完容器配置后,点击下一步

  6. 高级配置页面中,根据您自己的需求,在Pod注解中填入上述配置,比如您需要配置network.alibabacloud.com/custom-dnsconfig,按照下图完成配置后,单击创建按钮。image

通过kubectl配置

  1. 生成应用配置

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":["114.114.114.114","8.8.8.8"],"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
  1. 创建应用

    kubectl apply -f deploy.yaml
  2. 观察pod

    kubectl get pod -w
  3. 查看结果

    kubectl  exec  <pod name>  cat /etc/resolv.conf
    # 预期输出
    search xx.com yy.com
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    nameserver 100.100.2.136
    options ndots:6 edns
说明

注意: 无法通过控制台修改dnsPolicy