通过网络命名空间实现网络分流的思想及方法

场景描述

以k8s环境为例,在kubernetes集群中是通过CoreDNS来控制集群DNS流量走向。

在业务环境中,存在eth0、eth1、eth2等多个网络设备,其对应不同的网络出口。那如何将指定DNS流量进行分流呢?

大家可能想到的是:根据三元组信息(源IP、协议、出口IP)+ 代理转发的方式实现分流。

没错,下面按照这种思路实现~

简述下kubernetes集群中DNS请求流程:

  1. 进入pod centos 容器中,执行nslookup www.baidu.com命令
  2. 进行域名解析时,会首先找到容器中的/etc/resolv.conf文件,根据此文件会将dns服务器指向CoreDNS容器地址
  3. DNS请求到达CoreDNS后,会针对 www.baidu.com 域名解析,如果不是kubernetes集群域名,则DNS请求到CoreDNS forward插件
  4. forward插件会根据配置,读取kubernets宿主机中/etc/resolv.conf文件,将www.baidu.com域名通过公网DNS解析
  5. 此时CoreDNS容器网络环境与kubernets宿主机网络没连通,是利用hostPort将宿主机53端口映射到CoreDNS容器中,将DNS报文传输并通过互联网络解析完成。

我们了解CoreDNS解析流程后,会发现在第5步骤中:CoreDNS容器与Kubernetes宿主机网络没有连通,导致从CoreDNS没办法获取到宿主机的网络设备,无法按照我们预期进行DNS流量分流。

这里说明一下CoreDNS容器默认没有配置hostNetwork网络模式(hostNetwork代表继承宿主机的网络栈),所以对于CoreDNS容器来说是网络隔离的。

下面进入到咱们今天的话题《通过设置net命名空间进行网络分流》。

大致思路为:CoreDNS收到集群中dns请求后,forward插件在向公共DNS服务器发起 net.Dial() 网络请求前,将该线程上下文设置成kubernetes宿主机的net命名空间,那么此时 net.Dial() 网络请求就可以获取到宿主机所有的网络设备,达到网络分流。

第一步,将宿主机里命名空间文件挂在到CoreDNS容器中

执行kubectl edit deployment.apps -n kube-system coredns 命令,修改CoreDNS Deployment。增加内容如下:

yaml 复制代码
volumes:
  - name: host-namespace
    hostPath:
      path: /proc/1/ns

这里是将Linux系统中1号进程的命名空间目录挂进了CoreDNS容器中。 相应的将该目录映射到容器任意一个位置,比如创建/host-netns目录。

第二步,修改CoreDNS项目源码实现DNS网络请求分流

在封装dns.Client{}结构体时,这里 netcardIP 变量可以理解为 eth0 网卡IP,代表从该网口作为出口。

重新封装dns.Client{}后,调用dialInNamespace()函数将本线程设置为宿主机的网络命名空间。

通过系统调用,将网络命名空间文件描述设置当前线程。

第三步,修改CoreDNS权限模式

这里需要将容器权限更改为特权模式,修改方式也是更改 CoreDNS Deployment配置。

技术文章持续更新,请大家多多关注呀~~

搜索微信公众号,关注我【 帽儿山的枪手 】

相关推荐
秦曱凧2 小时前
NAS上使用Docker部署网页版双人对战五子棋
docker
janthinasnail2 小时前
使用Docker安装MeiliSearch搜索引擎
搜索引擎·docker
MediaTea8 小时前
Python 第三方库:Requests(HTTP 客户端)
开发语言·网络·python·网络协议·http
Mr_Xuhhh8 小时前
HTTPS 协议原理
网络·网络协议·测试工具·http·https
i_am_a_div_日积月累_8 小时前
http与https协议区别;vue3本地连接https地址接口报500
网络协议·http·https
Mr_Xuhhh9 小时前
传输层协议 TCP(1)
运维·服务器·网络·c++·网络协议·tcp/ip·https
川石课堂软件测试9 小时前
JMeter并发测试与多进程测试
功能测试·jmeter·docker·容器·kubernetes·单元测试·prometheus
GalaxyPokemon9 小时前
HTTP和HTTPS的区别
网络协议·http·https
吐个泡泡v10 小时前
Docker部署MySQL完整指南:从入门到实践
mysql·docker·容器·部署
一乐小哥10 小时前
Docker 拉取镜像超时?别再瞎抄配置了!亲测 3 个有效镜像源 + 避坑指南
linux·docker