k8s学习笔记之CoreDNS

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
可观测监控 Prometheus 版,每月50GB免费额度
简介: 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 .
    
    }
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.06 Docker安装
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
67 1
|
6月前
|
Kubernetes 调度 Docker
Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS
Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS
Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习笔记之ConfigMap和Secret
k8s学习笔记之ConfigMap和Secret
|
3月前
|
Kubernetes jenkins 持续交付
jenkins学习笔记之二十一:k8s部署jenkins及动态slave
jenkins学习笔记之二十一:k8s部署jenkins及动态slave
|
3月前
|
存储 运维 Kubernetes
k8s学习笔记之StorageClass+NFS
k8s学习笔记之StorageClass+NFS
|
6月前
|
Kubernetes 调度 Docker
Ubantu docker学习笔记(十一)k8s基本操作
Ubantu docker学习笔记(十一)k8s基本操作
|
6月前
|
Kubernetes 网络协议 Docker
K8S核心插件-coredns服务
K8S核心插件-coredns服务
67 0
|
6月前
|
Kubernetes Linux Docker
Kubernetes学习笔记-Part.09 K8s集群构建
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
812 2
Kubernetes学习笔记-Part.09 K8s集群构建
|
6月前
|
存储 Kubernetes 负载均衡
k8s学习-思维导图与学习笔记
k8s学习-思维导图与学习笔记
259 1
|
6月前
|
Kubernetes Docker 容器
Kubernetes学习笔记-Part.08 安装k8s环境
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
104 2