资讯专栏INFORMATION COLUMN

配置自定义DNS服务 容器云 UK8S

ernest.wang / 3106人阅读

摘要:在中,的默认配置信息如下的配置信息包含以下的插件错误日志会以标准输出的方式打印到容器日志的健康状况插件是中用来替代的模块,将的域名转为的工作由该插件完成,其中常用的参数作用如下用于设置的记录处理模式,如。

配置自定义DNS服务

本文主要介绍如何在UK8S集群中,使用自定义的DNS服务。

从Kubernetes 1.11起,CoreDNS取代kube-dns成为默认的DNS方案,UK8S目前支持的Kubernetes版本>=1.11,因此本文主要介绍如何修改CoreDNS的配置以达到使用自定义DNS服务的目的。

简介

CoreDNS是一个模块化、插件式的DNS服务器,其配置文件信息保存在Corefile内。UK8S集群管理员可通过修改ConfigMap,来配置自定义DNS服务。

在UK8S中,CoreDNS的默认Corefile配置信息如下:

apiVersion: v1
kind: ConfigMap
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream 
          fallthrough in-addr.arpa ip6.arpai
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          policy sequential
        }
        cache 30
        loop
        reload
        loadbalance
    }
metadata:
  name: coredns
  namespace: kube-system

Corefile的配置信息包含以下CoreDNS的插件:

errors: 错误日志会以标准输出的方式打印到容器日志;

health: CoreDNS的健康状况;

kubernetes: kubernetes插件是CoreDNS中用来替代kube-dns的模块,将service的域名转为IP的工作由该插件完成,其中常用的参数作用如下:

pods POD-MODES: 用于设置Pod的A记录处理模式,如1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4pods disabled为默认值,表示不为pod提供dns记录;pods insecure会一直返回对应的A记录,而不校验ns;pods verified会校验ns是否正确,如果该ns下有对应的pod,则返回A记录。

upstream [ADDRESS..]: 定义用于解析外部hosts的上游dns服务器。如果不指定,则CoreDNS会自行处理,例如使用后面会介绍到的proxy插件。

fallthrough [ZONE..]: 如果指定此选项,则DNS查询将在插件链上传递,该插件链可以包含另一个插件来处理查询,例如in-addr.arpa

prometheus: CoreDNS对外暴露的监控指标,默认为http://localhost:9153/metrics。

forward [from to]: 任何不属于Kubernetes集群内部的域名,其DNS请求都将指向forword指定的 DNS 服务器地址。from一般为".",代表所有域名,to可以为多个,如111.114.114.114 8.8.8.8。需要注意的是,新版本的CoreDNS已forward插件替代proxy插件,不过使用方法是一致的,如果你的集群是proxy,建议改为forward插件,性能更好。

reload: 允许自动加载变化了的Corefile,建议配置,这样CoreDNS可以实现热更新。

其他选项的意义请查看Kubernetes官方文档,下面我们举例说明下如何修改ConfigMap。

示例为特殊域配置DNS服务器

假设我们有一个ucloudk8s的服务域,自建的私有DNS Server地址为10.9.10.8,则集群管理员可以执行kubectl edit configmap/coredns -n kube-system中添加如下所示的一段规则,这是个独立的Server Block,我们可以在Corefile里面为不同的域配置不同的Server Block

ucloudk8s.com:53 {
        errors
        cache 30
        forward . 10.9.10.8
    }

并且,我们不希望使用/etc/resolv.conf里配置的DNS服务器作为上游服务器,而是指向自建的DNS Server,只需要直接修改之前提到的upstream和proxy选项即可

upstream 10.9.10.8
forward .  172.16.0.1

修改完毕后的configmap如下:

apiVersion: v1
kind: ConfigMap
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream 10.9.10.8
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 10.9.10.8
        cache 30
        loop
        reload
        loadbalance
        }
    ucloudk8s.com:53 {
        errors
        cache 30
        forward . 10.9.10.8
       }
metadata:
  name: coredns
  namespace: kube-system
验证

我们在同VPC下的某台云主机中(请勿在UK8S Node节点中操作)安装一个DNS服务器,来验证自定义DNS是否正常工作。

通过Docker安装DNS服务器
docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq:2.75
进入容器
docker exec -it dns-server /bin/sh
配置上游DNS服务器
vi /etc/resolv.dnsmasq
nameserver 114.114.114.114
nameserver 8.8.8.8
配置本地解析规则
vi /etc/dnsmasqhosts
110.110.110.110 baidu.com
修改dnsmasq配置文件,指定使用上述两个我们自定义的配置文件,修改下述两个选项,并重启容器。
vi /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq
addn-hosts=/etc/dnsmasqhosts
docker restart dns-server
修改CoreDNS的configmap,添加如下规则。
baidu.com:53{
  errors
  cache 30
  forward . 10.9.10.8(测试时需修改成你的DNS地址)      
 }
