设为首页 收藏本站
查看: 1169|回复: 0

[经验分享] Kubernetes DNS服务搭建指南

[复制链接]

尚未签到

发表于 2018-1-4 11:40:06 | 显示全部楼层 |阅读模式
  Kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成:


  • etcd:DNS存储
  • kube2sky:强Kubernetes Master中的service(服务)注册到etcd。
  • skyDNS:提供DNS域名解析服务。
  • healthz:提供对skydns服务的健康检查。
一 、skydns配置文件说明
  skydns服务将使用一个RC和一个Service实现,分别由配置文件skydns-rc.yaml和skydns-svc.yaml定义。
  RC的配置文件skydns-rc.yaml包含了定义实现四个组件的相应容器,具体内容如下:
  

apiVersion: v1  

kind: ReplicationController  

metadata:  

name: kube-dns  

namespace: kube-system  

labels:  

k8s-app: kube-dns  

version: v12  

kubernetes.io/cluster-service: "true"  

spec:  

replicas: 1  

selector:  

k8s-app: kube-dns  

version: v12  

template:  

metadata:  

labels:  

k8s-app: kube-dns  

version: v12  

kubernetes.io/cluster-service: "true"  

spec:  

containers:  

- name: etcd  

image: 192.168.3.51:5656/etcd-amd64:v2.2.5  

resources:  

limits:  

cpu: 100m  

memory: 50Mi  

requests:  

cpu: 100m  

memory: 50Mi  

command:  

- /usr/local/bin/etcd  

- --data-dir  

- /tmp/data  

- --listen-client-urls  

- http://127.0.0.1:2379,http://127.0.0.1:4001  

- --advertise-client-urls  

- http://127.0.0.1:2379,http://127.0.0.1:4001  

- --initial-cluster-token  

- skydns-etcd  

volumeMounts:  

- name: etcd-storage  

mountPath: /tmp/data  

- name: kube2sky  

image: 192.168.3.51:5656/kube2sky-amd64:v1.15  

resources:  

limits:  

cpu: 100m  

memory: 50Mi  

requests:  

cpu: 100m  

memory: 50Mi  

# livenessProbe:  

#   httpGet:  

#     path: /healthz  

#     port: 8080  

#     scheme: HTTP  

#   initialDelaySeconds: 60  

#   timeoutSeconds: 5  

#   successThreshold: 1  

#   failureThreshold: 5  

# readinessProbe:  

#   httpGet:  

#     path: /readiness  

#     port: 8081  

#     scheme: HTTP  

#   initialDelaySeconds: 30  

#   timeoutSeconds: 5  

args:  

- --kube-master-url=http://192.168.3.69:8080  

- --domain=cluster.local  

- name: skydns  

image: 192.168.3.51:5656/skydns-amd64:v1.0  

resources:  

limits:  

cpu: 100m  

memory: 50Mi  

requests:  

cpu: 100m  

memory: 50Mi  

args:  

- -machines=http://127.0.0.1:4001  

- -addr=0.0.0.0:53  

- -ns-rotate=false  

- -domain=cluster.local  

ports:  

- containerPort: 53  

name: dns  

protocol: UDP  

- containerPort: 53  

name: dns-tcp  

protocol: TCP  

- name: healthz  

image: 192.168.3.51:5656/exechealthz-amd64:v1.2.0  

resources:  

limits:  

cpu: 10m  

memory: 20Mi  

requests:  

cpu: 10m  

memory: 20Mi  

args:  

- -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null  

- -port=8080  

ports:  

- containerPort: 8080  

protocol: TCP  

volumes:  

- name: etcd-storage  

emptyDir: {}  

dnsPolicy: Default  

  需要修改的几个配置参数如下:
  (1)kube2sky容器需要访问Kubernetes Master,需要配置Master所在物理主机的IP地址和端口号,本例中设置的参数--kube-master-url的值为http://192.168.3.69:8080;
  (2)四个容器的image参数这里使用的是作者私有的镜像库,如果您可以FQ则可以使用“image:gcr.io/google_containers/imagename:version”,同样也可以使用docker search根据imagname进行搜索,根据结果进行修改。
  (3)kube2sky容器和skydns容器的启动参数--domain,设置Kubernetes集群中Service所属的域名,本例中为“cluster.local”。启动后,kube2sky会通过APIServer监控集群中全部的Service的定义,生成相应的记录并保存到etcd中。kube2sky为每个Service生成以下两条记录。


  • <service_name>.<namespace_name>.<domain>
  • <service_name>.<namespace_name>.svc.<domain>    
  skydns的Service配置文件skydns-svc.yaml的内容如下:
  

apiVersion: v1  

kind: Service  

metadata:  

name: kube-dns  

namespace: kube-system  

labels:  

k8s-app: kube-dns  

kubernetes.io/cluster-service: "true"  

kubernetes.io/name: "KubeDNS"  

spec:  

selector:  

k8s-app: kube-dns  

clusterIP: 10.254.16.254  

ports:  

- name: dns  

port: 53  

protocol: UDP  

- name: dns-tcp  

port: 53  

protocol: TCP  

  注意:


  • skydns服务使用的clusterIP需要指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址。
  • 这个IP地址需要在kube-apiserver启动参数--service-cluster-ip-range指定的IP地址范围内。
二、修改每台Node上的kubelet的启动参数
  本例是通过修改/etc/kubernetes/kubelet来实现的:
  

  # Add your own!  
  KUBELET_ARGS="--cluster-dns=10.254.16.254 --cluster-domain=cluster.local"
  

  

  注意根据自己的配置环境修改参数cluster_dns和cluster_domain。
  然后,重启kubelet服务。

三、创建skydns RC和Service
  使用kubectl create完成skydns的RC和Service创建:
  

    #kubectl create -f skydns-rc.yaml  #kubectl create -f skydns-svc.yaml
  

  

  查看RC、Pod和Service,确保容器启动成功:
  

[iyunv@master ~]# kubectl get rc --namespace=kube-system  
NAME       DESIRED   CURRENT   AGE
  
kube-dns   1         1         14h
  
[iyunv@master~]# kubectl get pod --namespace=kube-system
  
NAME                                    READY     STATUS    RESTARTS   AGE
  
kube-dns-kvv13                          4/4       Running   0          14h
  
[iyunv@master ~]# kubectl get svc --namespace=kube-system
  
NAME                   CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
  
kube-dns               10.254.16.254   <none>        53/UDP,53/TCP   14h
  

  


四、通过DNS查找Service
  该工作是使用一个带有nslookup工具的Pod来验证DNS服务是否工作正常:
  

# cat busybox.yaml  
apiVersion: v1
  
kind: Pod
  
metadata:
  name: busybox
  
spec:
  containers:
  - name: busybox
  image: 192.168.3.51:5656/busybox
  command:
  - sleep
  - "3600"
  

  

  运行kubectl create -f busybox.yaml完成创建。
  在容器运行成功启动之后,通过kubectl exec <service_name> nslookup进行测试:
  

# kubectl exec busybox -- nslookup kubernetes  
Server:    10.254.16.254
  
Address 1: 10.254.16.254
  

  
Name:      kubernetes
  
Address 1: 10.254.0.1
  

  

  如果某个服务属于不同的命名空间,那么进行Service查找时,需要带上namespace的名字,如下所示。
  

# kubectl exec busybox -- nslookup kube-dns.kube-system  
Server:    10.254.16.254
  
Address 1: 10.254.16.254
  

  
Name:      kube-dns.kube-system
  
Address 1: 10.254.16.254
  

  

  否则将会失败:
  

# kubectl exec busybox -- nslookup kube-dns  
Server:    10.254.16.254
  
Address 1: 10.254.16.254
  

  
nslookup: can't resolve 'kube-dns'
  

  

  ps. 本例的实现参考了《Kubernetes权威指南:从Docker到Kubernetes实践全接触》(第2版)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431475-1-1.html 上篇帖子: 小炒肉的学习之路 下篇帖子: Kubernetes容器上下文环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表