一 Kubernetes DNS介绍

1.1 Kubernetes DNS发展

作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,因此需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。
DNS服务在Kubernetes的发展过程中经历了3个阶段,SkyDNS ----> KubeDNS ----> CoreDNS。

1.2 SkyDNS

在Kubernetes 1.2版本时,DNS服务是由SkyDNS提供的,它由4个容器组成:kube2sky、skydns、etcd和healthz。
kube2sky容器监控Kubernetes中Service资源的变化,根据Service的名称和IP地址信息生DNS记录,并将其保存到etcd中。
skydns容器从etcd中读取DNS记录,并为客户端容器应用提供DNS查询服务。
healthz容器提供对skydns服务的健康检查功能。
SkyDNS的总体架构如下:

1.3 KubeDNS

从Kubernetes 1.4版本开始,SkyDNS组件便被KubeDNS替换,主要考虑是SkyDNS组件之间通信较多,整体性能不高。
KubeDNS由3个容器组成:kubedns、dnsmasq和sidecar,去掉了SkyDNS中的etcd存储,将DNS记录直接保存在内存中,以提高查询性能。
kubedns容器监控Kubernetes中Service资源的变化,根据Service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中。
dnsmasq容器从kubedns中获取DNS记录,提供DNS缓存,为客户端容器应用提供DNS查询服务。
sidecar提供对kubedns和dnsmasq服务的健康检查功能。
KubeDNS的总体架构如下:

1.4 CoreDNS

从Kubernetes 1.11版本开始,Kubernetes集群的DNS服务由CoreDNS提供。CoreDNS是CNCF基金会的一个项目,是用Go语言实现的高性能、插件式、易扩展的DNS服务端。
CoreDNS解决了KubeDNS的一些问题,例如dnsmasq的安全漏洞、externalName不能使用stubDomains设置,等等。
CoreDNS支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS。
CoreDNS没有使用多个容器的架构,只用一个容器便实现了KubeDNS内3个容器的全部功能。
CoreDNS的总体架构如下:

二 CoreDNS部署

2.1 修改kubelet启动参数

部署之前需要修改每个Node上kubelet的启动参数,加上以下两个参数:
  • --cluster-dns=169.169.0.100:为DNS服务的ClusterIP地址。
  • --cluster-domain=cluster.local:为在DNS服务中设置的域名。
然后重启kubelet服务。
提示:也可通过如下方式引入yaml配置文件实现:
  1 # vi /etc/systemd/system/kubelet.service
2 ……
3 --config=/etc/kubernetes/kubelet-config.yaml \
4 ……
5 # vi /etc/kubernetes/kubelet-config.yaml
6 ……
7 clusterDomain: "cluster.local"
8 clusterDNS:
9 - "10.254.0.2"
10 ……

2.2 创建授权

在启用了RBAC的集群中, 还可以设置ServiceAccount、 ClusterRole、 ClusterRoleBinding对CoreDNS容器进行权限设置。ServiceAccount、 ClusterRole、 ClusterRoleBinding相关yaml如下:
  1 [root@k8smaster01 ~]# vi corednsaccout.yaml
2 # __MACHINE_GENERATED_WARNING__
3
4 apiVersion: v1
5 kind: ServiceAccount
6 metadata:
7 name: coredns
8 namespace: kube-system
9 labels:
10 kubernetes.io/cluster-service: "true"
11 addonmanager.kubernetes.io/mode: Reconcile
12 ---
13 apiVersion: rbac.authorization.k8s.io/v1
14 kind: ClusterRole
15 metadata:
16 labels:
17 kubernetes.io/bootstrapping: rbac-defaults
18 addonmanager.kubernetes.io/mode: Reconcile
19 name: system:coredns
20 rules:
21 - apiGroups:
22 - ""
23 resources:
24 - endpoints
25 - services
26 - pods
27 - namespaces
28 verbs:
29 - list
30 - watch
31 - apiGroups:
32 - ""
33 resources:
34 - nodes
35 verbs:
36 - get
37 ---
38 apiVersion: rbac.authorization.k8s.io/v1
39 kind: ClusterRoleBinding
40 metadata:
41 annotations:
42 rbac.authorization.kubernetes.io/autoupdate: "true"
43 labels:
44 kubernetes.io/bootstrapping: rbac-defaults
45 addonmanager.kubernetes.io/mode: EnsureExists
46 name: system:coredns
47 roleRef:
48 apiGroup: rbac.authorization.k8s.io
49 kind: ClusterRole
50 name: system:coredns
51 subjects:
52 - kind: ServiceAccount
53 name: coredns
54 namespace: kube-system
55
56 [root@k8smaster01 ~]# kubectl create -f corednsaccout.yaml

