溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

K8S 運(yùn)維技巧--DNS 部分;

發(fā)布時(shí)間:2020-07-03 22:36:20 來(lái)源:網(wǎng)絡(luò) 閱讀:2876 作者:breaklinux 欄目:系統(tǒng)運(yùn)維


一.自定義dns ;

1.介紹;
2.怎樣獲取dns?名字;
3.支持的?DNS?模式;
4.自定義dns;

1.介紹

Kubernetes DNS 在群集上調(diào)度 DNS Pod 和服務(wù),并配置 kubelet 以告知各個(gè)容器使用 DNS 服務(wù)的 IP 來(lái)解析 DNS 名稱。

2.怎樣獲取 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

A 記錄

“正常” 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)行選擇。

SRV 記錄

命名端口需要?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。


Pods

Pod的 hostname 和 subdomain 字段

當(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?的值。


4.Pod 的 DNS 設(shè)定

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ì);

K8S 運(yùn)維技巧--DNS 部分;

(2).運(yùn)行dns ymal

K8S 運(yùn)維技巧--DNS 部分;

(3).測(cè)試解析dns;

K8S 運(yùn)維技巧--DNS 部分;


(4).創(chuàng)建上面的Pod后,容器?test?會(huì)在其?/etc/resolv.conf?文件中獲取以下內(nèi)容:

K8S 運(yùn)維技巧--DNS 部分;



二.通過(guò)?kube-dns 配置私有dns;

1.準(zhǔn)備開(kāi)始
2.配置存根域和上游?DNS?服務(wù)器
3.理解?Kubernetes?中名字解析
4.ConfigMap?選項(xiàng)

在 Kubernetes 中配置私有 DNS 和上游域名服務(wù)器

準(zhǔn)備開(kāi)始

  • 你必須擁有一個(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?插件。

配置存根域和上游 DNS 服務(wù)器

部署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?

K8S 運(yùn)維技巧--DNS 部分;

(3).注意kube-dns 鏡像需要進(jìn)行進(jìn)行獲取;


K8S 運(yùn)維技巧--DNS 部分;


通過(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.localkube-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ì)信息。

理解 Kubernetes 中名字解析

可以為每個(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”。

“Default” DNS 策略

如果?dnsPolicy?被設(shè)置為 “Default”,則名字解析配置會(huì)繼承自 Pod 運(yùn)行所在的節(jié)點(diǎn)。 自定義上游域名服務(wù)器和存根域不能夠與這個(gè)策略一起使用。

“ClusterFirst” DNS 策略

如果?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)行路由:

  1. 查詢首先被發(fā)送到 kube-dns 中的 DNS 緩存層。

  2. 從緩存層,檢查請(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)。

K8S 運(yùn)維技巧--DNS 部分;

ConfigMap 選項(xiàng)

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?字段。

示例:上游域名服務(wù)器

在這個(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"]


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI