DNS服务搭建和配置指南
作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。
DNS服务在Kubernetes的发展过程中经历了3个阶段,接下来会继续讲解。
在k8s1.2版本时,DNS服务是由SkyDNS提供的,它由4个容器组成:kube2sky、skydns、etcd和healthz。
kube2sky容器监听k8s中Service资源的变化,根据Service的名称和IP地址信息生成DNS记录,并将其保存到etcd中;
skydns容器从etcd中读取DNS记录,并为客户端容器应用提供DNS查询服务;
healthz容器提供对skydns服务的健康检查功能。
从Kubernetes1.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服务的健康检查功能。
从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为例说明Kubernetes集群DNS服务的搭建过程。
在创建DNS服务之前修改每个Node上kubelet的启动参数
修改每个Node上Kubelet的启动参数,加上以下两个参数。
◎ –cluster-dns=169.169.0.100:为DNS服务的ClusterIP地址。
◎ –cluster-domain=cluster.local:为在DNS服务中设置的域名。
然后重启kubelet服务。
我们使用kubeadm安装的时候,已经安装了coredns
kubelet 的启动参数在此目录下修改,或者在config.yaml下面修改,图片上面有。
在此处添加:
1
2 1Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
2
创建CoreDNS应用
在部署CoreDNS应用前,至少需要创建一个ConfigMap、一个Deployment和一个Service共3个资源对象。在启用了RBAC的集群中,还可以设置ServiceAccount、ClusterRole、ClusterRoleBinding对CoreDNS容器进行权限设置。
ConfigMap“coredns”主要设置CoreDNS的主要配置文件Corefile的内容,其中可以定义各种域名的解析方式和使用插件,示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: coredns
5 namespace: kube-system
6data:
7 Corefile: |
8 cluster.local {
9 errors
10 health
11 kubernetes cluster.local in-addr.arpa ip6.arpa {
12 pods insecure
13 upstream
14 fallthrough in-addr.arpa ip6.arpa
15 }
16 prometheus :9153
17 forward . /etc/resolv.conf
18 cache 30
19 loop
20 reload
21 loadbalance
22 }
23 . {
24 cache 30
25 loadbalance
26 forward . /etc/resolv.conf
27 }
28
29
由于Kubeadm已经为我们安装了coreDNS,所以我们可以直接查看对于的yaml文件:
Deployment “coredns” 主要设置CoreDNS容器应用的内容,示例如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: coredns
5 namespace: kube-system
6 labels:
7 k8s-app: kube-dns
8 kubernetes.io/cluster-service: "true"
9 addonmanager.kubernetes.io/mode: Reconcile
10 kubernetes.io/name: "CoreDNS"
11spec:
12 replicas: 1
13 strategy:
14 type: RollingUpdate
15 rollingUpdate:
16 maxUnavailable: 1
17 selector:
18 matchLabels:
19 k8s-app: kube-dns
20 template:
21 metadata:
22 labels:
23 k8s-app: kube-dns
24 annotations:
25 seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
26 spec:
27 priorityClassName: system-cluster-critical
28 tolerations:
29 - key: "CriticalAddonsOnly"
30 operator: "Exists"
31 nodeSelector:
32 beta.kubernetes.io/os: linux
33 containers:
34 - name: coredns
35 image: coredns/coredms:1.3.1
36 imagePullPolicy: IfNotPresent
37 resources:
38 limits:
39 memory: 170Mi
40 requests:
41 cpu: 100m
42 memonry: 70Mi
43 args: ["-conf", "/etc/coredns/Corefile"]
44 volumeMounts:
45 - name: config-volume
46 mountPath: /etc/coredns
47 readOnly: ture
48 ports:
49 - containerPort: 53
50 name: dns
51 protocol: UDP
52 - containerPort: 53
53 protocol: TCP
54 name: dns-tcp
55 - containerPort: 9153
56 name: metrics
57 protocol: TCP
58 livenessProbe:
59 httpGet:
60 path: /health
61 port: 8080
62 scheme: HTTP
63 initialDelaySeconds: 60
64 timeoutSeconds: 5
65 successThreshold: 1
66 failureThreshold: 5
67 securityContext:
68 allowPrivilegeEscalation: false
69 capabilities:
70 add:
71 - NET_BIND_SERVICE
72 drop:
73 - all
74 readOnlyRootFilesystem: ture
75 dnsPolicy: Default
76 volumes:
77 - name: config-volume
78 configMap:
79 name: coredns
80 items:
81 - key: Corefile
82 path: Corefile
83
其中,replicas副本的数量通常应该根据集群的规模和服务数量确定,如果单个CoreDNS进程不足以支撑整个集群的DNS查询,则可以通过水平扩展提高查询能力。由于DNS服务是Kubernetes集群的关键核心服务,所以建议为其Deployment设置自动扩缩容控制器,自动管理其副本数量。另外,对资源限制部分(CPU限制和内存限制)的设置也应根据实际环境进行调整。
ps: yaml文件以下面的为主
kubectl get deployment -n kube-system coredns -o yaml得到如下结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 1apiVersion: extensions/v1beta1
2kind: Deployment
3metadata:
4 annotations:
5 deployment.kubernetes.io/revision: "1"
6 creationTimestamp: "2019-07-30T02:19:22Z"
7 generation: 1
8 labels:
9 k8s-app: kube-dns
10 name: coredns
11 namespace: kube-system
12 resourceVersion: "898"
13 selfLink: /apis/extensions/v1beta1/namespaces/kube-system/deployments/coredns
14 uid: 71ce85cd-b270-11e9-b560-005056944210
15spec:
16 progressDeadlineSeconds: 600
17 replicas: 2
18 revisionHistoryLimit: 10
19 selector:
20 matchLabels:
21 k8s-app: kube-dns
22 strategy:
23 rollingUpdate:
24 maxSurge: 25%
25 maxUnavailable: 1
26 type: RollingUpdate
27 template:
28 metadata:
29 creationTimestamp: null
30 labels:
31 k8s-app: kube-dns
32 spec:
33 containers:
34 - args:
35 - -conf
36 - /etc/coredns/Corefile
37 image: docker.io/dustise/coredns:1.3.1
38 imagePullPolicy: IfNotPresent
39 livenessProbe:
40 failureThreshold: 5
41 httpGet:
42 path: /health
43 port: 8080
44 scheme: HTTP
45 initialDelaySeconds: 60
46 periodSeconds: 10
47 successThreshold: 1
48 timeoutSeconds: 5
49 name: coredns
50 ports:
51 - containerPort: 53
52 name: dns
53 protocol: UDP
54 - containerPort: 53
55 name: dns-tcp
56 protocol: TCP
57 - containerPort: 9153
58 name: metrics
59 protocol: TCP
60 readinessProbe:
61 failureThreshold: 3
62 httpGet:
63 path: /health
64 port: 8080
65 scheme: HTTP
66 periodSeconds: 10
67 successThreshold: 1
68 timeoutSeconds: 1
69 resources:
70 limits:
71 memory: 170Mi
72 requests:
73 cpu: 100m
74 memory: 70Mi
75 securityContext:
76 allowPrivilegeEscalation: false
77 capabilities:
78 add:
79 - NET_BIND_SERVICE
80 drop:
81 - all
82 procMount: Default
83 readOnlyRootFilesystem: true
84 terminationMessagePath: /dev/termination-log
85 terminationMessagePolicy: File
86 volumeMounts:
87 - mountPath: /etc/coredns
88 name: config-volume
89 readOnly: true
90 dnsPolicy: Default
91 nodeSelector:
92 beta.kubernetes.io/os: linux
93 priorityClassName: system-cluster-critical
94 restartPolicy: Always
95 schedulerName: default-scheduler
96 securityContext: {}
97 serviceAccount: coredns
98 serviceAccountName: coredns
99 terminationGracePeriodSeconds: 30
100 tolerations:
101 - key: CriticalAddonsOnly
102 operator: Exists
103 - effect: NoSchedule
104 key: node-role.kubernetes.io/master
105 volumes:
106 - configMap:
107 defaultMode: 420
108 items:
109 - key: Corefile
110 path: Corefile
111 name: coredns
112 name: config-volume
113status:
114 availableReplicas: 2
115 conditions:
116 - lastTransitionTime: "2019-07-30T02:25:38Z"
117 lastUpdateTime: "2019-07-30T02:25:38Z"
118 message: Deployment has minimum availability.
119 reason: MinimumReplicasAvailable
120 status: "True"
121 type: Available
122 - lastTransitionTime: "2019-07-30T02:19:28Z"
123 lastUpdateTime: "2019-07-30T02:25:42Z"
124 message: ReplicaSet "coredns-6897bd7b5" has successfully progressed.
125 reason: NewReplicaSetAvailable
126 status: "True"
127 type: Progressing
128 observedGeneration: 1
129 readyReplicas: 2
130 replicas: 2
131 updatedReplicas: 2
132
133
Service“kube-dns”是DNS服务的配置,示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1apiVersion: v1
2kind: Service
3metadata:
4 labels:
5 k8s-app: kube-dns
6 kubernetes.io/cluster-service: "true"
7 kubernetes.io/name: KubeDNS
8 name: kube-dns
9 namespace: kube-system
10spec:
11 selector:
12 k8s-app: kube-dns
13 clusterIP: 10.96.0.10
14 ports:
15 - name: dns
16 port: 53
17 protocol: UDP
18 targetPort: 53
19 - name: dns-tcp
20 port: 53
21 protocol: TCP
22 targetPort: 53
23 - name: metrics
24 port: 9153
25 protocol: TCP
26
27
28
29
这个服务需要设置固定的ClusterIP,也需要将所有Node上的kubelet启动参数–cluster-dns设置为这个ClusterIP。
如果没有安装CoreDNS的小伙伴,可以通过上面的yaml创建安装哦
服务名的DNS解析
接下来使用一个带有nslookup工具的Pod来验证DNS服务能否正常工作:
1
2
3
4
5
6
7
8
9
10
11
12
13 1apiVersion: v1
2kind: Pod
3metadata:
4 name: busybox
5 namespace: default
6spec:
7 containers:
8 - name: busybox
9 image: busybox
10 command:
11 - sleep
12 - "3600"
13
创建busybox并验证DNS服务器
在使用nslookup工具验证DNS服务能否正常工作:
1
2 1kubectl exec busybos -- nslookup <namespaces>.<podname>
2
如果某个Service属于不同的命名空间,那么在进行Service查找时,需要补充Namespace的名称,组合成完整的域名。下面以查找kube-dns服务为例,将其所在的Namespace“kube-system”补充在服务名之后,用“.”连接为“kube-dns.kube-system”,即可查询成功。
小结:
今天的内容到此结束,明天我们接着讲解DNS服务。
谢谢大家的支持,喜欢的话可以点关注哦~