本文分享自华为云社区《容器中域名解析流程以及不同dnsPolicy对域名解析影响》,作者:可以交个朋友 。

一、coreDNS背景

部署在kubernetes集群中的容器业务通过coreDNS服务解析域名,Coredns基于caddy框架,将整个CoreDNS服务都建立在一个使用Go编写的HTTP/2 Web 服务器Caddy上。通过插件化(链)架构,以预配置的方式(configmap卷挂载内容配置)选择需要的插件编译,按序执行插件链上的逻辑,通过四种方式(TCP、UDP、gRPC和HTTPS)对外直接提供DNS服务。

二、kubelet通过修改容器/etc/resolv.conf文件使得容器中可解析域名

在kubernetes集群中,coreDNS服务和kube-apiserver通信获取clusterip和serviceName的映射关系,并且coreDNS本身通过clusterip(默认 xx.xx.3.10,比如集群clusterip网段为10.247.x.x,则coreDNS对外暴露服务的clusterip为10.247.3.10),我们知道操作系统域名服务器关键配置文件/etc/resolv.conf中的nameserver字段指定,所以只需要使得容器/etc/resolv.conf中 nameserver字段配置为coreDNS的clusterip地址即可。

那么谁来完成容器/etc/resolv.conf的修改和如何修改?kubelet负责拉起容器,启动参数中--cluster-dns字段对应值就是该集群coreDNS的clusterip地址,kubelet在拉起容器中,根据Pod的dnsPolicy选项,把该值修改注入到容器中。

三、Pod不同dnsPolicy对容器/etc/resolv.conf的影响

  • Default:如果dnsPolicy被设置为“Default”,则名称解析nameserver配置将从pod运行的节点/etc/resolv.conf继承。
# 节点/etc/resolv.conf配置
nameserver X.X.X.X
nameserver X.X.X.Y
options ndots:5 timeout:2 single-request-reopen
  • ClusterFirst:如果dnsPolicy被设置为“ClusterFirst”,则使用集群coredns的service 地址作为Pod内/etc/resolv.conf中nameserver配置。

nameserver 10.247.3.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5 timeout:2 single-request-reopen
  • ClusterFirstWithHostNet:对于使用hostNetwork网络模式运行的Pod,需明确设置其DNS策略“ClusterFirstWithHostNet”,否则 hostNetwork + ClusterFirst实际效果 = Default

nameserver 10.247.3.10
search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 timeout:2 single-request-reopen
  • None:它允许用户自定义Pod内/etc/resolv.conf配置,忽略Kubernetes环境中默认的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置 。

/etc/resolv.conf相关配置说明

nameserver:表示指定的DNS服务地址IP,用于解析域名的服务器。

search:表示域名解析时指定的域名搜索域。解析域名的时候,会依搜索域顺序构建域名解析地址。进行域名解析,直到解析即可。如:svcname.default.svc.cluster.local --> svcname.svc.cluster.local --> svcname.cluster.local

options:其他选项。最常见的选项配置有:
- ndots值:判断域名解析地址中包含的“.”是否大于或等于ndots设定值,如果是,则以请求解析域名地址作为全限定域名发起解析请求,不再进行search域构建域名地址;如果小于ndots,则按照search域构建域名地址,再逐序发起解析请求。
- timeout:等待DNS服务器返回的超时时间。单位秒(s)。

点击关注,第一时间了解华为云新鲜技术~

