DNS策略配置和域名解析說明
本文介紹如何針對不同的場景使用dnsPolicy字段為集群的Pod配置DNS策略,以及如何使用HostAliases
字段在容器Pod內(nèi)部解析域名到固定IP地址。
前提條件
已創(chuàng)建ACK托管集群或ACK Serverless集群。具體操作,請參見創(chuàng)建ACK托管集群、容器服務(wù) Serverless 版使用快速入門。
背景信息
集群DNS域名解析原理詳情,請參見Kubernetes集群中DNS域名解析原理。
ACK集群默認(rèn)部署了一套CoreDNS工作負(fù)載,并通過kube-dns的服務(wù)名暴露DNS服務(wù)。ACK部署的CoreDNS工作負(fù)載后端是兩個(gè)名為coredns的Pod,集群會根據(jù)Pod內(nèi)的配置,將域名請求發(fā)送至集群DNS服務(wù)器獲取結(jié)果。
可以執(zhí)行以下命令查看kube-dns的服務(wù)詳情。
kubectl get svc kube-dns -n kube-system
可以執(zhí)行以下命令查看CoreDNS的Pod的詳情。
kubectl get deployment coredns -n kube-system
使用dnsPolicy字段為集群的Pod配置DNS策略
ACK支持通過dnsPolicy字段為每個(gè)Pod配置不同的DNS策略。目前ACK集群支持四種策略:
ClusterFirst:這是默認(rèn)的DNS策略,意味著當(dāng)Pod需要進(jìn)行域名解析時(shí),首先會查詢集群內(nèi)部的CoreDNS服務(wù)。通過CoreDNS來做域名解析,表示Pod的/etc/resolv.conf文件被自動配置指向kube-dns服務(wù)地址。
None:使用該策略,Kubernetes會忽略集群的DNS策略。需要您提供dnsConfig字段來指定DNS配置信息,否則Pod可能無法正確解析任何域名。
Default:Pod直接繼承集群節(jié)點(diǎn)的域名解析配置。即在ACK集群直接使用ECS的/etc/resolv.conf文件(文件內(nèi)配置的是阿里云DNS服務(wù))。
ClusterFirstWithHostNet:強(qiáng)制在hostNetwork網(wǎng)絡(luò)模式下使用ClusterFirst策略(默認(rèn)使用Default策略)。
針對上述四種策略,本文列舉四種場景分別介紹如何配置dnsPolicy。
場景一:使用ACK集群提供的CoreDNS來做域名解析
如需使用ACK集群提供的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配置
當(dāng)您需要給Deployment類型的工作負(fù)載指定DNS配置時(shí),可使用dnsPolicy: None
策略。示例配置如下:
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.xx.xx"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "2"
其中,dnsConfig中的參數(shù)說明如下:
參數(shù) | 描述 |
nameservers | 將用作Pod的DNS服務(wù)器的IP地址列表。最多可以指定3個(gè)IP地址。當(dāng)Pod的dnsPolicy設(shè)置為 |
searches | Pod中主機(jī)名查找的DNS搜索域列表。此屬性是可選的。指定后,提供的列表將合并到從所選DNS策略生成的基本搜索域名中,并刪除重復(fù)的域名。Kubernetes最多允許6個(gè)搜索域。 說明 當(dāng)DNS Server不可達(dá)時(shí),僅會嘗試第一個(gè)搜索域。 |
options | 可選的對象列表,其中每個(gè)對象可以具有name屬性(必需)和value屬性(可選)。此屬性中的內(nèi)容將合并到從指定的DNS策略生成的選項(xiàng)中,并刪除重復(fù)的條目。關(guān)于options更多詳細(xì)信息,請參見DNS解析及緩存策略說明。 |
更多信息,請參見Kubernetes官網(wǎng)的DNS配置說明。
場景三:采用阿里云ECS的DNS配置
當(dāng)您的應(yīng)用Pod不需要訪問集群內(nèi)的其他服務(wù),只需要通過阿里云DNS來做解析,也不希望DNS解析經(jīng)過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
場景四:在HostNetwork網(wǎng)絡(luò)模式下訪問集群服務(wù)
如果您的應(yīng)用Pod使用hostNetwork:true來配置網(wǎng)絡(luò),Pod中運(yùn)行的應(yīng)用程序可以直接看到宿主機(jī)的網(wǎng)絡(luò)接口,其DNS策略默認(rèn)為Default,不能訪問集群內(nèi)的服務(wù)。如果您希望在此網(wǎng)絡(luò)模式下訪問集群內(nèi)服務(wù),可使用dnsPolicy: ClusterFirstWithHostNet
策略。示例配置如下:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
使用HostAliases
字段在容器Pod內(nèi)部解析域名到固定IP地址
在容器Pod內(nèi)部解析域名到固定IP地址有如下兩種方法:
全局配置(影響整個(gè)集群中所有Pod對特定域名的解析結(jié)果):當(dāng)您希望在容器Pod內(nèi)部解析某一域名到固定IP地址時(shí),可以在CoreDNS啟用hosts插件,具體操作,請參見CoreDNS的擴(kuò)展配置。
針對單個(gè)Pod的配置:若您希望僅在某個(gè)容器Pod內(nèi)部解析域名到固定IP地址生效,您可以通過HostAliases字段修改容器Pod內(nèi)的/etc/hosts文件實(shí)現(xiàn)該操作。示例配置如下:
apiVersion: v1 kind: Pod metadata: name: hostaliases-pod spec: hostAliases: - ip: "127.0.**.**" hostnames: - "foo.local" - "bar.local" - ip: "10.1.**.**" hostnames: - "foo.remote" containers: - name: cat-hosts image: busybox:1.28 command: - cat args: - "/etc/hosts"
當(dāng)為Pod的spec字段中增加
hostAliases
字段后,Pod啟動后/etc/hosts文件會被初始化成以下內(nèi)容。# Kubernetes-managed hosts file. 127.0.**.** localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 10.200.**.** hostaliases-pod # Entries added by HostAliases. 127.0.**.** foo.local bar.local 10.1.**.** foo.remote bar.remote
可以看到,foo.local、bar.local、foo.remote域名都已經(jīng)綁定到固定的IP。
相關(guān)文檔
關(guān)于更多DNS配置調(diào)優(yōu)操作,請參見DNS最佳實(shí)踐。
如需了解DNS解析及緩存策略,請參見DNS解析及緩存策略說明。