分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

kubernetes之部署kubedns

发布时间:2023-09-06 01:35责任编辑:熊小新关键词:kubernetes
一,理解Kubedns原理

通俗理解,首先明白k8s dns是为服务的发现而生,即service的发现,为了能够让其它服务能够直接通过service 名字找到它们,于是就需要dns将service名转换为它的VIP, 那么service的变化如何知道? 如何知道目前有哪些service 及知道他们的vip呢,service的增加减少又如何知道了,

所以要有一个组件(1.3中是Kube2sky,1.3后是kubedns)来时刻监控它的变化,监控到了什么就把它记录下来,记录的是service和ip之间的映射关系,称为DNS解析记录,但是记录在某个位置呢,监控的组件不同,记录的位置也不同, Kube2sky是记录到etcd中,kubedns是记录到哪了呢, 记录在内存当中,使用树形结构在内存中保存监控到的记录。

由于一切对集群的操作都是通过其API来的,所以它监控service资源变化也是借助于k8s API

这个组件仅仅是记录下来以后,并不提供查询。所以查询就是另外一个组件的作用了,1.3之前是由Skydns来查询的, 所有服务(pod)都找skydns查询,1.3以后都是由dnsmasq查询的,它们从前面记录的地方查询相关service的解析记录,之所以用dnsmasq来查询,因为它提供DNS查询缓存,在内存中完成查询,查询速度非常快!

两个组件一个负责监控并记录,另外一个负责帮其它服务做查询, 两个组件必须要同时运行,如果其中一个出问题了,那么dns系统将无法解析,于是需要有另一个组件专门来监控它们的健康状态,这个组件就是exechealthz,Exechealthz是两个版本中唯一保留的容器,依然提供健康检查。

在K8s中,这三个组件都是用容器运行的,而且是在同一个pod中,

官方理解,上图:

● dnsmasq简介

Dnsmasq是一款小巧的DNS配置工具

在kube-dns插件中的作用:

● 通过kubedns容器获取DNS规则,在集群中提供DNS查询服务


● 提供DNS缓存,提高查询性能


● 降低kubedns容器的压力、提高稳定性


● Dockerfile在GitHub上Kubernetes组织的contrib仓库中,位于dnsmasq目录下


● exechealthz简介

● 在kube-dns插件中提供健康检查功能


● 源码同样在contrib仓库中,位于exec-healthz目录下。


● 新版中会对两个容器都进行健康检查,更加完善。


● 总结

kube-dns插件的三个容器的功能如下:

● kubedns容器


● 监视k8s Service资源并更新DNS记录


● 替换etcd,使用TreeCache数据结构保存DNS记录并实现SkyDNS的Backend接口


● 接入SkyDNS,对dnsmasq提供DNS查询服务


● dnsmasq容器


● 对集群提供DNS查询服务


● 设置kubedns为upstream


● 提供DNS缓存,降低kubedns负载,提高性能


● exechealthz容器


● 定期检查kubedns和dnsmasq的健康状态


● 为k8s活性检测提供HTTP API


二、部署kubedns

1,上官方网址下载需要的yaml部署文件:https://github.com/kubernetes/kubernetes/tree/release-1.8/cluster/addons/dns

$ls*.yaml*.basekubedns-cm.yamlkubedns-sa.yamlkubedns-controller.yaml.basekubedns-svc.yaml.base

2,主要是修改这四个部署文件

#catkubedns-cm.yaml#此文件不需修改apiVersion:v1kind:ConfigMapmetadata:name:kube-dnsnamespace:kube-systemlabels:addonmanager.kubernetes.io/mode:EnsureExists
#catkubedns-sa.yaml#此文件不需修改apiVersion:v1kind:ServiceAccountmetadata:name:kube-dnsnamespace:kube-systemlabels:kubernetes.io/cluster-service:"true"addonmanager.kubernetes.io/mode:Reconcile


