在之前幾篇文章的基礎,(Centos7部署Kubernetes叢集、基於kubernetes叢集部署DashBoard、為Kubernetes叢集部署本地映象倉庫),本文繼續搭建Kubernete中的服務註冊發現機制——SkyDNS.
1、部署Cluster DNS
1.1 原理
通過前面對Kubernetes的討論(Kubernetes核心概念總結).我們已經知道,每個Kubernetes service都繫結了一個虛擬IP 地址(ClusterIP),而且Kubernetes最初使用向pod中注入環境變數的方式實現服務發現,但這會帶來環境變數氾濫等問題。故需要增加叢集DNS服務為每個service對映一個域名。到Kubernetes v1.2版本時,DNS作為一個系統可選外掛整合到Kubernetes叢集中。Kubernetes預設使用SkyDNS 作為叢集的DNS伺服器,
kubernetes可以為pod提供dns(skyDNS)內部域名解析服務。其主要作用是為pod提供可以直接通過service的名字解析為對應service的ip的功能。啟用了叢集DNS選項,需要建立一個執行SkyDNS域名伺服器的pod和一個對外提供叢集service域名解析服務的SkyDNS service,並且還會為該service繫結一個穩定的靜態IP地址作為入口IP地址。然後,Kubelet被配置成向每個Docker容器傳人SkyDNS service的IP地址。作為它們其中一個DNS伺服器。每個在Kubernetes叢集中定義的service包括DNS伺服器本身對應的service都會被對映到一個DNS域名,該域名一般由兩個部分組成:service所在namespace和service名。默認情況下,一個客戶端pod的DNS搜尋列表一般包含pod自身的namespace和叢集的預設域名集。SkyDNS service的域名搜尋順序大致如下。
搜尋客戶端pod所在namespace中所有的service域名記錄;
搜尋目標域名namespace中所有的service域名記錄;
從當前Kubernetes叢集中,搜尋所有的service域名記錄。
skyDNS由三部分組成:kube2sky、etcd、skydns。
kube2sky的功能是監測api-server中的service的變化,當service建立、刪除、修改時,獲取對應的service資訊,將其儲存在etcd的中;
Etcd的功能是儲存kube2sky儲存過來的資料;
Skydns。在kubelet建立pod時,會使用為kubelet配置的“KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true"” 在建立的pod中從而使用對應的dns伺服器。而這一dns解析服務,實際是由Skydns提供的。
1.2 配置etcd中關於skyDNS的key
[root@k8s-master ~]# etcdctl mk /skydns/config '{"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}' {"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}
1.3 配置kubelet中相關資訊
在每個node中更改kubelet的配置檔案如下紅色部分,更改完成之後重啟服務。
[root@K8s-node-1 ~]# vim /etc/kubernetes/kubelet ### # kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=0.0.0.0" # The port for the info server to serve on # KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname #KUBELET_HOSTNAME="--hostname-override=127.0.0.1" KUBELET_HOSTNAME="--hostname-override=k8s-node-1" # location of the api-server KUBELET_API_SERVER="--api-servers=http://k8s-master:8080" # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" # Add your own! KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true" [root@k8s-node-1 ~]# systemctl restart kubelet.service
1.4 yaml檔案
編輯skydns_dpm.yaml檔案,更改以下紅色部分(拷貝到機器上之後,最好把中文註釋去掉):
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kube-dns namespace: kube-system spec: replicas: 1 template: metadata: labels: name: kube-dns tier: platform subsystem: unconfirmed k8s-app: kube-dns version: v9 partition: "no" kubernetes.io/cluster-service: "true" spec: containers: - name: kube2sky #填寫你自己的映象名稱 image: gcr.io/google_containers/kube2sky:1.11 resources: limits: cpu: 100m memory: 50Mi args: # 同etcd中配置的/skydns/config中的domain名 - -domain=sky # master地址 - --kube_master_url=http://10.0.251.148:8080 # etcd地址 - -etcd-server=http://10.0.251.148:2379 - name: skydns #你的映象名稱 image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c resources: limits: cpu: 100m memory: 50Mi args: # command = "/skydns" # etcd地址 - -machines=http://10.0.251.148:2379 - -addr=0.0.0.0:53 - -ns-rotate=false #同etcd中配置的/skydns/config中的domain名,最後有‘點’ - -domain=sky. ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP dnsPolicy: Default # Don't use cluster DNS.
編輯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.10.2 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
1.5 啟動
在master執行如下命令:
kubectl create -f skydns_dpm.yaml
kubectl create -f skydns-svc.yaml
之後,dns搭建完成。
[root@k8s-master yaml]# kubectl get deployment --all-namespaces NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kube-system kube-dns 1 1 1 1 2m kube-system kubernetes-dashboard-latest 1 1 1 1 1d [root@k8s-master yaml]# kubectl get pod -o wide --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE kube-system kube-dns-520758324-1luff 2/2 Running 0 2m 10.0.28.2 k8s-node-1 kube-system kubernetes-dashboard-latest-127826951-pxrpk 1/1 Running 0 1d 10.0.62.2 k8s-node-2
1.6 DNS功能驗證
1.6.1 建立測試service
[root@k8s-master yaml]# cat test_svc.yml apiVersion: v1 kind: Service metadata: labels: name: mysql role: service name: mysql-service spec: ports: - port: 3306 targetPort: 3306 type: NodePort selector: name: mysql [root@k8s-master yaml]# kubectl create -f test_svc.yml service "mysql-service" created [root@k8s-master yaml]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 1d mysql-service 10.254.61.203 <nodes> 3306/TCP 6s
1.6.2 建立測試pod
[root@k8s-master yaml]# cat busybox.yml apiVersion: v1 kind: Pod metadata: labels: name: busybox role: master name: busybox spec: containers: - name: busybox image: docker.io/busybox command: - sleep - "360000" [root@k8s-master yaml]# kubectl create -f busybox.yml pod "busybox" created [root@k8s-master yaml]# kubectl get pod -o wide --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE default busybox 1/1 Running 0 18s 10.0.62.3 k8s-node-2 kube-system kube-dns-520758324-1luff 2/2 Running 0 33m 10.0.28.2 k8s-node-1 kube-system kubernetes-dashboard-latest-127826951-pxrpk 1/1 Running 0 1d 10.0.62.2 k8s-node-2
1.6.3 進入pod驗證服務解析
[root@k8s-master yaml]# kubectl exec -i -t busybox sh / # cat /etc/resolv.conf search default.svc.sky svc.sky sky openstacklocal nameserver 10.254.10.2 nameserver 10.0.251.90 nameserver 192.168.5.225 nameserver 192.168.5.226 options ndots:5 / # / # ping mysql-service PING mysql-service (10.254.61.203): 56 data bytes