雖然通過了Service解決了Pod重建後IP動态變化(服務發現)、負載均衡問題,但使用Service還是要需要知道CLUSTER-IP,而通過NDS可以解決該問題;在Kubernetes叢集中可通過DNS進行Service服務名與IP進行映射,進而需要知道Service名稱就可以通路該服務,這裡将通過kube-dns來實作該功能;
在https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns中下載下傳
kubedns-cm.yaml
kubedns-controller.yaml.sed
kubedns-sa.yaml
kubedns-svc.yaml.sed
四個檔案,其中.sed結尾的兩個檔案為模闆檔案需要重命名為:kubedns-controller.yaml、kubedns-svc.yaml,并對兩個檔案做以下修改:
Kubedns-controller.yaml檔案中所有\(DNS_DOMAIN修改為:**cluster.local**
Kubedns-svc.yaml檔案中所有\)DNS_SERVER_IP修改為:10.254.0.2
注意$DNS_SERVER_IP的IP必須在kube-apiserver的配置項--service-cluster-ip-range=10.254.0.0/16範圍内;
Kube-dns的域名格式為:<serviceName>.<namespace>.svc.<cluster_domain>
依賴
由于kube-dns依賴于k8s-dns-kube-dns-amd64、k8s-dns-dnsmasq-nanny-amd64、k8s-dns-sidecar-amd64三個鏡像,而此鏡像都是google官方鏡像必須從google站點下載下傳,此時可通過第三方鏡像倉庫代理下載下傳再pull到本地然後通過docker tag打上官方的标簽(或修改kubedns-controller.yaml、kubedns-svc.yaml檔案中鏡像的位址為第三方位址),關于第三方鏡像倉庫代理下載下傳可以看這篇檔案:代理下載下傳;
安裝
經過現在上訴的操作後接下來可以安裝kube-dns,執行下面幾行指令;
Kubectl create -f kubedns-cm.yaml
Kubectl create -f kubedns-sa.yaml
Kubectl create -f kubedns-svc.yaml
Kubectl create -f kubedns-controller.yaml
建立完成後再dashboard中已可以看到kube-dns相關服務是否正常:

由于node節點需要使用dns進行服務解析,是以還需要修改kubelet服務配置項,在kubelet配置檔案中添加上dns配置:--cluster-dns=10.254.0.2、--cluster-domain=cluster.local兩項配置正式上面yaml檔案模闆中所添加的值;此時DNS服務已安裝完成;
驗證DNS
通過pod驗證DNS,下面通過pod啟動一個busybox容器驗證dns是否正常;
pod的yaml檔案内容如下:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
執行下面指令建立pod:
Kubectl create -f busybox.yaml
執行kubectl exec busybox nslookup kubernetes指令,如顯示如下圖資訊則說明dns已正常運作;
該指令為在容器busybox中執行nsloolup kubernetes查詢kubernetes的dns資訊;
還可以執行kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
kubernetes.default.svc.cluster.local為在kubedns-controller.yaml檔案中配置的資訊;
文章首發位址:Solinx
http://www.solinx.co/archives/1061