日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

k8s kube-dns和服务发现

發布時間:2025/1/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 k8s kube-dns和服务发现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

k8s kube-dns 和服務發現

服務發現

kubernetes 提供了 service 的概念可以通過 VIP 訪問 pod 提供的服務,但是在使用的時候還有一個問題:怎么知道某個應用的 VIP?比如我們有兩個應用,一個 app,一個 是 db,每個應用使用 rc 進行管理,并通過 service 暴露出端口提供服務。app 需要連接到 db 應用,我們只知道 db 應用的名稱,但是并不知道它的 VIP 地址。

最簡單的辦法是從 kubernetes 提供的 API 查詢。但這是一個糟糕的做法,首先每個應用都要在啟動的時候編寫查詢依賴服務的邏輯,這本身就是重復和增加應用的復雜度;其次這也導致應用需要依賴 kubernetes,不能夠單獨部署和運行(當然如果通過增加配置選項也是可以做到的,但這又是增加負責度)。

開始的時候,kubernetes 采用了 docker 使用過的方法——環境變量。每個 pod 啟動時候,會把通過環境變量設置所有服務的 IP 和 port 信息,這樣 pod 中的應用可以通過讀取環境變量來獲取依賴服務的地址信息。這種方式服務和環境變量的匹配關系有一定的規范,使用起來也相對簡單,但是有個很大的問題:依賴的服務必須在 pod 啟動之前就存在,不然是不會出現在環境變量中的。

更理想的方案是:應用能夠直接使用服務的名字,不需要關心它實際的 ip 地址,中間的轉換能夠自動完成。名字和 ip 之間的轉換就是 DNS 系統的功能,因此 kubernetes 也提供了 DNS 方法來解決這個問題。

部署 DNS 服務

DNS 服務不是獨立的系統服務,而是一種 addon ,作為插件來安裝的,不是 kubernetes 集群必須的(但是非常推薦安裝)。可以把它看做運行在集群上的應用,只不過這個應用比較特殊而已。

DNS 有兩種配置方式,在 1.3 之前使用 etcd + kube2sky + skydns 的方式,在 1.3 之后可以使用 kubedns + dnsmasq 的方式。

修改 kubelet 啟動參數

不管以什么方式啟動,對外的效果是一樣的。要想使用 DNS 功能,還需要修改 kubelet的啟動配置項,告訴 kubelet,給每個啟動的 pod 設置對應的 DNS 信息,一共有兩個參數:--cluster_dns=10.10.10.10 --cluster_domain=cluster.local,分別是 DNS 在集群中的 vip 和域名后綴,要和 DNS rc 中保持一致。

skydns

下面是這種方式的部署配置文件:

apiVersion: v1 kind: ReplicationController metadata:labels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"name: kube-dnsnamespace: kube-system spec:replicas: 1selector:k8s-app: kube-dnstemplate:metadata:labels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"spec:containers:- name: etcdcommand:- /usr/local/bin/etcd- "-listen-client-urls"- "http://127.0.0.1:2379,http://127.0.0.1:4001"- "-advertise-client-urls"- "http://127.0.0.1:2379,http://127.0.0.1:4001"- "-initial-cluster-token"- skydns-etcdimage: "gcr.io/google_containers/etcd:2.0.9"resources:limits:cpu: 100mmemory: 50Mi- name: kube2skyargs:- "-domain=cluster.local"- "-kube_master_url=http://10.7.114.81:8080"image: "gcr.io/google_containers/kube2sky:1.11"resources:limits:cpu: 100mmemory: 50Mi- name: skydnsargs:- "-machines=http://localhost:4001"- "-addr=0.0.0.0:53"- "-domain=cluster.local"image: "gcr.io/google_containers/skydns:2015-03-11-001"livenessProbe:exec:command:- /bin/sh- "-c"- "nslookup kubernetes.default.svc.cluster.local localhost >/dev/null"initialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 53name: dnsprotocol: UDP- containerPort: 53name: dns-tcpprotocol: TCPresources:limits:cpu: 100mmemory: 50MidnsPolicy: Default

這里有兩個需要根據實際情況配置的地方:

  • kube_master_url: kube2sky 會用到 kubernetes master API,它會讀取里面的 service 信息
  • domain:域名后綴,默認是 cluster.local,你可以根據實際需要修改成任何合法的值

然后是 Service 的配置文件:

apiVersion: v1 kind: Service metadata:name: kube-dnsnamespace: kube-systemlabels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"kubernetes.io/name: "KubeDNS" spec:selector:k8s-app: kube-dnsclusterIP: 10.10.10.10ports:- name: dnsport: 53protocol: UDP- name: dns-tcpport: 53protocol: TCP

這里需要注意的是 clusterIP: 10.10.10.10 這一行手動指定了 DNS service 的 IP 地址,這個地址必須在預留的 vip 網段。手動指定的原因是為了固定這個 ip,這樣啟動 kubelet 的時候配置 --cluster_dns=10.10.10.10 比較方便,不需要再動態獲取 DNS 的 vip 地址。

