在腾讯云容器服务上添加外部 DNS 服务器

概述

腾讯云容器服务在kubernetes平台的基础上做了大量和腾讯云IAAS紧密结合的工作,比如集群创建时直接创建k8s集群、集群内的容器使用VPC网络的IP,容器数据卷使用CBS、ingress直接使用腾讯云的LB等,通过这些工作大大降低了客户搭建和使用k8s集群的门槛,同时因为和IAAS的紧密结合,某些性能如网络会比自己搭建flannel等开源软件要好很多。

目前,腾讯云容器服务已经有很多客户在使用,客户在使用腾讯云容器服务的过程中,常见的一个问题是客户应用除了依赖k8s的服务发现外,还有部分应用需要使用客户自己的DNS服务器。针对这种情况,本文先介绍k8s-dns的原理,然后再具体说明添加外部DNS服务器的步骤。后续我们将把这个功能做到产品中来,支持客户通过控制台来添加外部DNS服务器。

k8s-dns介绍

为什么k8s需要dns服务

k8s给每个服务都分配了vip,通过vip可以访问和该服务关联的pod,应用无需关心pod的实例个数,vip会自动做负载均衡。如果一个服务要访问另外一个服务,如何知道另外一个服务对应的vip呢?

目前有两种方式:

  1. 通过环境变量,每个pod启动的时候,kubelet会把所有的服务以环境变量的形式注入到对应的容器,在容器中可以通过环境变量获取到对应服务的VIP,这种做法带来的缺点就是容器只能获取到比它早启动的服务VIP。
  2. 通过kuberntes内置的dns服务,服务之间通过服务名称访问,这个dns服务在k8s里面的名字为kube-dns,位于kube-system的命名空间。kubelet启动的时候通过 --cluster-dns参数指定kube-dns的VIP,这样后续创建的pod都会在对应容器的/etc/resolv.conf文件中生成一条nameserver指向kube-dns VIP的记录,从而保证所有k8s创建的容器,DNS服务器都使用kube-dns。

kube-dns服务组成

kube-dns服务对应的pod包含3个容器:

  • kubedns:监控k8s服务资源并更新DNS记录
  • dnsmasq:提供DNS缓存,缓存中的数据通过查询kubedns获取
  • exechealthz:定期检查kubedns和dnsmasq的健康状态,并提供dns服务是否健康的HTTP的api

这三个容器的之间的关系如下:

添加外部DNS服务器的操作原理

添加外部DNS服务器的原理是利用dnsmasq的启动参数,在dnsmasq的启动参数中,有个叫server的参数,通过server参数可以指定上游的dns服务器,在kube-dns的deployment yaml文件中,dnsmasq容器将kubedns容器作为其上游dns服务器,这个关系也是通过server参数指定的,下面的yaml文件中,kubedns容器绑定的端口为10053,dnsmasq容器通过"-server=127.0.0.1#10053"指向kube-dns。同样的方法也可以用于添加外部DNS服务器,只需修改kube-dns服务中dnsmasq的启动参数即可。

containers:
 - args:
   - --domain=cluster.local.
   - --dns-port=10053
   - --config-map=kube-dns
   - --v=0
   image: ccr.ccs.tencentyun.com/library/kubedns-amd64:1.9
   name: kubedns
   ports:
   - containerPort: 10053
     name: dns-local
     protocol: UDP
   - containerPort: 10053
     name: dns-tcp-local
     protocol: TCP
   - containerPort: 10055
     name: metrics
     protocol: TCP
- args:
  - --cache-size=500
  - --no-resolv
  #默认的域名解析服务器使用上面的kubedns容器,因为在一个pod里所以直接用127.0.0.1的ip地址,kubedns容器的端口为10053
  - --server=127.0.0.1#10053
  #域名以google.com结尾的使用192.168.10.2作为域名解析服务器
  - --server=/google.com/192.168.10.2
  - --log-facility=-
  image: ccr.ccs.tencentyun.com/library/kube-dnsmasq-amd64:1.4.1