2.3 创建ConfigMap

  1 [root@k8smaster01 ~]# vi corednsconfigmap.yaml
2 apiVersion: v1
3 kind: ConfigMap
4 metadata:
5 name: coredns
6 namespace: kube-system
7 labels:
8 addonmanager.kubernetes.io/mode: EnsureExists
9 data:
10 Corefile: |
11 .:53 {
12 errors
13 health
14 kubernetes cluster.local in-addr.arpa ip6.arpa {
15 pods insecure
16 upstream
17 fallthrough in-addr.arpa ip6.arpa
18 }
19 prometheus :9153
20 forward . /etc/resolv.conf
21 cache 30
22 loop
23 reload
24 loadbalance
25 }
26
27 [root@k8smaster01 ~]# kubectl create -f corednsconfigmap.yaml

2.4 创建Deployment

  1 [root@k8smaster01 ~]# vi corednsdeploy.yaml
2 apiVersion: apps/v1
3 kind: Deployment
4 metadata:
5 name: coredns
6 namespace: kube-system
7 labels:
8 k8s-app: kube-dns
9 kubernetes.io/cluster-service: "true"
10 addonmanager.kubernetes.io/mode: Reconcile
11 kubernetes.io/name: "CoreDNS"
12 spec:
13 # replicas: not specified here:
14 # 1. In order to make Addon Manager do not reconcile this replicas parameter.
15 # 2. Default is 1.
16 # 3. Will be tuned in real time if DNS horizontal auto-scaling is turned on.
17 strategy:
18 type: RollingUpdate
19 rollingUpdate:
20 maxUnavailable: 1
21 selector:
22 matchLabels:
23 k8s-app: kube-dns
24 template:
25 metadata:
26 labels:
27 k8s-app: kube-dns
28 annotations:
29 seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
30 spec:
31 priorityClassName: system-cluster-critical
32 serviceAccountName: coredns
33 tolerations:
34 - key: "CriticalAddonsOnly"
35 operator: "Exists"
36 nodeSelector:
37 beta.kubernetes.io/os: linux
38 containers:
39 - name: coredns
40 image: registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1
41 imagePullPolicy: IfNotPresent
42 resources:
43 limits:
44 memory: 170Mi
45 requests:
46 cpu: 100m
47 memory: 70Mi
48 args: [ "-conf", "/etc/coredns/Corefile" ]
49 volumeMounts:
50 - name: config-volume
51 mountPath: /etc/coredns
52 readOnly: true
53 ports:
54 - containerPort: 53
55 name: dns
56 protocol: UDP
57 - containerPort: 53
58 name: dns-tcp
59 protocol: TCP
60 - containerPort: 9153
61 name: metrics
62 protocol: TCP
63 livenessProbe:
64 httpGet:
65 path: /health
66 port: 8080
67 scheme: HTTP
68 initialDelaySeconds: 60
69 timeoutSeconds: 5
70 successThreshold: 1
71 failureThreshold: 5
72 readinessProbe:
73 httpGet:
74 path: /health
75 port: 8080
76 scheme: HTTP
77 securityContext:
78 allowPrivilegeEscalation: false
79 capabilities:
80 add:
81 - NET_BIND_SERVICE
82 drop:
83 - all
84 readOnlyRootFilesystem: true
85 dnsPolicy: Default
86 volumes:
87 - name: config-volume
88 configMap:
89 name: coredns
90 items:
91 - key: Corefile
92 path: Corefile
93
94 [root@k8smaster01 ~]# kubectl create -f corednsdeploy.yaml
提示:replicas副本的数量通常应该根据集群的规模和服务数量确定,如果单个CoreDNS进程不足以支撑整个集群的DNS查询,则可以通过水平扩展提高查询能力。由于DNS服务是Kubernetes集群的关键核心服务,所以建议为其Deployment设置自动扩缩容控制器,自动管理其副本数量。


