本文分享自华为云社区《容器内指定特定域名解析结果的几种方式》,作者:张俭。
在本篇文章中,我们将探讨如何在容器内指定特定域名解析结果的几种方式。为了方便演示,首先我们创建一个演示用的 Deployment 配置文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-deployment
labels:
app: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- "while true; do echo Hello, Kubernetes!; sleep 10;done"
复制代码
这个 deployment 会创建 1 个 busybox 的 pod,容器每隔 10s 会打印“Hello, Kubernetes!”到控制台
TL;DR
修改/etc/hosts
修改/etc/hosts 是最传统的方式,直接在容器内修改相应的文件来实现域名解析,在 Pod 级别生效。由于其可维护性较差(每次 pod 发生重启都需要手动修改),不推荐在生产环境使用。
例如,我们可以在/etc/hosts 里面添加这样一条记录
/ # ping four-250
PING four-250 (250.250.250.250): 56 data bytes
复制代码
添加 HostAliases 记录
HostAliases 是 kubernetes 中 Pod 配置的一个字段,它提供了 Pod 内容器的/etc/hosts
文件的附加记录。
这在某些情况下非常有用,特别是当你想要覆盖某个主机名的解析结果,或者提供网络中没有的主机名解析时。
这个可以在 Pod、Replica、Deployment、StatefulSet 的级别修改,维护性稍强。举个🌰,我们将上面的 yaml 修改为。
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-deployment
labels:
app: busybox
spec:
replicas: 3
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
hostAliases:
- ip: "250.250.250.250"
hostnames:
- "four-250"
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- "while true; do echo Hello, Kubernetes!; sleep 10;done"
复制代码
这个时候我们查看容器的/etc/hosts,发现它被 kubernetes 自动插入了一条记录**Entries add by HostAliases。**这就是 hostAliases 的实现原理。
在 kubelet_pods 代码中进行了这样的写入动作。
func hostsEntriesFromHostAliases(hostAliases []v1.HostAlias) []byte {
if len(hostAliases) == 0 {
return []byte{}
}
var buffer bytes.Buffer
buffer.WriteString("\n")
buffer.WriteString("# Entries added by HostAliases.\n")
// for each IP, write all aliases onto single line in hosts file
for _, hostAlias := range hostAliases {
buffer.WriteString(fmt.Sprintf("%s\t%s\n", hostAlias.IP, strings.Join(hostAlias.Hostnames, "\t")))
}
return buffer.Bytes()
}
复制代码
Coredns 配置
我们可以通过修改 ConfigMap 来实现让容器解析特定域名的目的。
更改 Coredns 配置
我们可以通过以下命令修改 Coredns 的配置:
kubectl edit cm coredns -n kube-system
复制代码
原有的 configmap
Corefile: |
.:53 {
log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
hosts {
192.168.65.2 host.minikube.internal
fallthrough
}
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
复制代码
在 hosts 里面加上特定的记录
如果您没有配置 reload 插件,则需要重启 Coredns 才能生效,默认的 reload 时间是 30s,在 plugin/reload/setup.go 的 defaultInterval 中定义
自定义 DNS 策略
通过修改 DNS 策略。使得对于单个 Pod/Deploy/StatefulSet 将特定的域名解析发给特定的服务器来达到效果,如下,可以对 pod 添加 dns 的服务器以及 search 域。
spec:
dnsConfig:
nameservers:
- 1.2.3.4
searches:
- search.prefix
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- "while true; do echo Hello, Kubernetes!; sleep 10;done"
复制代码
使用第三方 DNS 插件
不推荐,使用其他的 DNS 插件,来做一些炫酷的自定义操作。而且目前 Coredns 也是业内的主流,没有很好的替代。
点击关注,第一时间了解华为云新鲜技术~
评论