添加外部hosts的操作原理

dnsmasq的启动参数除了server参数外,还有一个address的参数,通过该参数可以添加IP和hostname的映射关系,类似于docker run的--add-host参数,--add-host的效果是在容器的/etc/hosts插入ip和hostanme的记录,在k8s中没有这样的参数,如果碰到客户要在pod中加入ip和主机名的映射关系,用dnsmsq的address参数可以实现该功能。

在腾讯云容器服务上添加自定义dns服务器操作步骤

1、先登录到一台容器主机,将kube-dns的yaml文件保存下来

注:kubernetes 1.4.6版本kube-dns名称为k8s-dns, kubernetes 1.7.8为kube-dns

kubectl get deployment kube-dns -n kube-system -o yaml > kubedns.yaml

2、修改kubedns.yaml文件,找到kube-dnsmasq-amd64的镜像位置,在其启动参数中做修改,原来的参数如下:

- args:
     - --cache-size=500
     - --no-resolv
     - --server=127.0.0.1#10053
     - --log-facility=-

如果这个时候要添加2个外部的dns服务器,对应的yaml文件修改如下,修改内容就是加了两个--server的启动参数:

- args:
     - --cache-size=500
     - --no-resolv
     - --server=127.0.0.1#10053
     - --server=/internal.thekelleys.org.uk/192.168.1.1
     - --server=/google.com/192.168.2.1
     - --log-facility=-

如果这时需要添加主机名和IP的对应关系,可以通过添加--address参数实现:

- args:
     - --cache-size=500
     - --no-resolv
     - --server=127.0.0.1#10053
     - --address=/www.test1.com/192.168.10.2
     - --server=/www.test2.com/192.168.10.3
     - --log-facility=-

3、使用修改后的yaml文件执行kubectl apply使配置生效

kubectl apply -f kubedns.yaml

4、验证添加的自定义dns服务器是否在容器里生效,验证方法有很多种,可以通过在服务里使用dig或nslookup命令来看;也可以直接通过某个依赖于该自定义dns的应用服务来验证。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kwcode

微信小程序调用接口返回数据或提交数据

由于小程序发起网络请求需要通过 wx.request 文档地址 https://mp.weixin.qq.com/debug/wxadoc/dev/api/ne...

3297
来自专栏Java技术栈

浅谈浏览器的缓存机制

浏览器是有缓存的,做开发的同学都知道浏览器缓存是非常蛋疼的问题,特别是前端开发的同学,明明改了为什么还没有生效,经常要去清理浏览器的缓存,或者禁用浏览器的缓存功...

3318
来自专栏L宝宝聊IT

ESXSI存储与(openfiler)

1223
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch增删改查 之 —— Delete删除

删除文档也算是常用的操作了...如果把Elasticsearch当做一款普通的数据库,那么删除操作自然就很常用了。如果仅仅是全文检索,可能就不会太常用到删除。...

17610
来自专栏小狼的世界

利用Apache ab以及GNUPlot来进行Web测试

最近写了几个测试脚本,希望要观察使用PUT方式上传文件和使用POST方式上传文件,两者效率的差别。

602
来自专栏技术博文

Cookie禁用了,Session还能用吗?详解

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么...

3306
来自专栏前端儿

RequireJS 模块化加载框架使用

同样的,首先是下载好 require.js --> http://requirejs.org/docs/download.html#requirejs

661
来自专栏老秦求学

netcat工具的使用

用途:网络管理工具。 可以读,写TCP或UDP 网络连接。简写为:nc 常见参数: -h  帮助信息 -l 坚挺模式 -n 指定IP地址 -p 指定端口号 -v...

35312
来自专栏Jerry的SAP技术分享

sap.ui.require in SAP UI5 and require in nodejs

例如我需要在controller的onShowHello里通过MessageToast弹一个消息显示在UI上,

3365
来自专栏北京马哥教育

KeepAlived双主模式高可用集群

一、keepalived简介 keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipv...

3779

扫码关注云+社区