同时,对资源限制部分(CPU限制和内存限制) 的设置也应根据实际环境进行调整。

2.5 创建Service

  1 [root@k8smaster01 ~]# vi corednssvc.yaml
2 apiVersion: v1
3 kind: Service
4 metadata:
5 name: kube-dns
6 namespace: kube-system
7 annotations:
8 prometheus.io/port: "9153"
9 prometheus.io/scrape: "true"
10 labels:
11 k8s-app: kube-dns
12 kubernetes.io/cluster-service: "true"
13 addonmanager.kubernetes.io/mode: Reconcile
14 kubernetes.io/name: "CoreDNS"
15 spec:
16 selector:
17 k8s-app: kube-dns
18 clusterIP: 10.254.0.2
19 ports:
20 - name: dns
21 port: 53
22 protocol: UDP
23 - name: dns-tcp
24 port: 53
25 protocol: TCP
26 - name: metrics
27 port: 9153
28 protocol: TCP
29
30 [root@k8smaster01 ~]# kubectl create -f corednssvc.yaml

2.6 确认验证

  1 [root@k8smaster01 ~]# kubectl get deployments --namespace=kube-system
2 NAME READY UP-TO-DATE AVAILABLE AGE
3 coredns 1/1 1 1 14s
4 [root@k8smaster01 ~]# kubectl get pod --namespace=kube-system
5 NAME READY STATUS RESTARTS AGE
6 coredns-5b46b98d57-cknrr 1/1 Running 0 34s
7 [root@k8smaster01 ~]# kubectl get svc --namespace=kube-system
8 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
9 kube-dns ClusterIP 10.254.0.2 <none> 53/UDP,53/TCP,9153/TCP 47s

三 服务名DNS解析

3.1 创建测试Pod

  1 [root@k8smaster01 ~]# vi busybox.yaml
2 apiVersion: v1
3 kind: Pod
4 metadata:
5 name: busybox
6 namespace: default
7 spec:
8 containers:
9 - name: busybox
10 image: gcr.azk8s.cn/google_containers/busybox
11 command:
12 - sleep
13 - "3600"
14
15 [root@k8smaster01 ~]# kubectl exec -ti busybox -- nslookup webapp #测试解析
16 Server: 10.254.0.2
17 Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local
18
19 Name: webapp
20 Address 1: 10.254.156.234 webapp.default.svc.cluster.local
提示:如果某个Service属于不同的命名空间,那么在进行Service查找时,需要补充Namespace的名称,组合成完整的域名。
  1 [root@k8smaster01 ~]# kubectl exec -ti busybox -- nslookup kube-dns.kube-system	#补充kube-system的namespace
2 Server: 10.254.0.2
3 Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local
4
5 Name: kube-dns.kube-system
6 Address 1: 10.254.0.2 kube-dns.kube-system.svc.cluster.local

四 CoreDNS配置说明

4.1 常见插件

CoreDNS的主要功能是通过插件系统实现的。CoreDNS实现了一种链式插件结构,将DNS的逻辑抽象成了一个个插件,能够灵活组合使用。
常用的插件如下:
  • loadbalance:提供基于DNS的负载均衡功能。
  • loop:检测在DNS解析过程中出现的简单循环问题。
  • cache:提供前端缓存功能。
  • health:对Endpoint进行健康检查。
  • kubernetes:从Kubernetes中读取zone数据。
  • etcd:从etcd读取zone数据,可以用于自定义域名记录。
  • file:从RFC1035格式文件中读取zone数据。
  • hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录。
  • auto:从磁盘中自动加载区域文件。
  • reload:定时自动重新加载Corefile配置文件的内容。
  • forward:转发域名查询到上游DNS服务器。
  • proxy:转发特定的域名查询到多个其他DNS服务器,同时提供到多个DNS服务器的负载均衡功能。
  • prometheus:为Prometheus系统提供采集性能指标数据的URL。
  • pprof:在URL路径/debug/pprof下提供运行时的性能数据。
  • log:对DNS查询进行日志记录。
  • errors:对错误信息进行日志记录。

4.2 插件配置

示例1:
  1 [root@k8smaster01 ~]# vi corednsconfigmap.yaml