有了這兩個文件,直接創建對象就行:

$ kubectl create -f ./skydns-rc.yml $ kubectl create -f ./skydns-svc.yml [root@localhost ~]# kubectl get svc,rc,pod --namespace=kube-system NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kube-dns 10.10.10.10 <none> 53/UDP 1dNAME DESIRED CURRENT READY AGE rc/kube-dns 1 1 1 41mNAME READY STATUS RESTARTS AGE po/kube-dns-twl0q 3/3 Running 0 41m

kubeDNS

在 kubernetes 1.3 版本之后,kubernetes 改變了 DNS 的部署方式,變成了 kubeDNS + dnsmasq,沒有了 etcd 。在這種模式下,kubeDNS 是原來 kube2sky + skyDNS + etcd,只不過它把數據都保存到自己的內存,而不是 kv store 中;dnsmasq 的引進是為了提高解析的速度,因為它可以配置 DNS 緩存。

這種部署方式的完整配置文件這里就不貼出來了,我放到了 github gist 上面,有興趣可以查看。創建方法也是一樣 kubectl create -f ./skydns-rc.yml

測試 DNS 可用性

不管那種部署很是,kubernetes 對外提供的 DNS 服務是一致的。每個 service 都會有對應的 DNS 記錄,kubernetes 保存 DNS 記錄的格式如下:

<service_name>.<namespace>.svc.<domain>

每個部分的字段意思:

  • service_name: 服務名稱,就是定義 service 的時候取的名字
  • namespace:service 所在 namespace 的名字
  • domain:提供的域名后綴,比如默認的 cluster.local

在 pod 中可以通過 service_name.namespace.svc.domain 來訪問任何的服務,也可以使用縮寫 service_name.namespace,如果 pod 和 service 在同一個 namespace,甚至可以直接使用 service_name。

NOTE:正常的 service 域名會被解析成 service vip,而 headless service 域名會被直接解析成背后的 pods ip。

雖然不會經常用到,但是 pod 也會有對應的 DNS 記錄,格式是 pod-ip-address..pod.,其中 pod-ip-address 為 pod ip 地址的用 - 符號隔開的格式,比如 pod ip 地址是 1.2.3.4 ,那么對應的域名就是 1-2-3-4.default.pod.cluster.local。

我們運行一個 busybox 來驗證 DNS 服務能夠正常工作:

/ # nslookup whoami Server: 10.10.10.10 Address 1: 10.10.10.10Name: whoami Address 1: 10.10.10.175/ # nslookup kubernetes Server: 10.10.10.10 Address 1: 10.10.10.10Name: kubernetes Address 1: 10.10.10.1/ # nslookup whoami.default.svc Server: 10.10.10.10 Address 1: 10.10.10.10Name: whoami.default.svc Address 1: 10.10.10.175/ # nslookup whoami.default.svc.transwarp.local Server: 10.10.10.10 Address 1: 10.10.10.10Name: whoami.default.svc.transwarp.local Address 1: 10.10.10.175

可以看出,如果我們在默認的 namespace default 創建了名為 whoami 的服務,以下所有域名都能被正確解析:

whoami whoami.default.svc whoami.default.svc.cluster.local

每個 pod 的 DNS 配置文件如下,可以看到 DNS vip 地址以及搜索的 domain 列表:

/ # cat /etc/resolv.conf search default.pod.cluster.local default.svc.cluster.local svc.cluster.local cluster.local nameserver 10.10.10.10 options ndots:5 options ndots:5

kubernetes DNS 原理解析

我們前面介紹了兩種不同 DNS 部署方式,這部分講講它們內部的原理。

kube2sky 模式

這種模式下主要有三個容器在運行:

