0°

带你玩转kubernetes-k8s(第31篇:k8s-深入掌握Service:DNS服务详细讲解)

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服务。

           谢谢大家的支持,喜欢的话可以点关注哦~

 

 

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!