全部產品
Search
文件中心

Container Compute Service:使用Annotation配置自訂DNS

更新時間:Mar 06, 2025

如果您需要使用自建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的使用方法。在實際應用情境中,一般不會單獨在Pod和Deployment上通過Annotation來配置自訂DNS, 而是通過acs-profile等機制在叢集層面統一配置。

您可以在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

若修改配置後,Pod會Pending並報錯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\"]}"
          }
        }
      }
    ]