您好,登錄后才能下訂單哦!
一.自定義dns ;
1.介紹; 2.怎樣獲取dns?名字; 3.支持的?DNS?模式; 4.自定義dns;
Kubernetes DNS 在群集上調(diào)度 DNS Pod 和服務(wù),并配置 kubelet 以告知各個(gè)容器使用 DNS 服務(wù)的 IP 來(lái)解析 DNS 名稱。
在集群中定義的每個(gè) Service(包括 DNS 服務(wù)器自身)都會(huì)被指派一個(gè) DNS 名稱。 默認(rèn),一個(gè)客戶端 Pod 的 DNS 搜索列表將包含該 Pod 自己的 Namespace 和集群默認(rèn)域。 通過(guò)如下示例可以很好地說(shuō)明:
假設(shè)在 Kubernetes 集群的 Namespace?bar
?中,定義了一個(gè)Service?foo
。 運(yùn)行在Namespace?bar
?中的一個(gè) Pod,可以簡(jiǎn)單地通過(guò) DNS 查詢?foo
?來(lái)找到該 Service。 運(yùn)行在 Namespace?quux
?中的一個(gè) Pod 可以通過(guò) DNS 查詢?foo.bar
?找到該 Service。
以下各節(jié)詳細(xì)介紹了受支持的記錄類型和支持的布局。 其中代碼部分的布局,名稱或查詢命令均被視為實(shí)現(xiàn)細(xì)節(jié),如有更改,恕不另行通知。 有關(guān)最新規(guī)范請(qǐng)查看?Kubernetes 基于 DNS 的服務(wù)發(fā)現(xiàn).
3.支持的 DNS 模式
下面各段詳細(xì)說(shuō)明支持的記錄類型和布局。 如果任何其它的布局、名稱或查詢,碰巧也能夠使用,這就需要研究下它們的實(shí)現(xiàn)細(xì)節(jié),以免后續(xù)修改它們又不能使用了。
“正常” Service(除了 Headless Service)會(huì)以?my-svc.my-namespace.svc.cluster-domain.example
?這種名字的形式被指派一個(gè) DNS A 記錄。 這會(huì)解析成該 Service 的 Cluster IP。
“Headless” Service(沒(méi)有Cluster IP)也會(huì)以?my-svc.my-namespace.svc.cluster-domain.example
?這種名字的形式被指派一個(gè) DNS A 記錄。 不像正常 Service,它會(huì)解析成該 Service 選擇的一組 Pod 的 IP。 希望客戶端能夠使用這一組 IP,否則就使用標(biāo)準(zhǔn)的 round-robin 策略從這一組 IP 中進(jìn)行選擇。
命名端口需要?jiǎng)?chuàng)建 SRV 記錄,這些端口是正常 Service或?Headless Services?的一部分。 對(duì)每個(gè)命名端口,SRV 記錄具有?_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example
?這種形式。 對(duì)普通 Service,這會(huì)被解析成端口號(hào)和 CNAME:my-svc.my-namespace.svc.cluster-domain.example
。 對(duì) Headless Service,這會(huì)被解析成多個(gè)結(jié)果,Service 對(duì)應(yīng)的每個(gè) backend Pod 各一個(gè), 包含?auto-generated-name.my-svc.my-namespace.svc.cluster-domain.example
?這種形式 Pod 的端口號(hào)和 CNAME。
當(dāng)前,創(chuàng)建 Pod 后,它的主機(jī)名是該 Pod 的?metadata.name
?值。
在 v1.2 版本中,用戶可以配置 Pod annotation, 通過(guò)?pod.beta.kubernetes.io/hostname
?來(lái)設(shè)置 Pod 的主機(jī)名。 如果為 Pod 配置了 annotation,會(huì)優(yōu)先使用 Pod 的名稱作為主機(jī)名。 例如,給定一個(gè) Pod,它具有 annotation?pod.beta.kubernetes.io/hostname: my-pod-name
,該 Pod 的主機(jī)名被設(shè)置為 “my-pod-name”。
在 v1.3 版本中,PodSpec 具有?hostname
?字段,可以用來(lái)指定 Pod 的主機(jī)名。這個(gè)字段的值優(yōu)先于 annotation?pod.beta.kubernetes.io/hostname
。 在 v1.2 版本中引入了 beta 特性,用戶可以為 Pod 指定 annotation,其中?pod.beta.kubernetes.io/subdomain
?指定了 Pod 的子域名。 最終的域名將是 “...svc.”。 舉個(gè)例子,Pod 的主機(jī)名 annotation 設(shè)置為 “foo”,子域名 annotation 設(shè)置為 “bar”,在 Namespace “my-namespace” 中對(duì)應(yīng)的 FQDN 為 “foo.bar.my-namespace.svc.cluster.local”。
在 v1.3 版本中,PodSpec 具有?subdomain
?字段,可以用來(lái)指定 Pod 的子域名。 這個(gè)字段的值優(yōu)先于 annotation?pod.beta.kubernetes.io/subdomain
?的值。
Pod 的 DNS 配置可讓用戶對(duì) Pod 的 DNS 設(shè)置進(jìn)行更多控制。
dnsConfig
?字段是可選的,它可以與任何?dnsPolicy
?設(shè)置一起使用。 但是,當(dāng) Pod 的?dnsPolicy
?設(shè)置為 “None
” 時(shí),必須指定?dnsConfig
?字段。
用戶可以在?dnsConfig
?字段中指定以下屬性:
nameservers
: 將用作于 Pod 的 DNS 服務(wù)器的 IP 地址列表。最多可以指定3個(gè) IP 地址。 當(dāng) Pod 的?dnsPolicy
?設(shè)置為 “None
” 時(shí),列表必須至少包含一個(gè)IP地址,否則此屬性是可選的。列出的服務(wù)器將合并到從指定的 DNS 策略生成的基本名稱服務(wù)器,并刪除重復(fù)的地址。
searches
: 用于在 Pod 中查找主機(jī)名的 DNS 搜索域的列表。此屬性是可選的。指定后,提供的列表將合并到根據(jù)所選 DNS 策略生成的基本搜索域名中。 重復(fù)的域名將被刪除。 ?? Kubernetes最多允許6個(gè)搜索域。
options
: 對(duì)象的可選列表,其中每個(gè)對(duì)象可能具有?name
?屬性(必需)和?value
?屬性(可選)。 此屬性中的內(nèi)容將合并到從指定的 DNS 策略生成的選項(xiàng)。 重復(fù)的條目將被刪除。
以下是具有自定義DNS設(shè)置的Pod示例
(1).dns yaml 配置詳細(xì);
(2).運(yùn)行dns ymal
(3).測(cè)試解析dns;
(4).創(chuàng)建上面的Pod后,容器?test
?會(huì)在其?/etc/resolv.conf
?文件中獲取以下內(nèi)容:
二.通過(guò)?kube-dns 配置私有dns;
1.準(zhǔn)備開(kāi)始 2.配置存根域和上游?DNS?服務(wù)器 3.理解?Kubernetes?中名字解析 4.ConfigMap?選項(xiàng)
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 如果你還沒(méi)有集群,你可以通過(guò)?Minikube?構(gòu)建一 個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
Katacoda
Play with Kubernetes
要獲知版本信息,請(qǐng)輸入?kubectl version
.
Kubernetes 1.6 及其以上版本。
集群必須配置使用?kube-dns
?插件。
部署kube-dns 步驟如下;
(1).獲取:kube-dns yaml
wget?https://raw.githubusercontent.com/feiskyer/kubernetes-handbook/master/manifests/kubedns/kube-dns.yaml?
(2).設(shè)置?kube-dns.yaml??clusterIP 集群ip地址 (參考:kubernetes 網(wǎng)斷中未使用ip地址)
kubectl get service --all-namespaces?
(3).注意kube-dns 鏡像需要進(jìn)行進(jìn)行獲取;
通過(guò)為 kube-dns (kube-system:kube-dns
)提供 ConfigMap,集群管理員能夠指定自定義存根域和上游域名服務(wù)器。
例如,下面的 ConfigMap 建立了一個(gè) DNS 配置,它具有一個(gè)單獨(dú)的存根域和兩個(gè)上游域名服務(wù)器:
apiVersion:?v1? kind:?ConfigMap? metadata:?? ????name:?kube-dns?? ????namespace:?kube-system? ????data:??stubDomains:?|???? ??????????????????????{"acme.local":?["1.2.3.4"]}?? ????????????????upstreamNameservers:?|???? ??????????????????????["8.8.8.8",?"8.8.4.4"]
按如上說(shuō)明,具有 “.acme.local” 后綴的 DNS 請(qǐng)求被轉(zhuǎn)發(fā)到 DNS 1.2.3.4。Google 公共 DNS服務(wù)器 為上游查詢提供服務(wù)。 下表描述了具有特定域名的查詢?nèi)绾斡成涞剿鼈兊哪繕?biāo) DNS 服務(wù)器:
域名 | 響應(yīng)查詢的服務(wù)器 |
---|---|
kubernetes.default.svc.cluster.local | kube-dns |
foo.acme.local | 自定義 DNS (1.2.3.4) |
widget.com | 上游 DNS (8.8.8.8, 8.8.4.4,其中之一) |
查看?ConfigMap 選項(xiàng)?獲取更多關(guān)于配置選項(xiàng)格式的詳細(xì)信息。
可以為每個(gè) Pod 設(shè)置 DNS 策略。 當(dāng)前 Kubernetes 支持兩種 Pod 特定的 DNS 策略:“Default” 和 “ClusterFirst”。 可以通過(guò)?dnsPolicy
?標(biāo)志來(lái)指定這些策略。?注意:“Default” 不是默認(rèn)的 DNS 策略。如果沒(méi)有顯式地指定?dnsPolicy
,將會(huì)使用 “ClusterFirst”。
如果?dnsPolicy
?被設(shè)置為 “Default”,則名字解析配置會(huì)繼承自 Pod 運(yùn)行所在的節(jié)點(diǎn)。 自定義上游域名服務(wù)器和存根域不能夠與這個(gè)策略一起使用。
如果?dnsPolicy
?被設(shè)置為 “ClusterFirst”,處理名字解析有所不同,*依賴于是否配置了存根域和上游 DNS 服務(wù)器*。
未進(jìn)行自定義配置:沒(méi)有匹配上配置的集群域名后綴的任何請(qǐng)求,例如 “www.kubernetes.io”,將會(huì)被轉(zhuǎn)發(fā)到繼承自節(jié)點(diǎn)的上游域名服務(wù)器。
進(jìn)行自定義配置:如果配置了存根域和上游 DNS 服務(wù)器(類似于?前面示例?配置的內(nèi)容),DNS 查詢將基于下面的流程對(duì)請(qǐng)求進(jìn)行路由:
查詢首先被發(fā)送到 kube-dns 中的 DNS 緩存層。
從緩存層,檢查請(qǐng)求的后綴,并根據(jù)下面的情況轉(zhuǎn)發(fā)到對(duì)應(yīng)的 DNS 上:
*具有集群后綴的名字*(例如 “.cluster.local”):請(qǐng)求被發(fā)送到 kube-dns。
*具有存根域后綴的名字*(例如 “.acme.local”):請(qǐng)求被發(fā)送到配置的自定義 DNS 解析器(例如:監(jiān)聽(tīng)在 1.2.3.4)。
*未能匹配上后綴的名字*(例如 “widget.com”):請(qǐng)求被轉(zhuǎn)發(fā)到上游 DNS(例如:Google 公共 DNS 服務(wù)器,8.8.8.8 和 8.8.4.4)。
kube-dns?kube-system:kube-dns
?對(duì)應(yīng)的 ConfigMap 選項(xiàng)如下所示:
字段 | 格式 | 描述 |
---|---|---|
stubDomains (可選) | 使用 DNS 后綴作為鍵(例如 “acme.local”)的 JSON map,以及由 DNS IP 的 JSON 數(shù)組組成的值。 | 目標(biāo)域名服務(wù)器可能是一個(gè) Kubernetes Service。例如,可以運(yùn)行自己的 dnsmasq 副本,將 DNS 名字暴露到 ClusterDNS namespace 中。 |
upstreamNameservers (可選) | DNS IP 的 JSON 數(shù)組。 | 注意:如果指定,則指定的值會(huì)替換掉被默認(rèn)從節(jié)點(diǎn)的?/etc/resolv.conf ?中獲取到的域名服務(wù)器。限制:最多可以指定三個(gè)上游域名服務(wù)器。 |
在這個(gè)例子中,用戶有一個(gè) Consul DNS 服務(wù)發(fā)現(xiàn)系統(tǒng),他們希望能夠與 kube-dns 集成起來(lái)。 Consul 域名服務(wù)器地址為 10.150.0.1,所有的 Consul 名字具有后綴 “.consul.local”。 要配置 Kubernetes,集群管理員只需要簡(jiǎn)單地創(chuàng)建一個(gè) ConfigMap 對(duì)象,如下所示:
apiVersion:?v1 kind:?ConfigMap? metadata:?? ?????name:?kube-dns??? ?????namespace:?kube-system? ?????data:??stubDomains:?|???? ??????????????{"consul.local":?["10.150.0.1"]}
注意,集群管理員不希望覆蓋節(jié)點(diǎn)的上游域名服務(wù)器,所以他們不會(huì)指定可選的?upstreamNameservers
?字段。
在這個(gè)示例中,集群管理員不希望顯式地強(qiáng)制所有非集群 DNS 查詢進(jìn)入到他們自己的域名服務(wù)器 172.16.0.1。 而且這很容易實(shí)現(xiàn):他們只需要?jiǎng)?chuàng)建一個(gè) ConfigMap,upstreamNameservers
?字段指定期望的域名服務(wù)器即可:
apiVersion:?v1? kind:?ConfigMap? metadata:?? ????name:?kube-dns?? ????namespace:?kube-system? data:??upstreamNameservers:?|??? ??????????["172.16.0.1"]
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。