本篇內(nèi)容介紹了“怎么在kubernetes中部署DNS”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
目前創(chuàng)新互聯(lián)公司已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、集美網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
kubernetes 提供了 service 的概念可以通過(guò) VIP(Service IP 是 virtual IP(VIP)) 訪問(wèn) pod 提供的服務(wù),但是在使用的時(shí)候還有一個(gè)問(wèn)題:怎么知道某個(gè)應(yīng)用的 VIP?比如我們有兩個(gè)應(yīng)用,一個(gè) app,一個(gè) 是 db,每個(gè)應(yīng)用使用 rc或deployment進(jìn)行管理,并通過(guò) service 暴露出端口提供服務(wù)。app 需要連接到 db 應(yīng)用,我們只知道 db 應(yīng)用的名稱,但是并不知道它的 VIP 地址。這就涉及到了==服務(wù)發(fā)現(xiàn)==的問(wèn)題了。
針對(duì)以上問(wèn)題,k8s提供了三種==服務(wù)發(fā)現(xiàn)==的方法:
該方法較為簡(jiǎn)單,但問(wèn)題較多。首先每個(gè)應(yīng)用都要在啟動(dòng)的時(shí)候編寫查詢依賴服務(wù)的邏輯,這本身就是重復(fù)和增加應(yīng)用的復(fù)雜度;其次這也導(dǎo)致應(yīng)用需要依賴 kubernetes,不能夠單獨(dú)部署和運(yùn)行(當(dāng)然如果通過(guò)增加配置選項(xiàng)也是可以做到的,但這又是增加復(fù)雜度)。
K8S默認(rèn)支持,這一方法是參照docker的。每個(gè) pod 啟動(dòng)時(shí)候,k8s會(huì)將之前存在的所有服務(wù)的 IP 和 port 信息通過(guò)環(huán)境變量的形式寫入到新啟動(dòng)的pod中,這樣 pod中的應(yīng)用可以通過(guò)讀取環(huán)境變量來(lái)獲取依賴服務(wù)的地址信息。但是有個(gè)很大的問(wèn)題:依賴的服務(wù)必須在 pod 啟動(dòng)之前就存在,不然就不會(huì)出現(xiàn)在環(huán)境變量中。
應(yīng)用只需要知道服務(wù)的具體名字,不需要關(guān)心服務(wù)的實(shí)際的 ip 地址,中間的==服務(wù)名--IP==轉(zhuǎn)換由DNS自動(dòng)完成。名字和 ip 之間的轉(zhuǎn)換就是 DNS 系統(tǒng)的功能。
DNS 服務(wù)不是獨(dú)立的系統(tǒng)服務(wù),而是一種 ==addon== ,作為==插件==來(lái)安裝的,不是 kubernetes 集群必須的(==但是非常推薦安裝==)??梢园阉醋鲞\(yùn)行在集群上的應(yīng)用,只不過(guò)這個(gè)應(yīng)用比較特殊而已。 目前常用的DNS配置方式有兩種,在 1.3 之前使用 etcd + kube2sky + skydns + exechealthz的方式,在 1.3 之后可以使用 kubedns + dnsmasq +sidecar 的方式。
下面對(duì)這些組件功能進(jìn)行介紹
1.3版本前
etcd: DNS存儲(chǔ)
kube2sky: 通過(guò)K8S API監(jiān)視Service資源的變化,將service注冊(cè)到etcd
skydns: 提供DNS域名解析服務(wù),為集群中的Pod提供DNS查詢服務(wù)
exechealthz: 提供對(duì)skydns服務(wù)的健康檢查功能
架構(gòu)圖
1.3版本后
kubedns: 通過(guò)K8S API監(jiān)視Service資源的變化,并使用樹(shù)形結(jié)構(gòu)在內(nèi)存中保存DNS記錄
dnsmasq: 提供DNS域名解析服務(wù),為集群中的Pod提供DNS查詢服務(wù)
exechealthz: 提供對(duì)kubedns和dnsmasq兩個(gè)服務(wù)的健康檢查功能,更加完善
架構(gòu)圖
從中可以看出kubedns替代了 etcd和 kube2sky這兩個(gè)功能,為dnsmasq提供查詢服務(wù),使用樹(shù)形結(jié)構(gòu)在內(nèi)存中保存DNS記錄
dnsmasq在kube-dns插件中的作用: 通過(guò)kubedns容器獲取DNS規(guī)則,在集群中提供DNS查詢服務(wù) 提供DNS緩存,提高查詢性能 降低kubedns容器的壓力、提高穩(wěn)定性
網(wǎng)上有很多搭建的教程,本人一一嘗試!發(fā)現(xiàn)都沒(méi)成功!很尷尬!可能是因?yàn)閗8s版本不同或k8s集群搭建方式不同,又或者是引入了ServiceAccount 、token和認(rèn)證等模塊。此處就不詳細(xì)介紹。 通過(guò)本人不懈努力(請(qǐng)?jiān)试S我裝個(gè)B..),終于實(shí)現(xiàn)了一個(gè)精簡(jiǎn)版DNS方案:kubedns + dnsmasq + exechealthz,具體的yaml文件可點(diǎn)擊這里查看。
廢話不多說(shuō),直接上內(nèi)容!
dns-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: kube-dns-v15 namespace: kube-system labels: k8s-app: kube-dns version: v15 kubernetes.io/cluster-service: "true" spec: replicas: 1 selector: k8s-app: kube-dns version: v15 template: metadata: labels: k8s-app: kube-dns version: v15 kubernetes.io/cluster-service: "true" spec: containers: - name: kubedns image: registry.cn-hangzhou.aliyuncs.com/sjq-k8s/kubedns-amd64:1.5 resources: # TODO: Set memory limits when we've profiled the container for large # clusters, then set request = limit to keep this container in # guaranteed class. Currently, this container falls into the # "burstable" category so the kubelet doesn't backoff from restarting it. limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 100Mi livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: httpGet: path: /readiness port: 8081 scheme: HTTP # we poll on pod startup for the Kubernetes master service and # only setup the /readiness HTTP server once that's available. initialDelaySeconds: 30 timeoutSeconds: 5 args: # command = "/kube-dns" - --kube_master_url=http://192.168.122.10:8080 - --domain=cluster.local. - --dns-port=10053 ports: - containerPort: 10053 name: dns-local protocol: UDP - containerPort: 10053 name: dns-tcp-local protocol: TCP - name: dnsmasq image: registry.cn-hangzhou.aliyuncs.com/sjq-k8s/dnsmasq:1.1 args: - --cache-size=1000 - --no-resolv - --server=127.0.0.1#10053 ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP - name: healthz image: registry.cn-hangzhou.aliyuncs.com/sjq-k8s/exechealthz-amd64:1.0 resources: # keep request = limit to keep this container in guaranteed class limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi args: - -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null - -port=8080 ports: - containerPort: 8080 protocol: TCP dnsPolicy: Default # Don't use cluster DNS.
其中的鏡像由于被墻,所以直接被我替換成了本人阿里云上的鏡像,可以直接下載使用, 其中- --kube_master_url=http://192.168.122.10:8080 中的IP記得換成自己的master ip和port
dns-svc.yaml
apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" kubernetes.io/name: "KubeDNS" spec: selector: k8s-app: kube-dns clusterIP: 192.168.3.10 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
其中將clusterIP: 192.168.3.10 中的ip換成你實(shí)際定義的dns集群ip。
創(chuàng)建rc和service
$ kubectl create -f skydns-rc.yaml replicationcontroller "kube-dns-v15" created $ kubectl create -f skydns-svc.yaml service "kube-dns" created
查看是否running
$ kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE kube-dns-v15-32902 3/3 Running 0 2m $ $ kubectl get svc -n kube-system NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns 192.168.3.1053/UDP,53/TCP 7m
通過(guò)啟動(dòng)一個(gè)帶有nslookup工具的busybox來(lái)驗(yàn)證DNS服務(wù)是否能夠正常工作:
busybox.yaml
apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - image: busybox command: - sleep - "3600" imagePullPolicy: IfNotPresent name: busybox restartPolicy: Always
啟動(dòng)
$ kubectl create -f busybox.yaml pod "busybox" created
pod成功運(yùn)行后,通過(guò)kubectl exec <容器Id> nslookup進(jìn)行測(cè)試
$ kubectl exec busybox -- nslookup kubernetes Server: 192.168.3.10 Address 1: 192.168.3.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes Address 1: 192.168.3.1 kubernetes.default.svc.cluster.local
成功!
如果測(cè)試的服務(wù)的命名空間不是default,那么一定要加上命名空間,不然會(huì)報(bào)下面的錯(cuò)誤
$ kubectl exec busybox -- nslookup kube-dns nslookup: can't resolve 'kube-dns' Server: 192.168.3.10 Address 1: 192.168.3.10 kube-dns.kube-system.svc.cluster.local
加上命名空間后
$ kubectl exec busybox -- nslookup kube-dns.kube-system Server: 192.168.3.10 Address 1: 192.168.3.10 kube-dns.kube-system.svc.cluster.local Name: kube-dns.kube-system Address 1: 192.168.3.10 kube-dns.kube-system.svc.cluster.local
創(chuàng)建成功圖
驗(yàn)證成功圖
可能的問(wèn)題
“怎么在kubernetes中部署DNS”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!