Cluster DNS主要包含如下几项:
- SkyDNS :提供DNS解析服务。
- Etcd :用于DNS的存储。
- Kube2sky :监听Kubernetes,当有新的Service创建时,将其注册到etcd上。
- healthz 提供对skydns服务的健康检查功能。
在 master服务器上
Cluster DNS在Kubernetes发布包的cluster/addons/dns目录下 yum -y install wget wget https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.2.7 tar zxvf v1.2.7 cd kubernetes-1.2.7/cluster/addons/dns
skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址,不能通过Kuberneters自动给skydns分配。
通过环境变量,配置参数 export DNS_SERVER_IP="10.254.10.2" export DNS_DOMAIN="cluster.local" export DNS_REPLICAS=1
设置 Cluster DNS Service的IP为 10.254.10.2(不能和已分配的IP重复),Cluster DNS的本地域为 cluster.local。
修改每台Node上的kubelet启动参数
vim /etc/kubernetes/kubelet #在KUBELET_ARGS里增加: --cluster_dns=10.254.10.2 #此处的cluster ip为dns服务的cluster ip 地址,不能通过k8s自动分配,每个node的kubelet进程都会使用这个ip地址,并且这个ip地址需要在 kube-apiserver启动参数--service-cluster-ip-range指定ip地址范围内 --cluster_domain=cluster.local #设置k8s集群中service所属的域名(为dns服务中设置的域名),这里要与svc.yaml中设置的域名相同,kube2sky会通过Api Server监控集群中的全部service的定义, 生成相应的 记录并保存到etcd中
重启kubelet服务
systemctl restart kubelet
master下
生成dns-rc.yaml和dns-svc.yaml
kubernetes-1.2.7/cluster/addons/dns目录下。
skydns-rc.yaml.in和skydns-svc.yaml.in是两个模板文件,通过设置的环境变量修改其中的相应属性值,可以生成Replication Controller和Service的定义文件。
生成Replication Controller的定义文件dns-rc.yaml创建RC
sed -e "s/{{ pillar\['dns_replicas'\] }}/${DNS_REPLICAS}/g;s/{{ pillar\['dns_domain'\] }}/${DNS_DOMAIN}/g" \skydns-rc.yaml.in > dns-rc.yaml
查看dns-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: kube-dns-v11 namespace: kube-system labels: k8s-app: kube-dns version: v11 kubernetes.io/cluster-service: "true" spec: replicas: 1 selector: k8s-app: kube-dns version: v11 template: metadata: labels: k8s-app: kube-dns version: v11 kubernetes.io/cluster-service: "true" spec: containers: - name: etcd image: index.tenxcloud.com/google_containers/etcd-amd64:2.2.1 resources: limits: cpu: 100m memory: 500Mi requests: cpu: 100m memory: 50Mi command: - /usr/local/bin/etcd - -data-dir - /var/etcd/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: /var/etcd/data - name: kube2sky image: index.tenxcloud.com/google_containers/kube2sky:1.14 resources: limits: cpu: 100m # Kube2sky watches all pods. memory: 200Mi 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: # command = "/kube2sky" #特别注意 #- -domain=cluster.local是错误的写法 #- -kube-master-url=http://192.168.121.143:8080根据自己实际情况修改 #会导致CrashLoopBackOff的错误 #如果已经进行CA认证,则可以不指定kube-master-url - --domain=cluster.local - --kube-master-url=http://192.168.132.148:8080 ##master地址 - name: skydns image: index.tenxcloud.com/google_containers/skydns:2015-10-13-8c72f8c resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 50Mi args: # command = "/skydns" - -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: index.tenxcloud.com/google_containers/exechealthz:1.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 # Don't use cluster DNS.
需要注意kube2sky需要ServiceAccount来调用Kubernetes API。
而ServiceAccount的使用需要对Kubernetes集群进行安全认证,否则可能会导致RC无法自动创建Pod等错误。
通过定义文件dns-rc.yaml创建Cluster DNS Replication Controller
kubectl create -f dns-rc.yaml
验证Cluster DNS Pod是否创建运行成功:
kubectl get pod --namespace=kube-system -o wide
生成Service的定义文件dns-svc.yaml创建Service
sed -e "s/{{ pillar\['dns_server'\] }}/${DNS_SERVER_IP}/g" \skydns-svc.yaml.in > dns-svc.yaml
dns-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.10.2 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
根据dns-svc.yaml创建Cluster DNS Service
kubectl create -f dns-svc.yaml
验证:
kubectl get svc --namespace=kube-system -o wide
创建Pod验证Cluster DNS
使用一个带有nslookup的工具来验证DNS是否能够正常工作:
busybox.yaml
apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: index.tenxcloud.com/google_containers/busybox command: - sleep - "
#kubectl create -f busybox.yaml #kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
ok,搭建完成