2 apiVersion: v1
3 kind: ConfigMap
4 metadata:
5 name: coredns
6 namespace: kube-system
7 labels:
8 addonmanager.kubernetes.io/mode: EnsureExists
9 data:
10 Corefile: |
11 .:53 {
12 errors
13 health
14 kubernetes cluster.local in-addr.arpa ip6.arpa {
15 pods insecure
16 upstream
17 fallthrough in-addr.arpa ip6.arpa
18 }
19 prometheus :9153
20 forward . /etc/resolv.conf
21 cache 30
22 loop
23 reload
24 loadbalance
25 }
如上所示为域名“cluster.local”设置了一系列插件, 包括errors、health、kubernetes、prometheus、forward、cache、loop、reload和loadbalance,在进行域名解析时, 这些插件将以从上到下的顺序依次执行。
示例2:如下为使用etcd插件的配置示例,将以“.com”结尾的域名记录配置为从etcd中获取,并将域名记录保存在/skydns路径下。
  1 {
2 etcd com {
3 path /skydns
4 endpoint http://192.168.18.3:2379
5 upstream /etc/resolv.conf
6 }
7 cache 160 com
8 loadbalance
9 proxy . /etc/resolv.conf
10
11 }
12 [root@k8smaster01 ~]# etcdctl put /skydns/com/mycompany '{"host":"10.1.1.1","ttl":"60"}' #测试插入
13 [root@k8smaster01 ~]# nslookpu mycompany.com
提示:forward和proxy插件都可以用于配置上游DNS服务器或其他DNS服务器,当在CoreDNS中查询不到域名时,会到其他DNS服务器上进行查询。在实际环境中,可以将Kubernetes集群外部的DNS纳入CoreDNS,进行统一的DNS管理。

五 Pod级别的DNS设置

5.1 Pod级别设置

集群的DNS(CoreDNS)配置之外,针对Pod中也可以设置相应的DNS策略。
示例1:
  1 [root@k8smaster01 study]# vi mywebapp.yaml
2 apiVersion: v1
3 kind: Pod
4 metadata:
5 name: webapp
6 spec:
7 containers:
8 - name: webapp
9 image: tomcat
10 dnsPolicy: Default
11 ……
目前可以设置的DNS策略如下:
  • Default:继承Pod所在宿主机的DNS设置。
  • ClusterFirst:优先使用Kubernetes环境的DNS服务(如CoreDNS提供的域名解析服务),将无法解析的域名转发到从宿主机继承的DNS服务器。
  • ClusterFirstWithHostNet:与ClusterFirst相同,对于以hostNetwork模式运行的Pod,应明确指定使用该策略。
  • None:忽略Kubernetes环境的DNS配置,通过spec.dnsConfig自定义DNS配置。这个选项从Kubernetes1.9版本开始引入,到Kubernetes 1.10版本升级为Beta版,到Kubernetes1.14版本升级为稳定版。自定义DNS配置可以通过spec.dnsConfig字段进行设置,可以设置下列信息。
    • nameservers:一组DNS服务器的列表,最多可以设置3个。
    • searches:一组用于域名搜索的DNS域名后缀,最多可以设置6个。
    • options:配置其他可选DNS参数,例如ndots、timeout等,以name或name/value对的形式表示。
示例2:dnsConfig外部字段配置示例。
  1 [root@k8smaster01 study]# vi mywebapp.yaml
2 apiVersion: v1
3 kind: Pod
4 metadata:
5 namespace: default
6 name: dns-example
7 spec:
8 containers:
9 - name: test
10 image: nginx
11 dnsPolicy: "None"
12 dnsConfig:
13 nameservers:
14 - 223.5.5.5
15 searches:
16 - ns1.svc.cluster.local
17 - my.dns.search.suffix
18 options:
19 - name: ndots
20 value: "2"
21 - name: edns0
  1 [root@k8smaster01 study]# kubectl create -f mywebapp.yaml
2 [root@k8smaster01 study]# kubectl exec -ti dns-example -- cat /etc/resolv.conf #确认查看
3 nameserver 223.5.5.5
4 search ns1.svc.cluster.local my.dns.search.suffix
5 options ndots:2 edns0
提示:如上配置从而实现Pod中自定义DNS,而不再使用Kubernetes环境的DNS服务。

