怎么在kubernetes中部署DNS

本篇內(nèi)容介紹了“怎么在kubernetes中部署DNS”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目前創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、集美網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1.為什么要部署DNS

kubernetes 提供了 service 的概念可以通過 VIP(Service IP 是 virtual IP(VIP)) 訪問 pod 提供的服務(wù),但是在使用的時候還有一個問題:怎么知道某個應(yīng)用的 VIP?比如我們有兩個應(yīng)用,一個 app,一個 是 db,每個應(yīng)用使用 rc或deployment進行管理,并通過 service 暴露出端口提供服務(wù)。app 需要連接到 db 應(yīng)用,我們只知道 db 應(yīng)用的名稱,但是并不知道它的 VIP 地址。這就涉及到了==服務(wù)發(fā)現(xiàn)==的問題了。

  • 針對以上問題,k8s提供了三種==服務(wù)發(fā)現(xiàn)==的方法:

方法1.通過kubernetes 提供的 API 查詢

該方法較為簡單,但問題較多。首先每個應(yīng)用都要在啟動的時候編寫查詢依賴服務(wù)的邏輯,這本身就是重復(fù)和增加應(yīng)用的復(fù)雜度;其次這也導(dǎo)致應(yīng)用需要依賴 kubernetes,不能夠單獨部署和運行(當(dāng)然如果通過增加配置選項也是可以做到的,但這又是增加復(fù)雜度)。

方法2.環(huán)境變量

K8S默認(rèn)支持,這一方法是參照docker的。每個 pod 啟動時候,k8s會將之前存在的所有服務(wù)的 IP 和 port 信息通過環(huán)境變量的形式寫入到新啟動的pod中,這樣 pod中的應(yīng)用可以通過讀取環(huán)境變量來獲取依賴服務(wù)的地址信息。但是有個很大的問題:依賴的服務(wù)必須在 pod 啟動之前就存在,不然就不會出現(xiàn)在環(huán)境變量中。

方法3.DNS(最理想的方案)

應(yīng)用只需要知道服務(wù)的具體名字,不需要關(guān)心服務(wù)的實際的 ip 地址,中間的==服務(wù)名--IP==轉(zhuǎn)換由DNS自動完成。名字和 ip 之間的轉(zhuǎn)換就是 DNS 系統(tǒng)的功能。

2.DNS 版本介紹

DNS 服務(wù)不是獨立的系統(tǒng)服務(wù),而是一種 ==addon== ,作為==插件==來安裝的,不是 kubernetes 集群必須的(==但是非常推薦安裝==)。可以把它看做運行在集群上的應(yīng)用,只不過這個應(yīng)用比較特殊而已。 目前常用的DNS配置方式有兩種,在 1.3 之前使用 etcd + kube2sky + skydns + exechealthz的方式,在 1.3 之后可以使用 kubedns + dnsmasq +sidecar 的方式。

下面對這些組件功能進行介紹

  • 1.3版本前

  1. etcd: DNS存儲

  2. kube2sky: 通過K8S API監(jiān)視Service資源的變化,將service注冊到etcd

  3. skydns: 提供DNS域名解析服務(wù),為集群中的Pod提供DNS查詢服務(wù)

  4. exechealthz: 提供對skydns服務(wù)的健康檢查功能

架構(gòu)圖

怎么在kubernetes中部署DNS

  • 1.3版本后

  1. kubedns: 通過K8S API監(jiān)視Service資源的變化,并使用樹形結(jié)構(gòu)在內(nèi)存中保存DNS記錄

  2. dnsmasq: 提供DNS域名解析服務(wù),為集群中的Pod提供DNS查詢服務(wù)

  3. exechealthz: 提供對kubedns和dnsmasq兩個服務(wù)的健康檢查功能,更加完善

架構(gòu)圖

怎么在kubernetes中部署DNS

從中可以看出kubedns替代了 etcd和 kube2sky這兩個功能,為dnsmasq提供查詢服務(wù),使用樹形結(jié)構(gòu)在內(nèi)存中保存DNS記錄

dnsmasq在kube-dns插件中的作用: 通過kubedns容器獲取DNS規(guī)則,在集群中提供DNS查詢服務(wù) 提供DNS緩存,提高查詢性能 降低kubedns容器的壓力、提高穩(wěn)定性

3.搭建DNS

網(wǎng)上有很多搭建的教程,本人一一嘗試!發(fā)現(xiàn)都沒成功!很尷尬!可能是因為k8s版本不同或k8s集群搭建方式不同,又或者是引入了ServiceAccount 、token和認(rèn)證等模塊。此處就不詳細(xì)介紹。 通過本人不懈努力(請允許我裝個B..),終于實現(xiàn)了一個精簡版DNS方案:kubedns + dnsmasq + exechealthz,具體的yaml文件可點擊這里查看。

廢話不多說,直接上內(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換成你實際定義的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.10    <none>        53/UDP,53/TCP   7m

4.驗證dns是否有效

通過啟動一個帶有nslookup工具的busybox來驗證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

啟動

$ kubectl create -f busybox.yaml 
pod "busybox" created

pod成功運行后,通過kubectl exec <容器Id> nslookup進行測試

$ 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

成功!

如果測試的服務(wù)的命名空間不是default,那么一定要加上命名空間,不然會報下面的錯誤

$ 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

5.實際搭建截圖

創(chuàng)建成功圖

怎么在kubernetes中部署DNS

驗證成功圖

怎么在kubernetes中部署DNS

可能的問題

怎么在kubernetes中部署DNS

“怎么在kubernetes中部署DNS”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

當(dāng)前題目:怎么在kubernetes中部署DNS
網(wǎng)頁鏈接:http://muchs.cn/article36/ihsppg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、標(biāo)簽優(yōu)化、外貿(mào)建站、小程序開發(fā)網(wǎng)站內(nèi)鏈、品牌網(wǎng)站建設(shè)

廣告

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

搜索引擎優(yōu)化