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的域名解析的主要内容,如果未能解决你的问题,请参考以下文章

k8s--DNS域名服务

完美解决K8s中的Pod无法解析外网域名问题

关于k8s 内部pod无法解析外部域名的解决办法

K8S的dns服务

k8s 服务注册与发现Kubernetes内部域名解析原理

k8s 服务注册与发现Kubernetes内部域名解析原理