<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>dns | 伪架构师</title>
    <link>/tags/dns/</link>
      <atom:link href="/tags/dns/index.xml" rel="self" type="application/rss+xml" />
    <description>dns</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sat, 03 Jun 2017 08:39:03 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>dns</title>
      <link>/tags/dns/</link>
    </image>
    
    <item>
      <title>实测：Kubernetes 1.6 中的混合 DNS</title>
      <link>/post/kubernetes-dns-ex/</link>
      <pubDate>Sat, 03 Jun 2017 08:39:03 +0800</pubDate>
      <guid>/post/kubernetes-dns-ex/</guid>
      <description>

&lt;p&gt;在之前的文章中提到过，Kubernetes 1.6 新增的混合 DNS 功能。这一功能不大，但是在企业私有云环境下有着非常重要的衔接作用，能够有效的将 Kubernetes 内的应用和集群外甚至互联网上的的 Consual 或者类似系统管理的服务连接起来，形成更好的协同效果。&lt;/p&gt;

&lt;p&gt;上篇文章主要侧重点是概念和一些 YAML 例子，本文则会从操作出发，用一个例子从头到尾的逐步操作这一功能的具体操作。&lt;/p&gt;

&lt;h2 id=&#34;dns-server&#34;&gt;DNS Server&lt;/h2&gt;

&lt;p&gt;我们使用一个 Ubuntu Server 运行 dnsmasq 来担任 Kubernetes 集群外的 DNS 服务器角色，只为了满足测试需要的话，就不需要太复杂的配置了。&lt;/p&gt;

&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;

&lt;p&gt;具体安装步骤如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;#!/bin/sh
# 安装 dnsmasq
apt install dnsmasq
# 停止自动启动的 dnsmasq 服务
systemctl stop dnsmasq
# 生成一个 Host 文件并写入一条记录
echo &amp;quot; 114.114.114.114 server.out-of.kubernetes&amp;quot; &amp;gt; /tmp/hosts
# 显示 IP
ifconfig
# 启动 DNS 服务
# -d 用 debug 模式启动，在前台运行
# -q 输出查询记录
# -h 不使用 /etc/hosts
# -R 不使用 /etc/resolve.conf
# -H 使用刚才生成的文件作为 dns 记录
dnsmasq -q -d -h -q -R -H /tmp/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样，我们就启动了一个 DNS 服务器，并且可以直观的看到其工作状况如下：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dnsmasq: started, version 2.76 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC lo
op-detect inotify
dnsmasq: warning: no upstream servers configured
dnsmasq: bad address at /tmp/hosts line 1
dnsmasq: read /tmp/hosts - 0 addresses
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;kubernetes-配置&#34;&gt;Kubernetes 配置&lt;/h2&gt;

&lt;p&gt;前文说过，我们需要用一个 Configmap 对象来让 Kubernetes 应用新的 DNS 解析配置，这里我们简单的新建一个存根域，就是上文提到的 &lt;code&gt;out-of.kubernetes&lt;/code&gt; 域名，让其使用我们前面安装的 DNS 服务器进行解析，其他域名则使用 &lt;code&gt;8.8.8.8&lt;/code&gt; 和 &lt;code&gt;8.8.4.4&lt;/code&gt; 这一公共 DNS 解析。配置情况如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {&amp;quot;out-of.kubernetes&amp;quot;: [&amp;quot;10.140.0.5&amp;quot;]}
  upstreamNameservers: |
    [&amp;quot;8.8.8.8&amp;quot;, &amp;quot;8.8.4.4&amp;quot;] 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;利用 &lt;code&gt;kubectl apply -f&lt;/code&gt; 命令使之生效。&lt;/p&gt;

&lt;p&gt;注意：系统可能缺省带有这一 configmap，因此需要用 apply 进行操作，建议使用 &lt;code&gt;kubectl get configmap kube-dns -o yaml --namespace kube-system&lt;/code&gt; 进行复查。&lt;/p&gt;