[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 919cbc006da2 172.16.1.41:5000/google_containers/kube2sky:1.12 "/kube2sky /kube2sky " About an hour ago Up About an hour k8s_kube2sky.80a41edc_kube-dns-twl0q_kube-system_ea1f5f4d-15cf-11e7-bece-080027c09e5b_1bd3fdb4 73dd11cac057 172.16.1.41:5000/jenkins/etcd:live "etcd -data-dir=/var/" About an hour ago Up About an hour k8s_etcd.4040370_kube-dns-twl0q_kube-system_ea1f5f4d-15cf-11e7-bece-080027c09e5b_b0e5a99f 0b10ae639989 172.16.1.41:5000/jenkins/skydns:20150703-113305 "bootstrap.sh" About an hour ago Up About an hour k8s_skydns.73baf3b1_kube-dns-twl0q_kube-system_ea1f5f4d-15cf-11e7-bece-080027c09e5b_2860aa6d

這三個容器的作用分別是:

  • etcd:保存所有的 DNS 數據
  • kube2sky: 通過 kubernetes API 監聽 Service 的變化,然后同步到 etcd
  • skyDNS:根據 etcd 中的數據,對外提供 DNS 查詢服務

kubeDNS 模式

這種模式下,kubeDNS 容器替代了原來的三個容器的功能,它會監聽 apiserver 并把所有 service 和 endpoints 的結果在內存中用合適的數據結構保存起來,并對外提供 DNS 查詢服務。

  • kubeDNS:提供了原來 kube2sky + etcd + skyDNS 的功能,可以單獨對外提供 DNS 查詢服務
  • dnsmasq: 一個輕量級的 DNS 服務軟件,可以提供 DNS 緩存功能。kubeDNS 模式下,dnsmasq 在內存中預留一塊大小(默認是 1G)的地方,保存當前最常用的 DNS 查詢記錄,如果緩存中沒有要查找的記錄,它會到 kubeDNS 中查詢,并把結果緩存起來

每種模式都可以運行額外的 exec-healthz 容器對外提供 health check 功能,證明當前 DNS 服務是正常的。

  • exec-healthz:運行某個命令,根據結果來對外提供 /healthz 結果

總結

推薦使用 kubeDNS 的模式來部署,因為它有著以下的好處:

  • 不需要額外的存儲,省去了額外的維護和數據保存的工作
  • 更好的性能。通過 dnsmasq 緩存和直接把 DNS 記錄保存在內存中,來提高 DNS 解析的速度

參考資料

  • Deploy the DNS Add-on
  • Kubernetes Admin Docs: Using DNS Pods and Services
  • Deploying a Service on a Kubernetes Cluster
  • kubernetes 技術分析之DNS
  • Kubernetes DNS部署
  • Kubernetes DNS Service Deep Dive - Part 1
  • Kubernetes DNS Service技術研究
  • Kubernetes(K8S)的服務發現和kube-dns插件

http://cizixs.com/2017/04/11/kubernetes-intro-kube-dns

http://jingyan.baidu.com/article/72ee561a6e2460e16138dff7.html

源碼分析

http://blog.csdn.net/u010278923/article/details/70173635
k8s kube-dns 和服務發現

總結

以上是生活随笔為你收集整理的k8s kube-dns和服务发现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97黄色网 | 人人爽人人草 | 三大队在线观看 | 性高潮网站 | 国产精品久久久久久久久晋中 | www.色com| 蜜桃视频成人在线观看 | 深爱综合网| 人人澡超碰碰97碰碰碰 | 色婷婷基地 | 欧美日韩综合一区二区 | 日本黄色录像片 | 日韩伦理在线视频 | 人人澡人人澡人人 | 日本少妇高潮喷水xxxxxxx | 欧美大色网 | 五月天青青草 | 男人操女人免费 | 国产三级伦理片 | 国产又粗又深又猛又爽又在线观看 | 天堂俺去俺来也www 欧美大片在线播放 | 激情综合五月网 | 丝袜操 | 国产精品mm | 亚洲天堂一区二区三区四区 | 69日本xxxxxxxxx30| 国产伦精品一区二区 | 成人久久久久 | 亚洲婷婷在线视频 | 天天宗合网 | 日本少妇性高潮 | 亚洲综合免费观看高清完整版在线 | 精品日韩在线播放 | 中文字幕一区二区三区人妻在线视频 | 特高潮videossexhd | 久久精品3 | 日本午夜在线视频 | 国产在线观看黄色 | 亚洲欧美一区在线 | aaa一级黄色片 | 日日麻批免费视频播放 | 奇米久久| а√天堂资源官网在线资源 | 精品人妻一区二区三区四区不卡 | 三级免费黄 | 日本一区精品视频 | 国产精品入口麻豆九色 | 成年人国产 | 奇米影视狠狠干 | 国模无码国产精品视频 | 欧美 亚洲 | 国产精品一级二级 | 日韩大片在线观看 | 伊人免费在线观看高清版 | 色呦呦国产| 久久精品免费播放 | 日韩久久精品视频 | 色人阁视频 | 中文字幕精品在线 | 成人片在线免费看 | 一区二区在线看 | 欧美精品成人一区二区在线观看 | 日本欧美国产一区二区三区 | 最新色网址| 青青视频在线播放 | 91高清视频在线观看 | 久久久久久久久久久久国产 | 欧美三级黄色 | 亚洲精品大片www | 国产91丝袜在线播放 | 99精品色 | 红桃视频一区二区三区免费 | 麻豆一区二区三区四区 | 在线观看免费av片 | 成人免费无码大片a毛片抽搐色欲 | 九九久久久 | 在线观看色 | 日本三级视频网站 | 久久久久久久久久久久久女过产乱 | 亚洲美女自拍 | 色婷婷小说 | 天天搞天天搞 | 韩国av免费在线观看 | 国产婷 | 亚洲熟女乱综合一区二区 | 亚洲精品乱码久久久久久麻豆不卡 | 欧美91在线| 欧美在线va| 亚洲国产一区二区a毛片 | 色播开心网 | 日韩免费黄色 | 伊人久久久久久久久 | 美女精品网站 | 农民人伦一区二区三区 | 91高清网站 | 少妇人妻偷人精品一区二区 | 99亚洲国产精品 | 巨乳动漫美女 | 91亚洲国产成人精品一区二三 |