k8s集群中service的域名解析pod的域名解析
Posted MssGuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s集群中service的域名解析pod的域名解析相关的知识,希望对你有一定的参考价值。
前言
在k8s集群中,service和pod都可以通过域名的形式进行相互通信,换句话说,在k8s集群内,通过service和pod的域名,可以直接访问内部应用,不必在通过service ip地址进行通信,一般的,我们创建service的时候不建议指定service的clusterIP,而是让k8s自动为service分配一个clusterIP,这样,service的IP是自动分配,但是service名字总是固定的吧,这样在集群内部就可以直接通过service的域名来连接即可,如前端pod应用直接通过service域名来连接后端pod。
service的域名
<servicename>.<namespace>.svc.<clusterdomain>
其中,servicename为service名称,namespace为service所处的命名空间,clusterdomain是k8s集群设计的域名后缀,默认为cluster.local
演示示例:
下面,我们通过创建一个deployment和service,然后创建一个测试pod,在测试pod中通过访问service域名的形式访问应用,验证service域名是否正常。如下所示:
# 创建一个deployment,有3个副本
[root@master service]# vim deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
env: dev
tiar: front
name: deployment-nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: nginx-container
ports:
- containerPort: 80
name: http
protocol: TCP
restartPolicy: Always
#创建一个service,用于反向代理上面创建的deployment的pod
[root@master service]# vim svc-deployment-nginx.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: svc-deployment-nginx
namespace: default
spec:
ports:
- name: nginx-port
nodePort: 30080
port: 80
protocol: TCP
targetPort: http
selector:
app: nginx
type: NodePort
#创建一个pod用于测试
[root@master service]# cat ../pod/pod-busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-command
labels:
env: dev
namespace: default
spec:
nodeName: node2
containers:
- image: busybox
name: busybox-container
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt;sleep 3;done;"]
resources:
limits:
cpu: 2
memory: 2G
requests:
cpu: 1
memory: 500M
[root@master service]#
# 在测试pod中直接访问service的域名
[root@master service]# kubectl exec -it pod-command -- /bin/sh #进入到测试pod中
/ # wget http://svc-deployment-nginx.default.svc.cluster.local:80 #这个pod没有curl命令,所以通过wget命令下载
Connecting to svc-deployment-nginx.default.svc.cluster.local:80 (10.111.193.190:80) #下载成功
saving to 'index.html'
index.html 100% |*******************************************************************************************************************************************************************************************| 612 0:00:00 ETA
'index.html' saved
/ # cat index.html #下载成功,这是nginx的index文件,说明通过service域名访问是正常的
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ #
以上,说明,在pod内部通过访问service域名的形式访问其他服务,service的域名解析是正常的。
注意:不要在宿主机上curl service的域名,这样是访问不通的,因为service的域名解析是k8s集群内部的,不是外部所主机的。service的域名解析是供k8s集群内部应用之间进行访问的。
pod的域名解析(存疑)
pod的DNS域名格式为:<pod-ip>.<namespace>.pod.<clusterdomain>
,其中,pod-ip
需要使用-将ip直接的点替换掉,namespace为pod所在的命名空间,clusterdomain是k8s集群设置的域名后缀,一般默认为 cluster.local
,演示如下:10-244-1-223.default.pod.cluster.local
对应deployment、deamonset等创建的pod,还可以<pod-ip>.<deployment-name>.<namespace>.svc.<clusterdomain>
访问。
对于StatefulSet创建的pod,statefulset.spec.serviceName字段解释,其pod的域名为:pod-specific-string.serviceName.default.svc.cluster.local
总结
service的域名解析很重要,我们只需要在k8s集群内部访问service的域名即可,因为service的名称总是固定的,既然是固定的,那么可以直接通过访问service的域名方式来访问service。
企业dns服务器部署详解(下)—dns双向解析/dns集群/ddns安全动态域名解析
Linux系统中dns双向解析/dns集群/ddns安全动态域名解析
文章目录
1、dns的双向解析
dns双向解析指的是分别在2个网段的主机中对同样域名做地址解析得到的A记录不同,这里我们需要三台主机进行实验说明,具体操作步骤如下:
实验步骤:
1)配置单网卡虚拟主机westosb,设置其网络处于真机id(33)网段即172.25.33.233,这里我们将处于254网段的真实主机172.25.254.33和处于33网段的虚拟主机westosb172.25.33.233作为需要进行dns解析的两个客户端
2)配置双网卡主机westosa,设置其网络分别处于254、33两个不同的网段:172.25.254.真机id+100即172.25.254.133;172.25.真机id.真机id+100即172.25.33.133
3)编辑dns服务器westosa的配置文件 /etc/named.conf,注释掉原有解析体系,建立内外网两个不同的解析体系,设定254内网网段主机进行域名解析时读取记录内网维护域名的语句块的文件 /etc/named.rfc1912.zones,设定其余外网网段主机进行域名解析时读取记录外网维护域名的语句块的文件 /etc/named.rfc1912.zones.inter
4)在westosa中复制(-p) /etc/named.rfc1912.zones得到/etc/named.rfc1912.zones.inter,编写该文件指定外网的维护域名和解析记录文件
5)在dns服务的数据目录/var/named中复制模板(-p)编写外网解析记录文件westos.org.inter,完成后重启dns服务named
6)此时还要将内网真实主机和外网主机westosb的/etc/resolv.conf中的域名解析指向分别设置为安装有dns服务器的双网卡主机westosa中与其处于同一网段的IP
7)完成上述操作后分别在处于254网段的真实主机和处于33网段的虚拟主机westosb中使用dig 域名测试做同样域名的地址解析,可以看到同一域名被解析为访问客户端主机各自网段对应的A记录
2、dns集群
随着访问量的增多,一台dns服务器上的解析资源可能无法应对访问压力,为了解决问题,我们需要搭建dns集群。
a、搭建辅助dns
实验步骤:
1)还原dns双向/多向解析前的实验环境,配置单网卡虚拟主机westosb,设置其网络为172.25.254.真机id+200即172.25.254.233,编辑dns服务器westosa的配置文件 /etc/named.conf,注释掉建立的内外网两个不同的解析体系,还原之前的解析体系
2)这里我们将westosb设置为辅助dns服务器,在westosb中安装dns服务软件bind,在防火墙中设定允许dns服务,刷新火墙使设定生效,启动dns服务named
3)编辑westosb的dns服务配置文件 /etc/named.conf,注释掉开启网络接口、允许查询A记录的客户端列表的语句设定(注释后默认在本地所有网络接口上开启53端口,允许所有访问客户端查询A记录),关闭dns安全检测功能参数
4)编写westosb中的/etc/named.rfc1912.zones文件,指定维护域名,指定该dns服务器类型为辅助dns(master—主dns slave—辅助dns),指定其主dns的ip即从哪里同步解析数据,指定解析时读取存放在/var/named/slaves目录下的解析记录文件,删除允许更新的参数
5)此时/var/named/slaves目录下无内容,将westosb的/etc/resolv.conf中的域名解析指向设置为它自己的ip,完成上述操作后重启dns(named)服务,此时slaves目录下同步有主dns的解析记录文件,在westosb中dig 域名可以得到与westosa中相同的解析IP
b、更新同步解析服务
实验步骤:
1)在westosa中修改域名A记录文件后重启dns(named)服务,此时在westosb中dig 域名可以看到仍为原解析ip,而在westosa中dig 域名可以看到解析ip已更改
2)我们可以删除westosb中/var/named/slaves目录下同步的解析记录文件,重启westosb的dns(named)服务,重新同步,此时在westosb中dig 域名可以看到解析ip已更改,但这种方式显然不合理
3)我们可以在westosa中编写/etc/named.rfc1912.zones,在维护域模块中添加also-notify参数,即设定当westosa中解析记录文件更新时通知辅助dns(这里可以设置多个,用;隔开)
4)在dns服务器westosa的域名A记录文件中修改记录后还要修改主dns和辅助dns同步标志serial参数的值,这一参数只能增量修改,完成后重启westosa的dns(named)服务
5)此时在westosb中dig 域名可以看到解析ip会自动同步更改,不需要重启westosb的dns(named)服务,westosb中/var/named/slaves目录下同步的解析记录文件会在主dns解析记录文件更改后自动更新同步
3、ddns(dhcp+dns)安全动态域名解析
实验步骤:
1)在westosa中安装并启动dhcp服务,复制dhcp配置文件模板并修改,设定域名和dns服务器IP,设置分配网络的网段、子网掩码及网络池,重启dhcpd服务
2)删除westosb中原有的网络连接,为其添加工作方式为dhcp的网络连接,重启网络连接后westosb自动获取到IP为172.25.254.62
3)编写dns服务器westosa中的解析A记录文件,为主机域名为westosb.westos.org的虚拟主机westosb添加A记录,重启westosa的dns(named)服务
4)将westosb的/etc/resolv.conf中的域名解析指向设置为dns服务器westosa的ip,此时在westosb中dig其自身域名可以解析得到westosb的ip
5)修改dhcp服务器westossa中dhcp配置文件网络池分配网络的范围,重启dhcpd服务,重启westosb网络连接,westosb重新获取到的新IP为72.25.254.63,但此时在westosb中dig其自身域名解析得到的ip仍为之前的ip
6)编写dns服务器westosa中的解析A记录文件,删除主机域名为westosb.westos.org的虚拟主机westosb的A记录(必须删除否则会和之后动态域名解析冲突),设置ddns动态域名解析(设置方式可以man 5 dhcpd.conf搜索DYNAMIC DNS UPDATE SECURITY进行查看)
7)dns设定——查看/etc/rndc.key中默认的dns更新许可密钥的加密方式,切换到一个空目录中,dnssec-keygen为dns生成更新许可密钥(-a指定加密方式,选择默认加密方式;-b指定生成的密钥长度;-n指定密钥的名称类型,这里是为本机HOST生成密钥),复制dns更新密钥指定模板,修改生成更新密钥指定文件,接着编辑dns服务的主配置文件添加读取更新密钥指定文件语句,再编辑/etc/named.rfc1912.zones在维护域模块中修改allow-update参数的值,设定拥有指定密钥才可以更新dns的解析A记录文件
8)测试:使用nsupdate命令无法更新A记录文件,必须加-k参数指定更新认证密钥,此时进行的更新操作不是保存在A记录文件本身中,而是保存在更新生成的.jn1文件中,其他客户主机在访问dns服务器时是将A记录文件和.jn1文件整合后进行解析的
9)dhcp设定——编辑dhcp配置文件,开启dhcp更新dns的功能,为dhcp分发更新dns的认证密钥,指定使用密钥的域(由于dns是在本机westosa搭建,所以这里可以使用回环接口进行通信)
10)设定完成后,重启westosa的dhcpd、dns(named)服务,重启westosb网络连接,此时在westosb中dig其自身域名解析得到的ip与其当前分配到的ip一致,ddns动态域名解析设置成功
以上是关于k8s集群中service的域名解析pod的域名解析的主要内容,如果未能解决你的问题,请参考以下文章