&lt;h2 id=&#34;测试-pod&#34;&gt;测试 Pod&lt;/h2&gt;

&lt;p&gt;这里使用一个 Alpine Linux 的镜像作为测试工具：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Pod
metadata:
  name: tester
spec:
  containers:
  - name: alpine
    image: alpine
    imagePullPolicy: IfNotPresent
    command: [&amp;quot;sleep&amp;quot;]
    args: [&amp;quot;3600&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;测试&#34;&gt;测试&lt;/h2&gt;

&lt;p&gt;测试 Pod 运行之后，可以使用&lt;code&gt;kubectl exec -it tester sh&lt;/code&gt;命令进入 Pod开始测试。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 Pod 的 Shell 中我们可以尝试执行 &lt;code&gt;ping server.out-of.kubernetes&lt;/code&gt;，会看到返回了我们写入在 Hosts 中的地址，在 DNS 服务器端，也会看到相关的查询记录。&lt;/li&gt;
&lt;li&gt;如果 ping 其他的主机名，则会返回正常的结果。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>在 Kubernetes（1.6）中配置私有 DNS 区域以及上级域名服务</title>
      <link>/post/upstream-dns-in-kubernetes/</link>
      <pubDate>Sat, 03 Jun 2017 01:43:33 +0800</pubDate>
      <guid>/post/upstream-dns-in-kubernetes/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://kubernetes.io/blog/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes&#34; target=&#34;_blank&#34;&gt;Configuring Private DNS Zones and Upstream Nameservers in Kubernetes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;很多用户都有自己的域名区域，并且希望能够集成到 Kubernetes DNS 的命名空间去。例如混合云用户可能希望能在集群内解析他们内部的 “.corp” 。其他用户用户可能有一个受&lt;strong&gt;非 Kubernetes&lt;/strong&gt;管理的服务发现系统（例如 Consul）。我们在 Kubernetes 1.6 中推出了新功能，kube-dns 添加了可配置的私有 DNS 区域（通常称为存根域）以及外部的上级域名服务，本文将会讲解如何使用这一功能。&lt;/p&gt;

&lt;p&gt;Kubernetes 目前在 Pod 定义中支持两个 DNS 策略：&lt;code&gt;Default&lt;/code&gt;和&lt;code&gt;ClusterFirst&lt;/code&gt;，&lt;code&gt;dnsPolicy&lt;/code&gt;缺省为&lt;code&gt;ClusterFirst&lt;/code&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如果&lt;code&gt;dnsPolicy&lt;/code&gt;设置为&lt;code&gt;Default&lt;/code&gt;，那么域名解析配置会从 Pod 所在节点继承而来。注意，本文所述功能在&lt;code&gt;dnsPolicy&lt;/code&gt;设置为&lt;code&gt;Default&lt;/code&gt;时无效。&lt;/li&gt;
&lt;li&gt;如果&lt;code&gt;dnsPolicy&lt;/code&gt;设置为&lt;code&gt;ClusterFirst&lt;/code&gt;，DNS 查询会被发送到 kube-dns 服务。kube-dns 服务负责相应以集群域名为后缀（例如&lt;code&gt;.cluster.local&lt;/code&gt;）的查询。其他的域名查询（例如 www.kubernetes.io ）会被转发给来自节点定义的上级域名服务器。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在这一功能推出之前，通常需要利用替换上级 DNS 为自定义解析的方式来完成存根域查询。然而这就使得这个自定义域名解析器成为 DNS 解析过程中的一个高风险因素。本功能让用户能够无需对整个 DNS 路径进行改造就完成自定义解析过程。&lt;/p&gt;

&lt;h2 id=&#34;自定义-dns-流程&#34;&gt;自定义 DNS 流程&lt;/h2&gt;

&lt;p&gt;从 Kubernetes 1.6 开始，集群管理员能够利用 ConfigMap 指定自定义的存根域以及上级 NameServer。下文的配置包含一个存根域和两个上级域名服务器。对域名后缀为&lt;code&gt;.aceme.local&lt;/code&gt;的查询会被发送到地址为 1.2.3.4 的 DNS 服务。另外会把 Google 公共 DNS 作为上级服务器。注意本节末尾对 ConfigMap 中的数据格式进行的解释。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {&amp;quot;acme.local&amp;quot;: [&amp;quot;1.2.3.4&amp;quot;]}
  upstreamNameservers: |
    [&amp;quot;8.8.8.8&amp;quot;, &amp;quot;8.8.4.4&amp;quot;]

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;下图显示了配置中所指示的 DNS 查询过程。当&lt;code&gt;dnsPolicy&lt;/code&gt;设置为&lt;code&gt;ClusterFirst&lt;/code&gt;时，DNS 查询首先被发送到 kube-dns 的 DNS 缓存层。从这里开始检查域名后缀，然后发送到指定的 DNS。在本例中，集群后缀的域名（&lt;code&gt;.cluster.local&lt;/code&gt;），被发送到 kube-dns，最后不符合上面后缀的其他查询被转发到上级 DNS 去进行解析。&lt;/p&gt;

&lt;p&gt;下文表格用来说明域名解析的过程：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;域名&lt;/th&gt;
&lt;th&gt;解析服务&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;kubernetes.default.svc.cluster.local&lt;/td&gt;
&lt;td&gt;kube-dns&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;foo.acme.local&lt;/td&gt;
&lt;td&gt;自定义 DNS（1.2.3.4）&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;widget.com&lt;/td&gt;
&lt;td&gt;上级 DNS（8.8.8.8 和 8.8.4.4）中的一个&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&#34;configmap-配置说明&#34;&gt;ConfigMap 配置说明&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stubDomains&lt;/code&gt; (可选)

&lt;ul&gt;
&lt;li&gt;格式：一个 JSON 编码的 Map 格式，其 Key 为 DNS 后缀（也就是&lt;code&gt;acme.local&lt;/code&gt;），值是一个 JSON 数组，代表一组 DNS IP。&lt;/li&gt;
&lt;li&gt;注意：目标域名服务器也可以是 Kuernetes 服务。例如可以用 dnsmasq 把自定义 DNS 导出到 ClusterDNS 的命名空间中。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;upstreamNameservers&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;格式：一个 DNS IP 组成的 JSON 数组。&lt;/li&gt;
&lt;li&gt;注意：如果指定了这个值，那么从节点的 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 继承过来的值就会被覆盖。&lt;/li&gt;
&lt;li&gt;限制：最多可以指定三个。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;例-1-添加一个-consul-dns-存根域&#34;&gt;例 1：添加一个 Consul DNS 存根域&lt;/h2&gt;

&lt;p&gt;这个例子中，用户希望把 Consul DNS 服务集成到 kube-dns。Consul 服务位于&lt;code&gt;10.150.0.1&lt;/code&gt;，所有的 consul 命名后缀都是&lt;code&gt;.consul.local&lt;/code&gt;。Kubernetes 管理员简单的创建一个&lt;code&gt;ConfigMap&lt;/code&gt;对象就可以完成。注意：本例中管理员不想覆盖节点的上级 DNS 定义，所以不需要指定&lt;code&gt;upstreamNameservers&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {&amp;quot;consul.local&amp;quot;: &amp;quot;10.150.0.1&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;例-2-替换上级-nameserver&#34;&gt;例 2：替换上级 Nameserver&lt;/h2&gt;

&lt;p&gt;这个例子中，集群管理员希望所有的集群外 DNS 查询由&lt;code&gt;172.16.0.1&lt;/code&gt;的服务来完成，同样的用一个 ConfigMap 完成：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  upstreamNameservers: |
    [&amp;quot;172.16.0.1&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
  </channel>
</rss>
