CoreDNS解决了什么问题?
k8s平台中,各种应用会随机分发到节点服务器上运行,外界无法找到应用的访问地址。

一、配置pod资源定义模板

(本次实验采用网络存储方式来保存pod定义模板,实际应用的时候也可以以本地文件的形式保存)

1.1 配置Nginx (在 k8s-5-141 主机上操作)

  1. #添加nginx转发服务
  2. [root@k8s-5-141 /]# vim /etc/nginx/conf.d/k8s-yaml.od.com.conf
  3. server {
  4. listen 80;
  5. server_name k8s-yaml.od.com;
  6. location / {
  7. autoindex on;
  8. default_type text/plain;
  9. root /data/k8s-yaml;
  10. }
  11. }
  12. # 创建需要用到的目录
  13. [root@k8s-5-141 /]# mkdir /data/k8s-yaml/coredns
  14. #重启nginx
  15. [root@k8s-5-141 /]# nginx -t
  16. [root@k8s-5-141 /]# nginx -s reload

1.2 创建 pod 定义模板

  1. # cm.yaml
  2. [root@k8s-5-141 /]# vim /data/k8s-yaml/coredns/cm.yaml
  3. apiVersion: v1
  4. kind: ConfigMap
  5. metadata:
  6. name: coredns
  7. namespace: kube-system
  8. data:
  9. Corefile: |
  10. .:53 {
  11. errors
  12. log
  13. health
  14. ready
  15. kubernetes cluster.local 192.168.0.0/16
  16. forward . 192.168.5.140
  17. cache 30
  18. loop
  19. reload
  20. loadbalance
  21. }
  22. # dp.yaml
  23. [root@k8s-5-141 /]# vim /data/k8s-yaml/coredns/dp.yaml
  24. apiVersion: apps/v1
  25. kind: Deployment
  26. metadata:
  27. name: coredns
  28. namespace: kube-system
  29. labels:
  30. k8s-app: coredns
  31. kubernetes.io/name: "CoreDNS"
  32. spec:
  33. replicas: 1
  34. selector:
  35. matchLabels:
  36. k8s-app: coredns
  37. template:
  38. metadata:
  39. labels:
  40. k8s-app: coredns
  41. spec:
  42. priorityClassName: system-cluster-critical
  43. serviceAccountName: coredns
  44. containers:
  45. - name: coredns
  46. image: harbor.od.com/public/coredns:1.7.0
  47. args:
  48. - -conf
  49. - /etc/coredns/Corefile
  50. volumeMounts:
  51. - name: config-volume
  52. mountPath: /etc/coredns
  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. dnsPolicy: Default
  73. volumes:
  74. - name: config-volume
  75. configMap:
  76. name: coredns
  77. items:
  78. - key: Corefile
  79. path: Corefile
  80. #rbac.yaml
  81. [root@k8s-5-141 /]# vim /data/k8s-yaml/coredns/rbac.yaml
  82. apiVersion: v1
  83. kind: ServiceAccount
  84. metadata:
  85. name: coredns
  86. namespace: kube-system
  87. labels:
  88. kubernetes.io/cluster-service: "true"
  89. addonmanager.kubernetes.io/mode: Reconcile
  90. ---
  91. apiVersion: rbac.authorization.k8s.io/v1
  92. kind: ClusterRole
  93. metadata:
  94. labels:
  95. kubernetes.io/bootstrapping: rbac-defaults
  96. addonmanager.kubernetes.io/mode: Reconcile
  97. name: system:coredns
  98. rules:
  99. - apiGroups:
  100. - ""
  101. resources:
  102. - endpoints
  103. - services
  104. - pods
  105. - namespaces
  106. verbs:
  107. - list
  108. - watch
  109. ---
  110. apiVersion: rbac.authorization.k8s.io/v1
  111. kind: ClusterRoleBinding
  112. metadata:
  113. annotations:
  114. rbac.authorization.kubernetes.io/autoupdate: "true"
  115. labels:
  116. kubernetes.io/bootstrapping: rbac-defaults
  117. addonmanager.kubernetes.io/mode: EnsureExists
  118. name: system:coredns
  119. roleRef:
  120. apiGroup: rbac.authorization.k8s.io
  121. kind: ClusterRole
  122. name: system:coredns
  123. subjects:
  124. - kind: ServiceAccount
  125. name: coredns
  126. namespace: kube-system
  127. #svc.yaml
  128. [root@k8s-5-141 /]# vim /data/k8s-yaml/coredns/svc.yaml
  129. apiVersion: v1
  130. kind: Service
  131. metadata:
  132. name: coredns
  133. namespace: kube-system
  134. labels:
  135. k8s-app: coredns
  136. kubernetes.io/cluster-service: "true"
  137. kubernetes.io/name: "CoreDNS"
  138. spec:
  139. selector:
  140. k8s-app: coredns
  141. clusterIP: 192.168.0.2
  142. ports:
  143. - name: dns
  144. port: 53
  145. protocol: UDP
  146. - name: dns-tcp
  147. port: 53
  148. - name: metrics
  149. port: 9153
  150. protocol: TCP