容器中域名解析流程以及不同dnsPolicy对域名解析影响的更多相关文章

  1. Spring重点—— IOC 容器中 Bean 的生命周期

    一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...

  2. Spring容器的初始化流程

    一.创建BeanFactory流程 1.流程入口 创建BeanFactory的流程是从refresh方法的第二步开始的,通过调用obtainFreshBeanFactory方法完成流程. Config ...

  3. 一个docker容器中运行多个服务还是弄一堆docker容器运行?

    不建议直接在单个 Docker 容器中运行多个程序. 以 2017年 10 月18 日 Docker 官方支持 Kubernetes 为分水岭计算,Kubernetes 赢得容器编排之战的最终胜利已经 ...

  4. 无需安装 vsftpd , 直接使用 FTP 来管理 docker 容器中的文件

    无图无真相,先放个效果图:     背景 使用 docker 来跑一些服务很方便,但是有的时候想管理容器里面的文件却很麻烦 -- 一般常规做法有3种: 通过数据卷或数据卷容器的方式 启动容器的时候时候 ...

  5. 【Spring】容器刷新(refresh)流程解析

    一.概述 二.prepareRefresh() 三.obtainFreshBeanFactory() 四.prepareBeanFactory(beanFactory); 五.postProcessB ...

  6. Linux下将.Asp Core 部署到 Docker容器中

    我们来部署一个简单的例子: 将一个简单的.Aps Core项目部署到Docker容器中并被外网访问 说明: 下面的步骤都是建立在宿主服务器系统已经安装配置过Docker容器,安装Docker相对比较简 ...

  7. 在docker容器中编译hadoop 3.1.0

    在docker容器中编译hadoop 3.1.0 优点:docker安装好之后可以一键部署编译环境,不用担心各种库不兼容等问题,编译失败率低. Hadoop 3.1.0 的源代码目录下有一个 `sta ...

  8. Gogs的Docker容器化部署流程遇到的问题

    Gogs的Docker容器化部署流程遇到的问题   最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...

  9. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...

  10. Spring核心原理之 IoC容器中那些鲜为人知的细节(3)

    本文节选自<Spring 5核心原理> Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.使用FactoryBean产生或者修饰Bean对象的生成. ...

随机推荐

  1. Unity - UIWidgets 3. 页面跳转

    Flutter的Route概念, 移动开发常指Page, 在android中指activity, ios中指viewcontroller, UGUI中常称为Panel\Form\View? 大概说的就 ...

  2. mysql 实用语句

    -- 查询内存大小 SELECT TABLE_NAME, concat( TRUNCATE (data_length / 1024 / 1024, 2), ' MB' ) AS data_size, ...

  3. java 创建对象的5种方式

    1.创建对象的5种方式 1.通过 new 关键字 这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象.比如 Object obj = new Object(); 2.通过 ...

  4. C++ 入门防爆零教程(上册)

    ## C++ 入门防爆零教程(上册) ######  C++ Introductory Explosion Proof Zero Tutorial(Volume $1$) 编写者:美公鸡(洛谷账号:b ...

  5. jenkins原理篇——成员权限管理

    大家好,我是蓝胖子,前面几节我讲述了jenkins的语法以及我是如何使用jenkins对测试和正式环境进行发布的.但正式环境使用jenkins还有一点很重要,那就是权限管理.正式环境的权限往往不能对所 ...

  6. excel对比两个文档,判断范围内的取值是否在另一个列表内存在(vlookup函数的使用)

    背景: sheet1表为原始数据: sheet2表为新的数据副本, 目标是查询sheet2列表中是否存在sheet1表的数据,并且标记出来,且获取sheet2列表的一些数据至sheet1列表中,补充D ...

  7. 推荐一个Node.js多版本管理的可视化工具

    关于Node.js的开发者来说,在开发机器上管理多个不同版本的Node.js是一个常见痛点.之前在开发者安全大全专栏中,提到过解决方法:使用nvm,如果对于nvm还不了解的话,可以前往了解. 对于TJ ...

  8. 支持向量机SVM:从数学原理到实际应用

    本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念.数学背景到Python和PyTorch的代码实现.文章还涵盖了SVM在文本分类.图像识别.生物信息学.金融预测等多个实际应用场景中的 ...

  9. go基础-泛型

    概述 在强类型变成语言中,类型是确定不可变,如函数入参是确定类型.链表元素是确定类型,这极大限制了函数功能.也有些解决方案,为每种类型都实现一版函数,会导致大量重复代码:使用类型转换,使用特殊形参(如 ...

  10. C/C++ 运用Npcap发送UDP数据包

    Npcap 是一个功能强大的开源网络抓包库,它是 WinPcap 的一个分支,并提供了一些增强和改进.特别适用于在 Windows 环境下进行网络流量捕获和分析.除了支持通常的网络抓包功能外,Npca ...