网络隔离场景下访问 Pod 网络

news2024/11/15 19:39:17

接着上文 VPC网络架构下的网络上数据采集

介绍

        考虑一个监控系统,它的数据采集 Agent 是以 daemonset 形式运行在物理机上的,它需要采集 Pod 的各种监控信息。现在很流行的一个监控信息是通过 Prometheus 提供指标信息。

        一般来说,daemonset Agent 会使用物理机网络(就算有自己的网络也没关系),它需要通过 ICMP、TCP、HTTP 等协议访问目标 Pod。这在一般的 k8s 场景下是没问题的,因为此时 daemonset Agent 与 目标 Pod 之间的网络是通的,没有隔离。

        而在一些公有云或多租户环境下, 一个物理机上实际分给了好几个租户,此时网络安全管理员往往会限制物理机网络与 Pod 网络是隔离的。这么一搞我们原本的整套链路都不工作了。当然,网络安全管理员这么做是师出有名,并且确实是必要的。但这种方案确实没有给监控场景留一条活路,我们也很难受。

        本文分享几种方案从不同角度突破了这种隔离,当然它们并不一定通用,更多的是为监控场景服务。

可能涉及到的技术或概念

  • Input / Output Stream
  • command exec
  • Linux namespace 、nsenter
  • docker exec / docker SDK
  • unix domain socket / abstract unix domain socket, 以下简称 uds 或 abstract uds
  • socat

基于 Linux namespace 的方案

        如果你使用的是标准的 docker/containerd/runc 或 containerd/runc 的组合,并且对 docker、runc 的实现原理有一些了解,那么你应该听说过 Linux namespace。本文不再介绍 Linux namespace 与 docker、runc 的关系。

        Agent 想与 pod:ip 建立 TCP 连接,只需要将当前线程 network namespace 切换到目标 pod 的 network namespace,这样对于当前线程来说它就进入了目标 pod 的网络,此时你再执行 `net.Dial` 那就能连接上了.

        可以参考下面链接的代码.

https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/cricore/nsenter_linux.go#L52

        linux 有个命令叫 nsenter 本质它就是直接切换的 namespace 然后执行命令, 感兴趣的可以看一下.        

基于 docker sdk exec 的方案

        这里的 docker sdk exec 指的是通过 docker sdk 执行 exec 命令, 而非命令行里的 docker exec. 这样做效率更高一些.

       基于 Linux namespace 的方案只能适用于 runc 容器运行时. 遇到其他容器运行时就不工作了.

但无论怎么变,底层的 CRI 实现总是会提供类似 docker exec、containerd exec 的功能。

        我们可以想办法往目标容器里放一个辅助流量转发的 binary,这个 bianry 从 stdin 读数据,然后写到目标 pod:port, 从目标 pod:port 读数据, 然后写到 stdout. 通过 docker exec 执行该 binary 让其转发流量.

        可以参考如下链接的代码

https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/criutils/tcpproxy.go#L31

        如果直接用 docker sdk exec 方案的话,它对代码的修改比较大。需要配合基于 HTTP 代理 或 socks5 代理才能减少对代码的侵入性。

        docker sdk exec 提供了一种通用的方式用于请求转发, 在我遇到的所有场景里, 它都可以工作. 当然由于它是基于命令行执行的, 因此执行效率会低一些, 使用的时候要考虑这一点.

        考虑到 k8s 提出了自己的 CRI 规范, 而不再强依赖 docker/containerd 的实现API. 因此我们之后应该直接面向 CRI 编程.

        但是 CRI 也有一些缺点:

  • CRI 的初始化步骤比较麻烦, 不像 docker 只需要指定其 unix domain sock 地址就行了.
  • CRI 的 exec 无法指定 user/workdir/env

某些特定容器运行时有建立 proxy 的功能

        在实践中,某些以安全为特点的容器运行时也考虑到了网络隔离问题,因此它们往往具备建立 Proxy 的能力。

        以某个基于 VM 的容器运行时为例。

        它会有 2个 netns: VM 有一个,Pod 有一个。

        VM 的 netns 我们可以从 docker inspect 的信息中看到,而 Pod 的 netns 我们无法看到(也无法访问,不在一个 Linux 内核里)。

        该容器运行时提供了一个命令,它可以连接 VM netns 和 Pod netns 里的 2 个 abstract uds。甚至可以做到连接 2 个 netns 里的 ip:port (其实就是做一层转发).

        Agent 可以通过 setns 的方式进入 VM 的 netns,再利用上述命令即可打通 Agent 到 目标 Pod 的 ip:port。

        创建 proxy 时需要选择方向:

  • VM 主动建连 Pod,需要在 Pod 上 Listen
  • Pod 主动建连 VM,需要在 VM 上 Listen

基于 HTTP 代理的方案

        假设 Agent 访问 Pod 用的是 HTTP 协议。

        我们在 Agent 上实现一个 HTTP 代理服务器,Agent 访问 Pod 时配置 HTTP proxy,这样流量就会发到 HTTP 代理服务器上。在该代理服务器的实现里,我们读取请求序列化为 []byte,通过 docker exec 将该请求序列化的 []byte 作为 stdin 传入调用容器内部的辅助程序。辅助程序启动后从 stdin 读数据并反序列化出 HTTP 请求,辅助程序在容器内部访问 http://pod:port 是一定可以通的。辅助程序将 http://pod:port 的返回结果写到 stdout 里。HTTP 代理服务器实现读 docker exec 的 output 转成对应的 http.Response 即可。

        可以参考下面链接的代码.

https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/impl/netproxy/proxy_http.go#L118

基于 socks5 代理的方案

        比 HTTP 更通用的场景是 TCP 级的代理,常见的是 socks5 代理。

