在之前的文章中提到过,Kubernetes 1.6 新增的混合 DNS 功能。这一功能不大,但是在企业私有云环境下有着非常重要的衔接作用,能够有效的将 Kubernetes 内的应用和集群外甚至互联网上的的 Consual 或者类似系统管理的服务连接起来,形成更好的协同效果。
上篇文章主要侧重点是概念和一些 YAML 例子,本文则会从操作出发,用一个例子从头到尾的逐步操作这一功能的具体操作。
DNS Server
我们使用一个 Ubuntu Server 运行 dnsmasq 来担任 Kubernetes 集群外的 DNS 服务器角色,只为了满足测试需要的话,就不需要太复杂的配置了。
安装
具体安装步骤如下:
#!/bin/sh# 安装 dnsmasqapt install dnsmasq# 停止自动启动的 dnsmasq 服务systemctl stop dnsmasq# 生成一个 Host 文件并写入一条记录echo " 114.114.114.114 server.out-of.kubernetes" > /tmp/hosts# 显示 IPifconfig# 启动 DNS 服务# -d 用 debug 模式启动,在前台运行# -q 输出查询记录# -h 不使用 /etc/hosts# -R 不使用 /etc/resolve.conf# -H 使用刚才生成的文件作为 dns 记录dnsmasq -q -d -h -q -R -H /tmp/hosts
这样,我们就启动了一个 DNS 服务器,并且可以直观的看到其工作状况如下:
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
Kubernetes 配置
前文说过,我们需要用一个 Configmap 对象来让 Kubernetes 应用新的 DNS 解析配置,这里我们简单的新建一个存根域,就是上文提到的out-of.kubernetes
域名,让其使用我们前面安装的 DNS 服务器进行解析,其他域名则使用8.8.8.8
和8.8.4.4
这一公共 DNS 解析。配置情况如下:
apiVersion: v1 kind: ConfigMap metadata: name: kube-dns namespace: kube-system data: stubDomains: | {"out-of.kubernetes": ["10.140.0.5"]} upstreamNameservers: | ["8.8.8.8", "8.8.4.4"]
利用kubectl apply -f
命令使之生效。
注意:系统可能缺省带有这一 configmap,因此需要用 apply 进行操作,建议使用 kubectl get configmap kube-dns -o yaml --namespace kube-system
进行复查。
测试 Pod
这里使用一个 Alpine Linux 的镜像作为测试工具:
apiVersion: v1 kind: Pod metadata: name: tester spec: containers: - name: alpine image: alpine imagePullPolicy: IfNotPresent command: ["sleep"] args: ["3600"]
测试
测试 Pod 运行之后,可以使用kubectl exec -it tester sh
命令进入 Pod开始测试。
在 Pod 的 Shell 中我们可以尝试执行
ping server.out-of.kubernetes
,会看到返回了我们写入在 Hosts 中的地址,在 DNS 服务器端,也会看到相关的查询记录。如果 ping 其他的主机名,则会返回正常的结果。