kubernetes入門之skydns


部署kubernetes dns服務

kubernetes可以為pod提供dns內部域名解析服務。其主要作用是為pod提供可以直接通過service的名字解析為對應service的ip的功能。

部署kubernetes dns服務主要需要兩部分。

kubelet

在kubelet中增加啟動項,修改

$ vi /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.0.10 --cluster_domain=kube.local"

創建dns rc和service

以下為兩個dns rc和service的配置文件

[root@localhost calico]# cat /etc/kubernetes/skydns-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns-v6
  namespace: default
  labels:
    k8s-app: kube-dns
    version: v6
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kube-dns
    version: v6
  template:
    metadata:
      labels:
        k8s-app: kube-dns
        version: v6
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: etcd
        image: gcr.io/google_containers/etcd:2.0.9
        command:
        - /usr/local/bin/etcd
        - -listen-client-urls
        - http://0.0.0.0:2379,http://0.0.0.0:4001
        - -advertise-client-urls
        - http://127.0.0.1:2379,http://127.0.0.1:4001
        - -initial-cluster-token
        - skydns-etcd
      - name: kube2sky
        image: gcr.io/google_containers/kube2sky:1.11
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
        command:
        - /kube2sky
        - --kube_master_url=http://10.8.65.48:8080
        - -domain=kube.local
      - name: skydns
        image: gcr.io/google_containers/skydns:2015-03-11-001
        resources:
        command:
        - /skydns
        - -machines=http://localhost:4001
        - -addr=0.0.0.0:53
        - -domain=kube.local.
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      dnsPolicy: Default
      
[root@localhost calico]# cat /etc/kubernetes/skydns-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: default
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.254.0.10
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

然后使用kubectl進行創建

kubectl create -f /etc/kubernetes/skydns-rc.yaml 
kubectl create -f /etc/kubernetes/skydns-svc.yaml 

最后使用kubectl get rckubectl get service進行檢查,驗證其是否創建成功。

dns實驗

在部署完成后,進行驗證實驗。首先創建一個名為mysql-service的service。

[root@localhost k8s]# cat srv.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

通過kubectl create -f srv.yml創建,然后進行查看

[root@localhost k8s]# kubectl get service
NAME            CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
kube-dns        10.254.0.10     <none>        53/UDP,53/TCP   3d
kubernetes      10.254.0.1      <none>        443/TCP         3d
mysql-service   10.254.162.44   nodes         3306/TCP        3d

可以看到mysql-service服務創建成功。

現在我再創建一個pod,查看其是否能正確解析域名。這里使用最簡單的busybox鏡像。

[root@localhost k8s]# cat busybox.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: busybox
    role: master
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox  
      command:
      - sleep
      - "360000"

使用kubectl create -f busybox.yml創建。

使用exec進入到容器中進行域名解析

[root@localhost k8s]# kubectl exec -i -t busybox sh
/ # nslookup mysql-service
Server:    10.254.0.10
Address 1: 10.254.0.10 localhost

Name:      mysql-service
Address 1: 10.254.162.44
/ # nslookup mysql-service.default.kube.local
Server:    10.254.0.10
Address 1: 10.254.0.10

Name:      mysql-service.default.kube.local
Address 1: 10.254.162.44
/ # nslookup mysql-service.default.svc.kube.local
Server:    10.254.0.10
Address 1: 10.254.0.10

Name:      mysql-service.default.svc.kube.local
Address 1: 10.254.162.44

可以看到mysql-servicemysql-service.default.svc.kube.localmysql-service.default.kube.local的域名均能正確解析為mysql-service的service中的ip10.254.162.44

其中mysql-service.default.kube.local為完整域名,其組成為<service-name>.<namespace>.<domain-name>

kubernetes dns原理

現在反過來看kubernetes dns的原理。

首先在部署時候創建了一個dns的rc,最終會產生三個容器(不含pause)

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                                            COMMAND                  CREATED              STATUS              PORTS               NAMES
033800f393b9        index.alauda.cn/tutum/centos:centos6             "/run.sh"                3 days ago           Up 3 days           22/tcp              awesome_newton
0fb60dcfb8b4        gcr.io/google_containers/etcd:2.0.9              "/usr/local/bin/etcd "   3 days ago           Up 3 days                               k8s_etcd.8d001f7f_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_6afe5c27
0a0efd5f0aaa        gcr.io/google_containers/skydns:2015-03-11-001   "/skydns -machines=ht"   3 days ago           Up 3 days                               k8s_skydns.5d0f4a29_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_f7c4ee06
cfef318e4032        gcr.io/google_containers/kube2sky:1.11           "/kube2sky --kube_mas"   3 days ago           Up 3 days                               k8s_kube2sky.eb7ac18c_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_19b79770
afad7b2ebd3d        docker.io/kubernetes/pause                       "/pause"                 3 days ago           Up 3 days                               k8s_POD.87e723e6_kube-dns-v6-ju8cb_default_149fdba5-4e50-11e6-ba47-0800273d5f3f_3c3f7c87

dns解析過程

在創建的pod中,可以查看其所使用的域名解析服務器:

[root@localhost k8s]# kubectl exec -i -t busybox sh
/ # cat /etc/resolv.conf 
search default.svc.kube.local svc.kube.local kube.local 
nameserver 10.254.0.10
options ndots:5

在kubelet創建pod時,會使用為kubelet配置的-cluster_dns=10.254.0.10 --cluster_domain=kube.local,在創建的pod中從而使用對應的dns服務器。

而這一dns解析服務,實際是由dns的rc中的gcr.io/google_containers/skydns:2015-03-11-001容器0a0efd5f0aaa完成的。

skydns的數據源來自於gcr.io/google_containers/etcd:2.0.9的容器0fb60dcfb8b4

[root@localhost ~]# docker exec -it 0fb etcdctl get /skydns/local/kube/svc/default/mysql-service/2f1020d6
{"host":"10.254.162.44","priority":10,"weight":10,"ttl":30,"targetstrip":0}
[root@localhost ~]# docker exec -it 0fb etcdctl get /skydns/local/kube/default/mysql-service
{"host":"10.254.162.44","priority":10,"weight":10,"ttl":30,"targetstrip":0}

service同步過程

etcd的數據源自於gcr.io/google_containers/kube2sky:1.11創建的cfef318e4032容器。

cfef318e4032容器通過watch kube-api的service,查看service的變化。

當service創建/刪除/修改時,cfef318e4032容器獲取對應的service信息,將其保存在etcd的容器0fb60dcfb8b4中,進而提供給skydns使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM