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包含了定义实现四个组件的相应容器,具体内容如下:
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'
ps. 本例的实现参考了《Kubernetes权威指南:从Docker到Kubernetes实践全接触》(第2版)