k8s学习笔记之CoreDNS

一、CoreDNS configMap配置参数及说明

主要讲解CoreDNS configMap及其他关键配置

部署文件(需要替换其中一些变量):https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base

1.configMap配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
  labels:
      addonmanager.kubernetes.io/mode: EnsureExists
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        ready
        kubernetes __DNS__DOMAIN__ in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
            max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

2.配置参数说明

参数

描述

errors

错误信息到标准输出。

health

CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。可以通过http://localhost:8080/health获取健康状态。

ready

CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://localhost:8181/ready获取可读状态。当所有插件都运行后,ready状态为200。

kubernetes

CoreDNS Kubernetes插件,提供集群内服务解析能力,基于kubernetes service name 进行DNS查询并返回记录给客户端

prometheus

CoreDNS自身metrics数据接口。可以通过http://localhost:9153/metrics获取prometheus格式的监控数据。

forward(或proxy)

将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在Kubernetes域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的/etc/resolv.conf配置。

cache

DNS缓存,单位秒。

loop

环路检测,如果检测到环路(cordns转发到其他DNS,其他DNS再转发到coredns),则停止CoreDNS。

reload

允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,默认等待两分钟后更改生效。

loadbalance

轮询DNS解析记录,如果一个域名存在多个解析记录,可以抽取记录值随机响应,对A、AAAA、MX记录生效。

3.其他重要参数

service中:__DNS__SERVER__ :自定义 coredns svc的地址即DNS服务器地址

configMap中kubernetes cluster.local  自定义DNS解析与,如果修改则集群DNS完全解析域名如下:${SVC_NAME}.${NAMESPACE_NAME}.svc.${DNS_DOMAIN}

二、CoreDNS的扩展配置

以下为常见场景下CoreDNS配置

1.设置打印CoreDNS的解析日志,启用log插件,配置如下

  Corefile: |
    .:53 {
        errors
        log  #在errors插件下添加log,2分钟后生效
        health {
           lameduck 15s
        }

2.为指定域名配置转发

如example.com类型后缀的域名需要经过自建DNS服务器(IP为10.10.0.10)进行解析的话,可为域名配置一个单独的服务块。示例配置如下:

  Corefile: |
    .:53 {
        errors
        health {
           lameduck 15s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          prefer_udp
        }
        cache 30
        loop
        reload
        loadbalance
    }
   # 此处为新增内容(forward和proxy都可以)
    example.com:53 {
        errors
        cache 30
        forward . 10.10.0.10 {
        prefer_udp
        }
    }

3.对集群外域名配置其他域名服务器

即将所有k8s集群外的域名解析转发到指定的服务器,如当前业务在阿里云,可以将k8s集群外的所有域名转发到阿里云公共DNS服务器,不使用宿主机上的/etc/resolv.conf配置,具体配置如下

  Corefile: |
    .:53 {
        errors
        health {
           lameduck 15s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . 10.10.0.10 10.10.0.20 {  #10.10.0.10 10.10.0.20为自定义DNS服务器
          prefer_udp
        }
        cache 30
        loop
        reload
        loadbalance
    }

4.自定义域名hosts

碰到过的实际场景:三方的域名突然失效,通过在CoreDNS中指定三方域名的IP实现业务正常运行,具体示例如下

  Corefile: |
    .:53 {
        errors
        health {
           lameduck 15s
        }
        ready
         #使用Hosts插件来配置,以下为新增
        hosts {
          127.0.0.1 www.example.com #为特定域名指定hosts,如为www.example.com指定IP为127.0.0.1
          fallthrough #保留该指令,否则会导致其他域名解析失败
        }

5.内网场景下,k8s集群外访问k8s集群内部域名

1.将svc暴露到集群外
2.使用阿里云PrivateZone添加A记录到保留的地址,如SLB

6.公网、内网下统一访问域名

1.将集群内服务foo.default.svc.cluster.local暴露到公网上,如SLB,并配置公网域名foo.example.com解析到该服务
2.集群内服务foo.default.svc.cluster.local暴露到内网上,如SLB,并配置Private Zone域名foo.example.com解析到该服务
3.在集群内部,通过Rewrite插件将foo.example.com CNAME到foo.default.svc.cluster.local。示例配置如下:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 15s
        }
        ready
        
        rewrite stop {
          name exact foo.example.com foo.default.svc.cluster.local
          answer name foo.default.svc.cluster.local foo.example.com 
        }

7.禁止对IPv6类型的AAAA记录查询返回

当业务容器不需要AAAA记录类型时,可以在CoreDNS中将AAAA记录类型拦截,返回空(NODATA),以减少不必要的网络通信。示例配置如下:

  Corefile: |
    .:53 {
        errors
        health {
           lameduck 15s
        }
        #新增以下一行Template插件,其它数据请保持不变。
        template IN AAAA .
    
    }

 

posted @ 2024-08-07 15:08  百衲本  阅读(73)  评论(0编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码