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,搭建完成

kubernetes1.5.2 DNS的更多相关文章

  1. kubernetes1.3搭建dns服务

    https://xuxinkun.github.io/2016/07/22/kubernetes-dns/

  2. kubernetes1.5.2--部署DNS服务

    本文基于kubernetes 1.5.2版本编写 在kubernetes1.2之前,采用skydns+kube2dns+etcd的方式来部署dns.而从1.3开始,则部署方式有了一点儿变化,将skyd ...

  3. Kubernetes1.7—DNS安装

    虽然通过了Service解决了Pod重建后IP动态变化(服务发现).负载均衡问题,但使用Service还是要需要知道CLUSTER-IP,而通过NDS可以解决该问题:在Kubernetes集群中可通过 ...

  4. CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)

    安装前记: 近来容器对企业来说已经不是什么陌生的概念,Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿 ...

  5. kubernetes1.13之后的kubeadm init config

    1.kubernetes1.13之后kubeadm开始GA,由于1.13的kube-proxy有bug,删除ipvs的地方总是导致kube-proxy挂掉,所以建议直接用1.13.2,这个版本解决了b ...

  6. Kubernetes 1.5 配置dns

    在kubernetes1.2的时候,采用了skydns + kube2dns +etcd的方式来部署dns.而从1.3开始,则部署方式有了一点儿变化,将skydns和kube2dns封装到了一个容器镜 ...

  7. kubernetes---CentOS7安装kubernetes1.11.2图文完整版

    转载请注明出处:kubernetes-CentOS7安装kubernetes1.11.2图文完整版 架构规划 k8s至少需要一个master和一个node才能组成一个可用集群. 本章我们搭建一个mas ...

  8. Kubernetes1.5 集成Heapster

    Kubernetes1.5 集成Heapster Heapster是kubernetes集群监控工具.在1.2的时候,kubernetes的监控需要在node节点上运行cAdvisor作为agent收 ...

  9. 生产环境:ansible自动化部署kubernetes-1.14

    概述: 本文提供ansible-playbooks用来帮助读者用ansible构建二进制kubernetes1.14, 集群包含calico.nginx-ingress.HA 提供资源有kuberne ...

随机推荐

  1. Vue获取dom和数据监听

    Vue获取dom对象 在js和jq中我们都能获取dom对象例如 // 获取id=1的div标签 <div id=d1>dom对象</div> // js语法 let ele = ...

  2. mysql-语法大全

    DDL语句 库 创建 create database 库名 charset utf8; 删除 drop database 库名; 修改 alter database 库名 charset latin; ...

  3. P1578 奶牛浴场

    P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...

  4. PHP 公共方法分享180628

    查看php 类的详情:方法.常量.属性( type(new \Illuminate\Http\Request());) /** * fixme 打印类详情 * @param $class object ...

  5. Velocity 快捷键

    快捷键(2018-03-08) General Keyboard Shortcuts The following shortcuts are available anywhere within the ...

  6. 【Tsinsen A1339】JZPLCM (树状数组)

    Description 原题链接 ​ 给定一长度为\(~n~\)的正整数序列\(~a~\),有\(~q~\)次询问,每次询问一段区间内所有数的\(~LCM~\)(即最小公倍数).由于答案可能很大,输出 ...

  7. 使用jvisualVm监控本地和远程的jvm

    jvisualVm是jdk自带的可视化监控工具,功能很强大,可安装各种扩展插件.本篇不打算讲解如果使用详细的功能,只讲在windows环境怎么监控本地和远端(一般是无界面的linux系统)的java进 ...

  8. jmeter生成测试报告

  9. NOIP2011Mayan游戏(模拟)

    Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指 ...

  10. hdu 3790 最短路问题 (spfa练手)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...