附011.Kubernetes-DNS及搭建的更多相关文章

  1. 附024.Kubernetes全系列大总结

    Kubernetes全系列总结如下,后期不定期更新.欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识.若发现任何错误或纰漏,留言反馈或右侧 ...

  2. Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序

    使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...

  3. Kubernetes 日志:搭建 EFK 日志系统

    Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch.Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案. Elasticsearch 是一个 ...

  4. Linux下dns服务器搭建

    Linux下dns服务器搭建1-环境Red Hat Enterprise Linux Server release 6.7 (Santiago)2-配置本地yum源安装dns相关包yum -y ins ...

  5. DNS服务器搭建(主、从、缓)

    主dns服务器搭建 在本机上搭建一个管理hngd.com域名的域名服务器1. 确保安装好以下bind域名服务器 [root@主人 ~]# rpm -qa |grep ^bindbind-chroot- ...

  6. Kubernetes DNS 简介

    环境 $ sudo lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16 ...

  7. Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

    搭建背景 企业环境中使用Docker环境,一般出于安全考虑,业务使用的镜像一般不会从第三方公共仓库下载.那么就要引出今天的主题 企业级环境中基于Harbor搭建自己的安全认证仓库 介绍 名称:Harb ...

  8. kubernetes集群搭建(2):docker私有仓库

    kubernetes集群搭建(1):环境准备 中各节点已经安装好了docker,请确认docker已启动并正常运行 1.通过命令启动私库 docker run -d -p 5000:5000 --pr ...

  9. 架构师成长之路6.6 DNS服务器搭建(构建企业级DNS)

    点击返回架构师成长之路 架构师成长之路6.6 DNS服务器搭建(构建企业级DNS) 采用LVS-DR模式负载均衡,多IDC,多套DNS集群,通过master-slave技术保证dns配置的一致性. 1 ...

随机推荐

  1. hystrix原理

    一.hystrix 产生背景 微服务是解决复杂服务的一个方案,在功能不变的情况下,对一个复杂的单体服务分解为多个可管理的分支.每个服务作为轻量的子服务,通过RPC实现服务间的关联,将服务简单化.每个服 ...

  2. git出现Your branch and 'origin/master' have diverged解决方法

    如果不需要保留本地的修改,只要执行下面两步:git fetch origingit reset --hard origin/master 当我们在本地提交到远程仓库的时候,如果遇到上述问题,我们可以首 ...

  3. 【并发编程】Volatile原理和使用场景解析

    目录 一个简单列子 Java内存模型 缓存不一致问题 并发编程中的"三性" 使用volatile来解决共享变量可见性 volatile和指令重排(有序性) volatile和原子性 ...

  4. Linux系统 multitail 同时跟踪查看多个日志文件

    一.问题描述: 平时我们在排查问题的时候往往需要查看日志文件来定位问题,有些程序可能关联的多个程序,因此需要打开多个窗口使用 tailf 或者tail -f 方式查看日志 但是需要不停的切换窗口来看不 ...

  5. Luogu P2668 斗地主(NOIP2015)

    还记得那道我只用特判得了30分的"斗地主"吗? 我今天脑抽打算把它改A掉.为什么不用这大好时光去干些更有意义的事 于是我就挖了这个坑. 题解: 题目链接:P2668 斗地主 本题就 ...

  6. Go defer使用

    defer使用语法 //defer后面必须是函数调用语句或方法调用语句,不能是其他语句,否则编译器会出错. package main import ( "fmt" ) func f ...

  7. Mybatis:配置解析

    配置解析  mybatis-config.xml(Mybatis核心配置文件)深深影响了Mybatis行为的设置和属性信息. 能配置的的内容 当然,并不是所有都是我们经常使用到的,下面选择经常使用的配 ...

  8. python-->二进制的用法

    1.10进制转换为其他进制 方法一:函数 十进制转二进制:bin(10) --> '0b1010' tpye:是字符串类型 0b:表示2进制 十进制转八进制:oct(10) --> '0o ...

  9. 深入理解计算机系统 第二章 信息的表示和处理 Part1 第二遍

    <深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 22 ~ 28 页) 第一遍对应笔记链接 https://www.cnblogs.com/s ...

  10. 三石之道之Ansible自动化运维工具部署

    centos6默认python版本为2.6 centos7默认python版本为2.7 ansible需要最低python2.7的支持 总结:centos6要部署ansible工具,需要先升级pyth ...