比如你想要通过 mysql 命令连到隔离的目标容器里,mysql 讲的显然是它自己的协议不是 HTTP,此时 TCP 级别的代理就派上用场了。我们只需要在 mysql 建连的地方设置 socks5 proxy 就行。

        刚好有一个开源软件 socat 可以从 标准流 双向拷贝到一个 TCP 流, 所以我上面的图用的是 socat. 但实际情况中, 目标容器里并不一定有 socat. 所以实际情况中我们会复制一个辅助 binary 到容器内部, 该 binary 实现了类似的功能.

        可以参考下面链接的代码.https://github.com/traas-stack/holoinsight-agent/blob/main/pkg/cri/impl/netproxy/proxy_socks5.go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NoMachine局域网桌面远程控制管理工具软件,下载配置教程

近期入手了一台雷神MIX Mini主机,用于开发使用,但是因为主机没有显示器和键盘等输入设备,如果需要对Mini主机进行控制,则要频繁插入显示器和键盘,操作起来相当的不方便。 在体验了一些常见的桌面控制软件,…

如何使用docker快速安装Plik并实现固定公网地址远程访问

文章目录 推荐1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点…

现代C++之万能引用、完美转发、引用折叠FrancisFrancis

转载:现代C之万能引用、完美转发、引用折叠 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/99524127 后期参考(还未整合):C 完美转发深度解析:从入门到精通_c完美转发-CSDN博客https://blog.csdn.net/qq_21438461/article/details/129938466 0.导语 …

Docker部署Plik系统并结合内网穿透实现远程访问本地上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上传或者…

Likeshop社区团购源码系统-社区团购更加便捷

一、什么是社区团购? 社区团购是一种基于社区的一种团购模式,依托于社区居民的消费需求,由社区团长组织发起,通过集中采购、批量销售的方式,为社区居民提供优质、优惠的商品。这种模式既满足了消费者对于优惠、便捷的…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新,因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

【三】【C++】类与对象(二)

类的六个默认成员函数 在C中,有六个默认成员函数,它们是编译器在需要的情况下自动生成的成员函数,如果你不显式地定义它们,编译器会自动提供默认实现。这些默认成员函数包括: 默认构造函数 (Default Constructor)&…

springboot外出务工人员信息管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合,利用java技术建设疫情防控期间某村外出务工人员信息管理系统,实现疫情防控期间某村外出务工人员信息的信息化。则对于进一步提高疫情防控期间某村外…

Aleo项目详细介绍-一个兼顾隐私和可编程性的隐私公链

Aleo上线在即,整理一篇项目的详细介绍,喜欢的收藏。有计划做aleo节点的可交流。 一、项目简介 Aleo 最初是在 2016 年构思的,旨在研究可编程零知识。公司由 Howard Wu、Michael Beller、Collin Chin 和 Raymond Chu 于 2019 年正式成立。 …

AST反混淆实战-jsjiamiv7最高配置

js加密混淆网站 https://www.jsjiami.com/一、混淆demo生成 01 打开目标网址 https://www.jsjiami.com/ 02 按照顺序加密混淆二、混淆前后demo 混淆前的源码 (function(w, d) { w.update "2023年01月17日05:34:29更新"; d.info "本站历时1年半研发的新版本V7…

【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 归并排序 代码实现&#xf…

gradle简单入门

安装 需要有Java环境 下载地址:https://gradle.org/releases/ 8.5版本仅有二进制文件:https://gradle.org/next-steps/?version8.5&formatbin 8.5版本包含文档和源码及二进制文件:https://gradle.org/next-steps/?version8.5&f…

C语言——如何进行文件操作

大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位→…

C语言探索:水仙花数的奥秘与计算

摘要: 水仙花数,一种特殊的三位数,其各位数字的立方和等于该数本身。本文将详细介绍水仙花数的定义、性质,以及如何使用C语言来寻找100至999范围内的水仙花数。 目录 一、水仙花数的定义与性质 二、用C语言寻找100至999范围内的…

AJAX的原理(重点)

◆ XMLHttpRequest 什么是XMLHttpRequest? 定义: 关系:axios 内部采用 XMLHttpRequest 与服务器交互 注意:直白点说就是axios内部就是封装了XMLHttpRequest这个对象来实现发送异步请求的 使用 XMLHttpRequest 步骤&#xff1a…

聊聊用户故事地图

这是鼎叔的第八十五篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版(机械工业出版社&…

npm安装下载修改镜像源

问题描述一 npm install 时,报错:npm ERR! network request to https://registry.npmjs.org/postcss-pxtorem failed, reason: connect ETIMEDOU,这是因为默认npm安装会请求国外的镜像源,导致下载缓慢容易断开请求下载失败的 np…

第九节HarmonyOS 常用基础组件18-checkBox

1、描述 提供多选框组件,通常用于某选项的打开或关闭。 2、接口 Checkbox(options:{name?: string, group?: string}) 3、参数 参数名 参数类型 必填 描述 name string 否 多选框名称 group string 否 多选框群组名称。(未配合使用Chec…

Coppeliasim倒立摆demo

首先需要将使用Python远程控制的文件导入到文件夹,核心是深蓝色的三个文件。 本版本为4.70,其文件所在位置如下图所示,需要注意的是,目前不支持Ubuntu22的远程api: 双击Sphere这一行的灰色文件,可以看到远程…

【C++版】排序算法详解

目录 直接插入排序 希尔排序 选择排序 冒泡排序 堆排序 快速排序 hoare法 挖坑法 前后指针法 非递归版本 快速排序中的优化 归并排序 递归版本 非递归版本 计数排序 总结 直接插入排序 直接插入排序的思想是:把待排序的记录按其关键码值的大小逐个插入…