进入K8S在容器内测试,使用dig命名测试,可以看到解析地址为110.110.110.110,符合预期。
bash-4.4# dig baidu.com
; <<>> DiG 9.12.3-P4 <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39140
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;baidu.com.                     IN      A
;; ANSWER SECTION:
baidu.com.              5       IN      A       110.110.110.110
;; Query time: 4 msec
;; SERVER: 172.17.0.2#53(172.17.0.2)
;; WHEN: Mon May 27 09:11:50 UTC 2019
;; MSG SIZE  rcvd: 63
常见问题修改了CoreFile,但解析不成功

首先确认CoreFile是否包含了reload插件,如果没有包含,需要添加reload,并且重建CoreDNS,使其可以加载到最新的DNS规则。

其次,通过kubectl logs COREDNS-POD-NAME -n kube-system查看CoreDNS日志,确认CoreDNS是否正常工作,以及DNS配置是否加载成功。

如果依然不能正常工作,在容器或Pod内执行dig @YOUR-DNS-SERVER-ADDRESS YOUR-DOMAIN,确认您的DNS服务器是否正常工作。

如以上操作皆无效,请联系UCloud技术支持协助处理。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/126934.html

相关文章

  • 拉勾网基于 UK8S平台的容器化改造实践

    摘要:宋体本文从拉勾网的业务架构日志采集监控服务暴露调用等方面介绍了其基于的容器化改造实践。宋体此外,拉勾网还有一套自研的环境的业务发布系统,不过这套发布系统未适配容器环境。写在前面 拉勾网于 2019 年 3 月份开始尝试将生产环境的业务从 UHost 迁移到 UK8S,截至 2019 年 9 月份,QA 环境的大部分业务模块已经完成容器化改造,生产环境中,后台管理服务已全部迁移到 UK8...

    CoorChice 评论0 收藏0
  • 容器 UK8S服务发现:Kubernetes重要概念Service(即服务,本文中两者等同)以

    摘要:介绍本章节主要为您简要介绍中的一个重要概念即服务,本文中两者等同,以及的相关知识。在每台的固定端口上暴露服务,选择的服务类型,集群会自动创建一个类型的服务,负责处理接收到的外部流量。集群外部的可以通过的方式访问该服务。Service 介绍本章节主要为您简要介绍 Kubernetes 中的一个重要概念 Service(即服务,本文中两者等同),以及ULB的相关知识。Service 介绍Serv...

    Tecode 评论0 收藏0
  • Service 介绍 容器 UK8S

    摘要:介绍介绍介绍是集群中的一个资源对象,用于定义如何访问一组带有相同特征的。下面我们分别介绍下如何通过在内网外网访问。 Service 介绍本篇目录1. Service 介绍2. ULB 简要介绍本章节主要为您简要介绍 Kubernetes 中的一个重要概念 Service(即服务,本文中两者等同),以及ULB的相关知识。1. Service 介绍Service 是 Kubernetes 集群中...

    ernest.wang 评论0 收藏2037
  • UK8S 集群常见问题 容器 UK8S

    摘要:为什么在节点直接起容器网络不通为什么在节点直接起容器网络不通为什么在节点直接起容器网络不通使用自己的插件,而直接用起的容器并不能使用该插件,因此网络不通。 UK8S 集群常见问题本篇目录1. UK8S 完全兼容原生 Kubernetes API吗?2. UK8S 人工支持3. UK8S对Node上发布的容器有限制吗?如何修改?4. 为什么我的容器一起来就退出了?5. Docker 如何调整日...

    ernest.wang 评论0 收藏1762
  • 容器 UK8S】集群常见问题:UK8S创建Pod失败,使用kubectl describe po

    摘要:集群常见问题单个集群最多能添加多少个节点当前单个集群对应节点数量可查看集群节点配置推荐。创建失败,使用发现报错为,是啥原因在创建等资源时,都需要扮演云账户的身份调用来完成相关操作。集群内可以解析,但无法联通外网拉取数据失败。集群常见问题单个集群最多能添加多少个节点?A:当前单个UK8S集群对应节点数量可查看集群节点配置推荐。UK8S完全兼容原生Kubernetes API吗?A:完全兼容。U...

    Tecode 评论0 收藏0
  • 容器 UK8S】日志监控方案:什么是Prometheus?怎么部署Prometheus?

    摘要:客户端库,为需要监控的服务生成相应的并暴露给。根据配置文件,对接收到的警报进行处理,发出告警。再创建一个来告诉需要监控带有为的背后的一组的。什么是Prometheus关于PrometheusPrometheus 是一套开源的系统监控报警框架。它的设计灵感源于 Google 的 borgmon 监控系统,由SoundCloud 在 2012 年创建,后作为社区开源项目进行开发,并于 2015 ...

    Tecode 评论0 收藏0

发表评论

0条评论

ernest.wang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<