如果您需要使用自建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 | []String |
| DNS伺服器的IP地址清單。僅支援填入2個IP地址,多餘的會自動忽略。 同時,系統會在最後自動追加阿里雲DNS伺服器的IP地址,以保證系統服務正常。 |
searches | []String |
| DNS搜尋域列表。最多允許32個。 進行網域名稱解析時,如果輸入的網域名稱不完整,系統會自動嘗試使用該列表中的網域名稱尾碼來補全並進行解析。 | ||
options | []String |
| DNS解析選項。可包含多個Key:Value值。以下為一些常見選項:
|
請您根據實際業務需求為Pod配置dnsPolicy。例如,當您的需求與情境二匹配時,您需要配置dnsPolicy為ClusterFirst。
若修改配置後,Pod會Pending並報錯InternalError,請檢查您的配置內容是否正確。
操作步驟
下面以無狀態應用為例:
使用以下內容,建立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部署應用 。
kubectl apply -f deploy.yaml查看結果
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\"]}"
}
}
}
]