1.3 设置 dns

在 k8s-5-140 服务器上操作

  1. [root@k8s-5-140 ~]# vim /var/named/od.com.zone
  2. $ORIGIN od.com.
  3. $TTL 600 ; 10 minutes
  4. @ IN SOA dns.od.com. dnsadmin.od.com. (
  5. 2021031605 ; serial
  6. 10800 ; refresh (3 hours)
  7. 900 ; retry (15 minutes)
  8. 604800 ; expire (1 week)
  9. 86400 ; minimum (1 day)
  10. )
  11. NS dns.od.com.
  12. $TTL 60 ; 1 minute
  13. dns A 192.168.5.140
  14. harbor A 192.168.5.141
  15. k8s-yaml A 192.168.5.141 #增加这一行
  16. # 重启named服务
  17. [root@k8s-5-140 ~]# systemctl restart named
  18. [root@k8s-5-140 ~]# dig -t A k8s-yaml.od.com @192.168.5.140 +short
  19. 192.168.5.141

二、下载coredns镜像

在任何一台安装有docker的服务器上操作都行, 我为了验证k8s集群自动部署的效果,所以在运维主机上操作的

  1. [root@k8s-5-141 /]# docker pull coredns/coredns:1.7.0
  2. 1.7.0: Pulling from coredns/coredns
  3. Digest: sha256:73ca82b4ce829766d4f1f10947c3a338888f876fbed0540dc849c89ff256e90c
  4. Status: Image is up to date for coredns/coredns:1.7.0
  5. docker.io/coredns/coredns:1.7.0
  6. [root@k8s-5-141 /]# docker images |grep coredns
  7. coredns/coredns 1.7.0 bfe3a36ebd25 9 months ago 45.2MB
  8. [root@k8s-5-141 /]# docker tag bfe3a36ebd25 harbor.od.com/public/coredns:1.7.0
  9. [root@k8s-5-141 /]# docker images |grep coredns
  10. coredns/coredns 1.7.0 bfe3a36ebd25 9 months ago 45.2MB
  11. harbor.od.com/public/coredns 1.7.0 bfe3a36ebd25 9 months ago 45.2MB
  12. [root@alice001 ~]# docker push harbor.od.com/public/coredns:1.7.0
  13. docker push harbor.od.com/public/coredns:1.7.0
  14. The push refers to repository [harbor.od.com/public/coredns]
  15. da1ec456edc8: Pushed
  16. 225df95e717c: Pushed
  17. 1.7.0: digest: sha256:c7bf0ce4123212c87db74050d4cbab77d8f7e0b49c041e894a35ef15827cf938 size: 739

三、部署 coredns

在任意一台k8s节点服务器上操作

  1. [root@k8s-5-138 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/rbac.yaml
  2. serviceaccount/coredns created
  3. clusterrole.rbac.authorization.k8s.io/system:coredns created
  4. clusterrolebinding.rbac.authorization.k8s.io/system:coredns created
  5. [root@k8s-5-138 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/cm.yaml
  6. configmap/coredns created
  7. [root@k8s-5-138 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/dp.yaml
  8. deployment.apps/coredns created
  9. [root@k8s-5-138 ~]# kubectl apply -f http://k8s-yaml.od.com/coredns/svc.yaml
  10. service/coredns created

四、验证

  1. [root@k8s-5-138 ~]# dig -t A www.baidu.com @192.168.0.2 +short
  2. www.a.shifen.com.
  3. 14.215.177.38
  4. 14.215.177.39
  5. [root@k8s-5-138 ~]# kubectl get svc
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 7d
  8. nginx-web ClusterIP 192.168.200.143 <none> 80/TCP 20h
  9. [root@k8s-5-138 ~]# kubectl get svc -n kube-system
  10. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  11. coredns ClusterIP 192.168.0.2 <none> 53/UDP,53/TCP,9153/TCP 20h
  12. [root@k8s-5-138 ~]# dig -t A nginx-web.default.svc.cluster.local @192.168.0.2 +short
  13. 192.168.200.143
  14. #部署应用,检查是否可以通过
  15. [root@alice002 ~]# kubectl create deployment nginx-ds --image=harbor.od.com/public/nginx:v1.7.9
  16. deployment.apps/nginx-ds created
  17. [root@alice002 ~]# kubectl expose deployment nginx-ds --port=80 --target-port=80
  18. service/nginx-web exposed