k8s-部署kube dns及coredns

Posted An.amazing.rookie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s-部署kube dns及coredns相关的知识,希望对你有一定的参考价值。

部署kube-dns

https://console.cloud.google.com/gcr/images/google-containers/GLOBAL #kube-dns镜像下载地址

kube-dns简介

kube-dns 的 pod 中包含了 3 个容器,分别是:
1、kube-dns:提供service name域名的解析(用于k8s集群内部的域名解析)
2、dns-dnsmasq:提供DNS缓存(当一个容器访问dns-dnsmasq获取域名解析,dns-dnsmasq没有解析,会到kube-dns去查询,kube-dns查询后,把解析发送给dns-dnsmasq,dns-dnsmasq再发送给容器,并且本身会缓存一份,当下次再有相同的请求,会直接由dns-dnsmasq处理),降低kubedns负载,提高性能 
3、dns-sidecar:定期检查kubedns和dnsmasq的健康状态

注意:
kube-dns 容器里是没有 service name 对应的 IP 地址的,这些数据全部都是存放到 etcd 中,所以当进行解析时,
dns-dnsmasq 没有解析,会向 kube-dns 获取解析,kube-dns 本身并没有解析,kube-dns 会通过 api server 查询 etcd 中的解析,从而把解析返还给 dns-dnsmasq,dns-dnsmasq 本身缓存一份,并且把解析发送给容器

部署

1、cd /usr/local/src/

2、tar xf kubernetes-client-linux-amd64.tar.gz
   tar xf kubernetes-node-linux-amd64.tar.gz
   tar xf kubernetes-server-linux-amd64.tar.gz
   tar xf kubernetes.tar.gz
   
3、cd kubernetes/cluster/addons/dns/kube-dns/

4、cp kube-dns.yaml.base kube-dns.yaml

5、vim kube-dns.yaml      #需要修改以下内容
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 172.31.0.2  #指定kube-dns的service的IP地址;可以通过启动一个pod,进入pod查看
                          /etc/resolv.conf 此文件,这里设置的地址需要与pod中指定的dns地址一致
                          
      containers:
      - name: kubedns
        image: harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13  #本地harbor地址
        resources:
          limits:
            memory: 512Mi   #指定kube-dns容器最大可以使用宿主机的内存

        args:
        - --domain=linux.local.  #指定域名后缀;部署k8s集群时指定的service域名后缀
        - --dns-port=10053
        - --config-dir=/kube-dns-config
        - --v=2 
   
      - name: dnsmasq
        image: harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13  
      
        args:
        - --server=/linux.local/127.0.0.1#10053   #指定域名后缀;针对linux.local域名的解析,交给
                                                   本机的10053端口去解析
        - --server=/linux.test/172.31.5.20#53     #针对 linux.test 域名的解析,交给指定DNS服务                                                    器解析,一般此服务器是针对公司内部的域名解析

      - name: sidecar
        image: harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13 
        
        args:
        - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.linux.local,5,SRV
        - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.linux.local,5,SRV

6、cp kube-dns.yaml /root

7、cd /etc/ansible/manifests/

8、mkdir dns/{kube-dns,Coredns} -p

9、cd dns/kube-dns

10、docker load -i k8s-dns-dnsmasq-nanny-amd64_1.14.13.tar.gz     #导入kube-dns所需要的镜

11、docker tag gcr.io/google-containers/k8s-dns-dnsmasq-nanny-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13

12、docker push harbor.linux.com/kube-dns/k8s-dns-dnsmasq-nanny-amd64:1.14.13
#上传到本地harbor

13、docker load -i k8s-dns-kube-dns-amd64_1.14.13.tar.gz
    docker tag gcr.io/google-containers/k8s-dns-kube-dns-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13
    docker push harbor.linux.com/kube-dns/k8s-dns-kube-dns-amd64:1.14.13
    docker load -i k8s-dns-sidecar-amd64_1.14.13.tar.gz
    docker tag gcr.io/google-containers/k8s-dns-sidecar-amd64:1.14.13 harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
    docker push harbor.linux.com/kube-dns/k8s-dns-sidecar-amd64:1.14.13
    
14、kubectl apply -f /root/kube-dns.yaml   #启动kube-dns的pod

15、进入一个容器,ping 外网,如果能 ping 通,则 kube-dns 部署成功

16、不在同一个namespace内的service是不能直接访问的,需要在容器中使用此方法:
ping kubernetes-dashboard.kubernetes-dashboard.svc.linux.local
#第一个 kubernetes-dashboard 是 service name,第二个 kubernetes-dashboard 是 namespace name,svc 是固定的,linux.local 为部署 k8s 集群时指定的 service 的域名后缀;在同一个 namespace 里的 pod 访问 service,也尽量使用全称域名访问,不要只写 service name 这个简称

17、kubectl exec busybox nslookup kubernetes.default.svc.linux.local
#也可以使用busybox容器,进行域名解析测试(不进入容器中)

部署coredns:

https://github.com/coredns/coredns #下载地址

https://github.com/coredns/deployment/tree/master/kubernetes #1.6版本部署方式

1、 cd /etc/ansible/manifests/dns

2、git clone https://github.com/coredns/deployment.git   #将github上部署coredns的项目克隆下来

3、cd deployment/kubernetes/

4、./deploy.sh > coredns.yml     
#将 coredns 的模板内容输出到 yml 文件中,此项目在执行脚本之前必须提前已经安装完 kube-dns,这个脚本会读取 kube-dns 的一些信息

5、vim coredns.yml
data:
  Corefile: |
    .:53 {
        errors
        health {
          lameduck 5s
        }
        ready
        kubernetes linux.local in-addr.arpa ip6.arpa {   #此处需要修改为自己配置的域名后缀
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 223.6.6.6   #coredns能解析的话解析,不能解析的话转发到指定地址进行解析,此处一般为公								 司内部的DNS服务器
        
      containers:
      - name: coredns
        image: harbor.linux.com/coredns/coredns:1.6.9  #镜像地址换成本地的harbor
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: 512Mi      #运行coredns使用宿主机的内存大小

6、cp coredns.yml /root

7、kubectl delete -f /root/kube-dns.yaml

8、kubectl apply -f /root/coredns.yml   #构建coredns

9、进入一个容器中 ping 外网进行测试

以上是关于k8s-部署kube dns及coredns的主要内容,如果未能解决你的问题,请参考以下文章

K8S集群部署Coredns服务

[k8s]coredns/kube-dns配置subdomain

Kubernetes addons 之 coredns部署

基于kubernetes实现coredns的及验证

k8s与dns--coredns的一些实战经验

k8s-DNS