Kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成:

  1. etcd:DNS存储
  2. kube2sky:强Kubernetes Master中的service(服务)注册到etcd。
  3. skyDNS:提供DNS域名解析服务。
  4. healthz:提供对skydns服务的健康检查。

一 、skydns配置文件说明

skydns服务将使用一个RC和一个Service实现,分别由配置文件skydns-rc.yaml和skydns-svc.yaml定义。

RC的配置文件skydns-rc.yaml包含了定义实现四个组件的相应容器,具体内容如下:

 



1 apiVersion: v1
  2 kind: ReplicationController
  3 metadata:
  4   name: kube-dns
  5   namespace: kube-system
  6   labels:
  7     k8s-app: kube-dns
  8     version: v12
  9     kubernetes.io/cluster-service: "true"
 10 spec:
 11   replicas: 1
 12   selector:
 13     k8s-app: kube-dns
 14     version: v12
 15   template:
 16     metadata:
 17       labels:
 18         k8s-app: kube-dns
 19         version: v12
 20         kubernetes.io/cluster-service: "true"
 21     spec:
 22       containers:
 23       - name: etcd
 24         image: 192.168.3.51:5656/etcd-amd64:v2.2.5
 25         resources:
 26           limits:
 27             cpu: 100m
 28             memory: 50Mi
 29           requests:
 30             cpu: 100m
 31             memory: 50Mi
 32         command:
 33         - /usr/local/bin/etcd
 34         - --data-dir
 35         - /tmp/data
 36         - --listen-client-urls
 37         - http://127.0.0.1:2379,http://127.0.0.1:4001
 38         - --advertise-client-urls
 39         - http://127.0.0.1:2379,http://127.0.0.1:4001
 40         - --initial-cluster-token
 41         - skydns-etcd
 42         volumeMounts:
 43         - name: etcd-storage
 44           mountPath: /tmp/data
 45       - name: kube2sky
 46         image: 192.168.3.51:5656/kube2sky-amd64:v1.15
 47         resources:
 48           limits:
 49             cpu: 100m
 50             memory: 50Mi
 51           requests:
 52             cpu: 100m
 53             memory: 50Mi
 54        # livenessProbe:
 55        #   httpGet:
 56        #     path: /healthz
 57        #     port: 8080
 58        #     scheme: HTTP
 59        #   initialDelaySeconds: 60
 60        #   timeoutSeconds: 5
 61        #   successThreshold: 1
 62        #   failureThreshold: 5
 63        # readinessProbe:
 64        #   httpGet:
 65        #     path: /readiness
 66        #     port: 8081
 67        #     scheme: HTTP
 68        #   initialDelaySeconds: 30
 69        #   timeoutSeconds: 5
 70         args:
 71         - --kube-master-url=http://192.168.3.69:8080
 72         - --domain=cluster.local
 73       - name: skydns
 74         image: 192.168.3.51:5656/skydns-amd64:v1.0
 75         resources:
 76           limits:
 77             cpu: 100m
 78             memory: 50Mi
 79           requests:
 80             cpu: 100m
 81             memory: 50Mi
 82         args:
 83         - -machines=http://127.0.0.1:4001
 84         - -addr=0.0.0.0:53
 85         - -ns-rotate=false
 86         - -domain=cluster.local
 87         ports:
 88         - containerPort: 53
 89           name: dns
 90           protocol: UDP
 91         - containerPort: 53
 92           name: dns-tcp
 93           protocol: TCP
 94       - name: healthz
 95         image: 192.168.3.51:5656/exechealthz-amd64:v1.2.0
 96         resources:
 97           limits:
 98             cpu: 10m
 99             memory: 20Mi
100           requests:
101             cpu: 10m
102             memory: 20Mi
103         args:
104         - -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null
105         - -port=8080
106         ports:
107         - containerPort: 8080
108           protocol: TCP
109       volumes:
110       - name: etcd-storage
111         emptyDir: {}
112       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的内容如下:



1 apiVersion: v1
 2 kind: Service
 3 metadata:
 4   name: kube-dns
 5   namespace: kube-system
 6   labels:
 7     k8s-app: kube-dns
 8     kubernetes.io/cluster-service: "true"
 9     kubernetes.io/name: "KubeDNS"
10 spec:
11   selector:
12     k8s-app: kube-dns
13   clusterIP: 10.254.16.254
14   ports:
15   - name: dns
16     port: 53
17     protocol: UDP
18   - name: dns-tcp
19     port: 53
20     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,确保容器启动成功:



[root@master ~]# kubectl get rc --namespace=kube-system NAME DESIRED CURRENT AGE kube-dns 1 1 14h [root@master~]# kubectl get pod --namespace=kube-system NAME READY STATUS RESTARTS AGE kube-dns-kvv13 4/4 Running 0 14h [root@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'