k8s配置hosts域名的几种方式

方式一:使用hostAlias标签

参考例子:https://www.jianshu.com/p/3e6564edbe74

我们可以在Deployment资源类型的文件里配置hostAlias标签,例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v1
kind: ReplicationController
metadata:
name: dp-rc
namespace: default
spec:
replicas: 1
selector:
name: dp-pod
template:
metadata:
labels:
name: dp-pod
spec:
hostAliases:
- ip: 192.168.176.247
hostnames:
- "dccas.finupgroup.com"
containers:
- name: dp
image: reg.k8s.dc.finupgroup.com/datacenter/dp:latest
imagePullPolicy: Always
ports:
- containerPort: 8080

方式二:coredns里面添加

参考例子:https://blog.csdn.net/u010533742/article/details/109641426

这个是在容器启动的情况下是有效果的,但对于拉镜像的时候,私有仓库很多时候是内网,有需要外部临时访问的时候,那可能没效果,第一道防线就卡主了。

可以在kube-system命令空间下的 coredns这种configmap类型的资源文件里添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ kubectl get pod -n kube-system |grep dns
coredns-5db5696c7-lzxdh 1/1 Running 0 17d
$ kubectl edit cm coredns -n kube-system
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
hosts {
192.168.11.241 www.girls.cn
192.168.11.240 harbor.girls.cn
fallthrough
}
prometheus :9153
forward . "/etc/resolv.conf"
cache 30
loop
reload
loadbalance
}

方式三:使用node节点上的hosts

DNS 策略

在 kubernetes 中还提供了 dnsPolicy 决定 Pod 内预设 DNS 配置策略:

  • None 无任何策略
  • Default 默认
  • ClusterFirst 集群 DNS 优先
  • ClusterFirstWithHostNet 集群 DNS 优先,并伴随着使用宿主机网络

场景1 对接kubernetes内置的Kube-DNS/CoreDNS

场景说明:

这种方式适用于应用中的域名解析只涉及集群内部域名,或者集群内部域名+外部域名两种方式,应用默认采用这种配置。

示例:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx:alpine
dnsPolicy: ClusterFirst

该配置下容器的域名解析文件将如下所示:

nameserver 10.247.3.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

场景2 直接对接云DNS

场景说明:

这种方式适用于应用只访问注册到互联网的外部域名,该场景不能解析集群内部域名。

示例:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx:alpine
dnsPolicy: Default //使用kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云DNS)

该配置下容器的域名解析文件将如下所示:

nameserver 100.125.x.x

场景3 主机网络模式的应用对接Kube-DNS/CoreDNS

场景说明:

对于配置主机网络模式的应用,默认对接云DNS,如果应用需要对接Kube-DNS/CoreDNS,需将dnsPolicy设置为“ClusterFirstWithHostNet”。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80

该配置下容器的域名解析文件将如下所示:

nameserver 10.247.3.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

场景4 自定义应用的域名配置

场景说明:

用户可以完全自定义配置应用的域名解析文件,这种方式非常灵活,dnsPolicy和dnsConfig配合使用,几乎能够满足所有使用场景,如对接用户自建DNS的场景、串联多个DNS的场景以及优化DNS配置选项的场景等等。

示例1:对接用户自建DNS

该配置下,dnsPolicy为“None”,应用的域名解析文件完全根据dnsConfig配置生成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx:alpine
dnsPolicy: "None"
dnsConfig:
nameservers:
- 10.2.3.4 //用户自建DNS的IP地址
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: timeout
value: "3"

该配置下容器的域名解析文件将如下所示:

nameserver 10.2.3.4
search ns1.svc.cluster.local my.dns.search.suffix
options timeout:3 ndots:2

参考资料1
参考资料2