接下来主要修改的是kubedns-controller.yaml 和kubedns-svc.yaml

主要diff来比较下原文件与修改过的文件区别:

diffkubedns-controller.yaml.base/root/kubernetes/k8s-deploy/mainifest/dns/kubedns-controller.yaml58c58<image:gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5--->image:gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.488c88<---domain=$DNS_DOMAIN.--->---domain=cluster.local.109c109<image:gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5--->image:gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4128c128<---server=/$DNS_DOMAIN/127.0.0.1#10053--->---server=/cluster.local/127.0.0.1#10053147c147<image:gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5--->image:gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4160,161c160,161<---probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.$DNS_DOMAIN,5,A<---probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.$DNS_DOMAIN,5,A--->---probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A>---probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A无非就是将有k8s-dns-sidecar-amd64:1.14.5的改为k8s-dns-sidecar-amd64:1.14.4,将变量集群域名的环境变量$DNS_DOMAIN替换我们之前设置好的域名,如cluster.local。

修改过后的完整文件内容如下:

#catkubedns-controller.yaml#Copyright2016TheKubernetesAuthors.##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLicenseat##http://www.apache.org/licenses/LICENSE-2.0##Unlessrequiredbyapplicablelaworagreedtoinwriting,software#distributedundertheLicenseisdistributedonan"ASIS"BASIS,#WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.#SeetheLicenseforthespecificlanguagegoverningpermissionsand#limitationsundertheLicense.#Shouldkeeptargetincluster/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml#insyncwiththisfile.#__MACHINE_GENERATED_WARNING__apiVersion:extensions/v1beta1kind:Deploymentmetadata:name:kube-dnsnamespace:kube-systemlabels:k8s-app:kube-dnskubernetes.io/cluster-service:"true"addonmanager.kubernetes.io/mode:Reconcilespec:#replicas:notspecifiedhere:#1.InordertomakeAddonManagerdonotreconcilethisreplicasparameter.#2.Defaultis1.#3.WillbetunedinrealtimeifDNShorizontalauto-scalingisturnedon.strategy:rollingUpdate:maxSurge:10%maxUnavailable:0selector:matchLabels:k8s-app:kube-dnstemplate:metadata:labels:k8s-app:kube-dnsannotations:scheduler.alpha.kubernetes.io/critical-pod:''spec:tolerations:-key:"CriticalAddonsOnly"operator:"Exists"volumes:-name:kube-dns-configconfigMap:name:kube-dnsoptional:truecontainers:-name:kubednsimage:gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4resources:#TODO:Setmemorylimitswhenwe'veprofiledthecontainerforlarge#clusters,thensetrequest=limittokeepthiscontainerin#guaranteedclass.Currently,thiscontainerfallsintothe#"burstable"categorysothekubeletdoesn'tbackofffromrestartingit.limits:memory:170Mirequests:cpu:100mmemory:70MilivenessProbe:httpGet:path:/healthcheck/kubednsport:10054scheme:HTTPinitialDelaySeconds:60timeoutSeconds:5successThreshold:1failureThreshold:5readinessProbe:httpGet:path:/readinessport:8081scheme:HTTP#wepollonpodstartupfortheKubernetesmasterserviceand#onlysetupthe/readinessHTTPserveroncethat'savailable.initialDelaySeconds:3timeoutSeconds:5args:---domain=cluster.local.---dns-port=10053---config-dir=/kube-dns-config---v=2env:-name:PROMETHEUS_PORTvalue:"10055"ports:-containerPort:10053name:dns-localprotocol:UDP-containerPort:10053name:dns-tcp-localprotocol:TCP-containerPort:10055name:metricsprotocol:TCPvolumeMounts:-name:kube-dns-configmountPath:/kube-dns-config-name:dnsmasqimage:gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4livenessProbe:httpGet:path:/healthcheck/dnsmasqport:10054scheme:HTTPinitialDelaySeconds:60timeoutSeconds:5successThreshold:1failureThreshold:5args:--v=2--logtostderr--configDir=/etc/k8s/dns/dnsmasq-nanny--restartDnsmasq=true-----k---cache-size=1000---log-facility=----server=/cluster.local/127.0.0.1#10053---server=/in-addr.arpa/127.0.0.1#10053---server=/ip6.arpa/127.0.0.1#10053ports:-containerPort:53name:dnsprotocol:UDP-containerPort:53name:dns-tcpprotocol:TCP#see:https://github.com/kubernetes/kubernetes/issues/29055fordetailsresources:requests:cpu:150mmemory:20MivolumeMounts:-name:kube-dns-configmountPath:/etc/k8s/dns/dnsmasq-nanny-name:sidecarimage:gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4livenessProbe:httpGet:path:/metricsport:10054scheme:HTTPinitialDelaySeconds:60timeoutSeconds:5successThreshold:1failureThreshold:5args:---v=2---logtostderr---probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A---probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,Aports:-containerPort:10054name:metricsprotocol:TCPresources:requests:memory:20Micpu:10mdnsPolicy:Default#Don'tuseclusterDNS.serviceAccountName:kube-dns

