KubernetesDNS的示例分析

這篇文章給大家分享的是有關(guān)Kubernetes DNS的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過(guò)十多年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都網(wǎng)站建設(shè)、網(wǎng)站制作、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

環(huán)境

$ sudo lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.2 LTS
Release:	16.04
Codename:	xenial

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:34:32Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}

介紹

從Kubernetes 1.3開始,DNS通過(guò)使用插件管理系統(tǒng)cluster add-on,成為了一個(gè)內(nèi)建的自啟動(dòng)服務(wù)。
  Kubernetes DNS在Kubernetes集群上調(diào)度了一個(gè)DNS Pod和Service,并配置kubelet,使其告訴每個(gè)容器使用DNS Service的Ip來(lái)解析DNS名稱。

什么是DNS名稱

集群中定義的每個(gè)Service(包括DNS Service它自己)都被分配了一個(gè)DNS名稱。默認(rèn)的,Pod的DNS搜索列表中會(huì)包含Pod自己的命名空間和集群的默認(rèn)域,下面我們用示例來(lái)解釋以下。
  假設(shè)有一個(gè)名為foo的Service,位于命名空間bar中。運(yùn)行在bar命名空間中的Pod可以通過(guò)DNS查找foo關(guān)鍵字來(lái)查找到這個(gè)服務(wù),而運(yùn)行在命名空間quux中的Pod可以通過(guò)關(guān)鍵字foo.bar來(lái)查找到這個(gè)服務(wù)。

支持的DNS模式

下面的章節(jié)詳細(xì)的描述了支持的記錄(record)類型和layout。

Services

普通(非headless)的Service都被分配了一個(gè)DNS記錄,該記錄的名稱格式為my-svc.my-namespace.svc.cluster.local,通過(guò)該記錄可以解析出服務(wù)的集群IP。
  Headless(沒(méi)有集群IP)的Service也被分配了一個(gè)DNS記錄,名稱格式為my-svc.my-namespace.svc.cluster.local。與普通Service不同的是,它會(huì)解析出Service選擇的Pod的IP列表。

SRV records

SRV records用于為命名端口服務(wù),這些端口是headless或者普通Service的一部分。對(duì)于每個(gè)命名端口,SRV record的格式為:_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local。對(duì)于普通服務(wù)來(lái)說(shuō),這會(huì)解析出端口號(hào)和CNAMEmy-svc.my-namespace.svc.cluster.local。對(duì)于headless服務(wù)來(lái)說(shuō),這會(huì)解析出多個(gè)結(jié)果,一個(gè)是service后端的每個(gè)pod,一個(gè)是包含端口號(hào),和格式為auto-generated-name.my-svc.my-namespace.svc.cluster.local的pod的CNAME。

向后兼容性

kube-dns的之前版本,使用了格式為my-svc.my-namespace.cluster.local(svc這一層是后面加上的)的名稱。但這種格式不再被支持了。

Pods

pod會(huì)被分配一個(gè)DNS記錄,名稱格式為pod-ip-address.my-namespace.pod.cluster.local。
  比如,一個(gè)pod,它的IP地址為1.2.3.4,命名空間為default,DNS名稱為cluster.local,那么它的記錄就是:1-2-3-4.default.pod.cluster.local。
  當(dāng)pod被創(chuàng)建時(shí),它的hostname設(shè)置在Pod的metadata.name中(寫yaml的時(shí)候應(yīng)該很清楚這點(diǎn))。
  在v1.2版本中,用戶可以指定一個(gè)Pod注解,pod.beta.kubernetes.io/hostname,用于指定Pod的hostname。這個(gè)Pod注解,一旦被指定,就將優(yōu)先于Pod的名稱,成為pod的hostname。比如,一個(gè)Pod,其注解為pod.beta.kubernetes.io/hostname: my-pod-name,那么該P(yáng)od的hostname會(huì)被設(shè)置為my-pod-name。
  v1.2中還引入了一個(gè)beta特性,用戶指定Pod注解,pod.beta.kubernetes.io/subdomain,來(lái)指定Pod的subdomain。比如,一個(gè)Pod,其hostname注解設(shè)置為“foo”,subdomain注解為“bar”,命名空間為“my-namespace”,那么它最終的FQDN就是“foo.bar.my-namespace.svc.cluster.local”。
  在v1.3版本中,PodSpec有了hostnamesubdomain字段,用于指定Pod的hostname和subdomain。它的優(yōu)先級(jí)則高于上面提到的pod.beta.kubernetes.io/hostnamepod.beta.kubernetes.io/subdomain
  示例:

apiVersion: v1
kind: Service
metadata:
  name: default-subdomain
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
    - name: foo # Actually, no port is needed.
      port: 1234 
      targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: default-subdomain
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: default-subdomain
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    name: busybox

如果一個(gè)headless service中,多個(gè)pod都在同一個(gè)命名空間里,并且subdomain名稱也相同,集群的KubeDNS還是會(huì)為每個(gè)Pod返回完整而合格的hostname。給定一個(gè)Pod,其hostname設(shè)置為busybox-1,subdomain設(shè)置為default-subdomain,同一個(gè)命名空間中的headless Service名為default-subdomain,那么pod自己的FQDN就是“busybox-1.default-subdomain.my-namespace.svc.cluster.local”。
  在Kubernetes v1.2里,Endpoint對(duì)象還使用了注解endpoints.beta.kubernetes.io/hostnames-map。它的值就是json格式中的map[string(IP)][endpoints.HostRecord], 比如 ‘{“10.245.1.6”:{HostName: “my-webserver”}}’。如果Endpoint是用于headless service的,就會(huì)為其創(chuàng)建一個(gè)格式為...svc的記錄。以json格式為例,如果Endpoint用于名為“bar”的headless service,其中一個(gè)Endpoint的ip為“10.245.1.6”,就會(huì)創(chuàng)建一個(gè)名為“my-webserver.bar.my-namespace.svc.cluster.local”的記錄,查詢?cè)撚涗浘蜁?huì)得到“10.245.1.6”。這個(gè)Endpoint注解一般不需要終端用戶來(lái)指定,但可以被內(nèi)部服務(wù)控制器使用,來(lái)實(shí)現(xiàn)上面的特性。
  在v1.3中,Endpoint對(duì)象可以為任何一個(gè)Endpoint指定hostname和IP。hostname字段會(huì)覆蓋endpoints.beta.kubernetes.io/hostnames-map注解的值。
  在v1.3中,以下注解被棄用了:pod.beta.kubernetes.io/hostnamepod.beta.kubernetes.io/subdomain, endpoints.beta.kubernetes.io/hostnames-map。

如何測(cè)試DNS是否工作

創(chuàng)建一個(gè)簡(jiǎn)單地Pod,使用測(cè)試環(huán)境

創(chuàng)建一個(gè)名為busybox.yaml文件,使用下面的內(nèi)容:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

使用該文件創(chuàng)建pod:

kubectl create -f busybox.yaml

等待pod進(jìn)入running狀態(tài)

獲取pod狀態(tài):

$ kubectl get pods busybox

你會(huì)看到:

NAME      READY     STATUS    RESTARTS   AGE
busybox   1/1       Running   0          7m

確認(rèn)DNS是否工作

一旦pod處于running狀態(tài)時(shí),可以使用exec nslookup來(lái)查詢狀態(tài):

$ kubectl exec -ti busybox -- nslookup kubernetes.default

你應(yīng)該看到類似的結(jié)果:

Server:    10.0.0.10
Address 1: 10.0.0.10

Name:      kubernetes.default
Address 1: 10.0.0.1

如果出現(xiàn)上述結(jié)果,則說(shuō)明DNS正常工作。

故障排查

如果nslookup失敗,檢查以下選項(xiàng):

檢查本地DNS配置

檢查pod的resolv.conf文件。

$ kubectl exec busybox cat /etc/resolv.conf

確認(rèn)搜索路徑和name sever被設(shè)置成類似下面的樣子(注意搜索路徑可能因云提供商不同而有所差異):

search default.svc.cluster.local svc.cluster.local cluster.local google.internal c.gce_project_id.internal
nameserver 10.0.0.10
options ndots:5

快速診斷

如下的錯(cuò)誤表明kube-dns add-on或者相關(guān)服務(wù)有問(wèn)題:

$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.0.0.10
Address 1: 10.0.0.10

nslookup: can't resolve 'kubernetes.default'

或者

$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

nslookup: can't resolve 'kubernetes.default'

檢查DNS pod是否運(yùn)行

使用kubectl get pods命令來(lái)確認(rèn)DNS pod是否正在運(yùn)行。

$ kubectl get pods --namespace=kube-system -l k8s-app=kube-dns

應(yīng)該會(huì)有如下的結(jié)果:

NAME                                                       READY     STATUS    RESTARTS   AGE
...
kube-dns-v19-ezo1y                                         3/3       Running   0           1h
...

如果沒(méi)有相關(guān)的pod運(yùn)行,或者pod狀態(tài)為failed/completed,那么就說(shuō)明你的環(huán)境下,沒(méi)有默認(rèn)部署DNS add-on,你需要手動(dòng)部署它。

檢查DNS pod中的錯(cuò)誤

使用kubectl log命令來(lái)查看DNS守護(hù)程序的日志。

$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c healthz

如果有任何可疑的日志,每一行開頭的W,E,F(xiàn)字母分別表示警告、錯(cuò)誤和故障。請(qǐng)搜索這些錯(cuò)誤日志的條目,或者通過(guò)kubernetes issues頁(yè)面來(lái)報(bào)錯(cuò)非預(yù)期的錯(cuò)誤。

DNS服務(wù)是否啟動(dòng)

使用kubectl get service命令來(lái)查看DNS服務(wù)是否已經(jīng)啟動(dòng)。

$ kubectl get svc --namespace=kube-system

你會(huì)看到:

NAME                    CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
...
kube-dns                10.0.0.10      <none>        53/UDP,53/TCP        1h
...

該服務(wù)會(huì)默認(rèn)地被創(chuàng)建,或者如果你手動(dòng)創(chuàng)建了該服務(wù),但是該服務(wù)卻并沒(méi)有在上述命令中出現(xiàn),請(qǐng)查看 debugging services page頁(yè)面獲取更多信息。

是否暴露了DNS Endpoint?

可通過(guò)kubectl get endpoints命令來(lái)確認(rèn)是否暴露了DNS Endpoint。

$ kubectl get ep kube-dns --namespace=kube-system

你應(yīng)該會(huì)看到下面的結(jié)果:

NAME       ENDPOINTS                       AGE
kube-dns   10.180.3.17:53,10.180.3.17:53    1h

如果沒(méi)有看到Endpoint,那么請(qǐng)查看debugging services page頁(yè)面。
  若要查看更多的Kubernetes DNS示例,請(qǐng)?jiān)贙ubernetes Github倉(cāng)庫(kù)中查看cluster-dns examples。

如何工作

運(yùn)行的Kubernetes DNS pod包含3個(gè)容器——kubedns、dnsmasq和一個(gè)叫做healthz的健康檢查容器。kubedns進(jìn)程監(jiān)視Kubernetes master上Service和Endpoint的改變,并在內(nèi)存中維護(hù)lookup 結(jié)構(gòu)用于服務(wù)DNS請(qǐng)求。dnsmasq容器增加DNS緩存,從而提升性能。healthz容器提供一個(gè)單點(diǎn)的健康檢查Endpoint,檢查dnsmasq和kubedns的健康程度。
  DNS pod以服務(wù)的形式暴露出來(lái),它擁有一個(gè)靜態(tài)IP。一旦被創(chuàng)建,kubelet就使用--cluster-dns=10.0.0.10標(biāo)識(shí),將DNS配置信息傳遞給每個(gè)容器。
  DNS名稱也需要域。本地域是可以配置的,在kubelet中,使用--cluster-domain=<default local domain>參數(shù)。
  Kubernetes集群的DNS服務(wù)(基于SkyDNS庫(kù))支持forward lookup(A recoreds),service lookup(SRV records)和反向IP地址查找(PTR recoreds)。

從node繼承DNS

當(dāng)運(yùn)行pod時(shí),kubelet會(huì)預(yù)先考慮集群的DNS服務(wù),并在node本地的DNS設(shè)置中搜索路徑。如果node能夠解析DNS名稱,那么pod也可以做到。
  如果你希望在pod中使用不同的DNS,那么你可以使用kubelet的--resolv-conf參數(shù)。該設(shè)置意味著pod不會(huì)從node繼承DNS。設(shè)置該值為其他的文件路徑,意味著會(huì)使用該文件來(lái)配置DNS,而不是/etc/resolv.conf。

已知的問(wèn)題

Kubernetes安裝默認(rèn)并不會(huì)使用集群的DNS配置來(lái)設(shè)置Kubernetes node的resolv.conf文件,因?yàn)樵撨M(jìn)程依賴于發(fā)行版的配置。
  Linux的libc有著3個(gè)DNS nameserver和6個(gè)DNS搜索記錄的限制,Kubernetes需要消耗一個(gè)nameserver和3個(gè)搜索記錄。這意味著如果一個(gè)本地配置已經(jīng)使用了3個(gè)nameserver或者使用了3個(gè)以上的搜索記錄,那么這些配置可能會(huì)丟失。有一個(gè)臨時(shí)方案,node可以運(yùn)行dnsmasq,它可以提供更多的nameserver選項(xiàng),但不能提供更多的搜索選項(xiàng)。你也可以使用kubelet的--resolv-conf選項(xiàng)。
  如果你使用的是Alpine 3.3或更早的版本,DNS可能不能正常的工作,這是已知的問(wèn)題。

感謝各位的閱讀!關(guān)于“Kubernetes DNS的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

本文題目:KubernetesDNS的示例分析
本文網(wǎng)址:http://muchs.cn/article48/ghepep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航、軟件開發(fā)、網(wǎng)站收錄、面包屑導(dǎo)航、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)