kubedns-controller 运行了 三个容器:kubednsdnsmasqsidecar

#catkubedns-svc.yaml#Copyright2016TheKubernetesAuthors.##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLicenseat##http://www.apache.org/licenses/LICENSE-2.0##Unlessrequiredbyapplicablelaworagreedtoinwriting,software#distributedundertheLicenseisdistributedonan"ASIS"BASIS,#WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.#SeetheLicenseforthespecificlanguagegoverningpermissionsand#limitationsundertheLicense.#__MACHINE_GENERATED_WARNING__apiVersion:v1kind:Servicemetadata:name:kube-dnsnamespace:kube-systemlabels:k8s-app:kube-dnskubernetes.io/cluster-service:"true"addonmanager.kubernetes.io/mode:Reconcilekubernetes.io/name:"KubeDNS"spec:selector:k8s-app:kube-dnsclusterIP:10.254.0.2#修改为我们设定的cluster的IP,其它默认。ports:-name:dnsport:53protocol:UDP-name:dns-tcpport:53protocol:TCP

部署文件设置好后,一起来创建:

#kubectlcreate-fkubedns-cm.yaml-fkubedns-sa.yaml-fkubedns-controller.yamlkubedns-svc.yaml

查看创建后的pod,svc:

#kubectlgetpod,svc-nkube-systemNAMEREADYSTATUSRESTARTSAGEpo/kube-dns-7797cb8758-dlhqs3/3Running03hNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEsvc/kube-dnsClusterIP10.254.0.2<none>53/UDP,53/TCP3h


三,验证kubedns功能

如果我们此前已经有了部署了许多pod和服务,并且在Kubelet 启动配置文件加入了 --cluster-dns=10.254.0.2 --cluster-domain=cluster.local 参数,则可以进入某个pod中的容器内查看其/etc/resolv.conf 文件

root@jekins:~#cat/etc/resolv.confnameserver10.254.0.2searchdefault.svc.cluster.localsvc.cluster.localcluster.localoptionsndots:5如上所示,根据kubelet的启动参数,kubelet会在每个pod中设置DNS域名解析文件/etc/resolv.conf,加入了nameser和search搜索域。最后应用程序就能够像访问网站一样,仅仅通过服务的名字就能访问到服务了。root@jek:~#pingjenkinsservicePINGjenkinsservice.default.svc.cluster.local(10.254.145.97)56(84)bytesofdata.可以看到已经解析出来了

通常可以启动一个带有nslookup工具的pod,比如busybox,镜像从gcr.io/google_containers/busybox下载,来验证DNS服务是否能够正常工作。

至此,kubedns部署完成。



kubernetes之部署kubedns

原文地址:http://blog.51cto.com/newfly/2059972

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved