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

接着上文 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.mzph.cn/news/656941.shtml

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

相关文章

线性代数------矩阵的运算和逆矩阵

矩阵VS行列式 矩阵是一个数表,而行列式是一个具体的数; 矩阵是使用大写字母表示,行列式是使用类似绝对值的两个竖杠; 矩阵的行数可以不等于列数,但是行列式的行数等于列数; 1.矩阵的数乘就是矩阵的每个…

记录springboot bug

mybatis bug mapper 自动生成xml 产生错误 首先我这个bug十分奇怪,不管是报错,还是解决方法 首先,我还原我bug的过程 我首先要在 ordersMapper生成一个方法 本来是这样的方法 Mapper public interface OrdersMapper extends BaseMapper<Orders> {List<GoodsSales…

C语言——深入理解指针2

目录 1. 野指针1.1 野指针成因1.1.1 指针未初始化1.1.2 指针越界访问1.1.3 指针指向的空间释放 1.2 如何规避野指针1.2.1 指针初始化1.2.2 小心指针越界1.2.3 指针变量不再使用时&#xff0c;及时置NULL&#xff0c;指针使用之前检查有效性1.2.4 避免返回局部变量的地址 2. ass…

Linux:进度条的创建

目录 使用工具的简单介绍&#xff1a; \r &#xff1a; fflush &#xff1a; 倒计时的创建&#xff1a; 倒计时的工作原理&#xff1a; 进度条的创建&#xff1a; 不同场景下、打印任意长度的进度条&#xff1a; main .c procbor.c 测试效果&#xff1a; 使用工具…

YOLOv8实例分割实战:TensorRT加速部署

课程链接&#xff1a;https://edu.csdn.net/course/detail/39273 PyTorch版的YOLOv8支持高性能实时实例分割方法。 TensorRT是针对英伟达GPU的加速工具。 本课程讲述如何使用TensorRT对YOLOv8实例分割进行加速和部署&#xff0c;实测推理速度提高3倍以上。  采用改进后的t…

设计模式第2篇|策略模式

&#x1f680; 作者简介&#xff1a;程序员小豪&#xff0c;全栈工程师&#xff0c;热爱编程&#xff0c;曾就职于蔚来、腾讯&#xff0c;现就职于某互联网大厂&#xff0c;技术栈&#xff1a;Vue、React、Python、Java &#x1f388; 本文收录于小豪的前端系列专栏&#xff0c…

Vertica单点更改服务器ip

需求 服务器网段调整&#xff0c;将ip&#xff1a;192.168.40.190收回&#xff0c;使用ip&#xff1a;192.168.40.200 默认情况下&#xff0c;节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

解锁Web3:数字未来的大门

随着科技的不断推进&#xff0c;我们正站在数字时代的新门槛上。Web3&#xff0c;作为互联网的下一个演进阶段&#xff0c;正在逐渐揭开数字未来的面纱。本文将深入探讨Web3的本质、对社会的影响以及在数字时代中所扮演的关键角色。 什么是Web3&#xff1f; Web3是互联网发展的…

vs2008配置mysql

1.在官网下载C库&#xff1a;MySQL Connector C 1.0.5 2.在官网下载C库&#xff1a;mysql-connector-c-noinstall-6.0.2-win32 3.vs2008中工程配置 4.拷贝dll到程序运行目录

从源码到成功经营:连锁餐饮管理系统的开发实践

连锁餐饮业更是需要精密的系统来统一管理多个分店的运营&#xff0c;提高效益并确保一致的服务标准。所以&#xff0c;本篇文章小编将为大家讲述如何开发连锁餐饮管理系统&#xff0c;希望对您有一定的启发。 一、系统设计与架构 首先&#xff0c;成功的连锁餐饮管理系统源码需…

高等数学:导数

本文主要参考视频如下&#xff1a; 【建议收藏】同济七版《高等数学》精讲视频 | 期末考试 | 考研零基础 | 高数小白_哔哩哔哩_bilibili 仅供本人学习使用。 之前主要学习了三个概念&#xff1a; 极限&#xff1b; 无穷小&#xff1b; 连续&#xff1b; 先简单捋一捋。 极限是说…

IDEA:git 回滚本地提交-git 选择 Reset Current Branch to

前言 回滚提交到本地但是还没有 Push 上去的提交 选择我们要回滚的节点&#xff0c;然后点击 git 选择 Reset Current Branch to… 再选择 Hard 。当我们点击 Reset 的时候&#xff0c;代码就会回滚到单前选中的这个版本

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换&#xff1f;总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密&#xff08;推荐&#xff09; 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的&#xff0c;安全性太低 需求&#xff1a; 将密码加密后存储&#xff0c;提高安全性 二、密码加密…

探析零知识证明高能发展路径:走向更安全、私密且可扩展的 Web3 新时代

原文&#xff1a;https://www.coinbase.com/blog/understanding-the-zero-knowledge-landscape 作者&#xff1a;Jonathan King&#xff5c;Coinbase Ventures 编译&#xff1a;TinTinLand 本文核心观点 2023 年&#xff0c;零知识技术吸引了逾 4 亿美元的投资&#xff0c;主…

正则表达式补充以及sed awk

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

三、ElasticSearch集群搭建实战

本篇ES集群搭建主要是在Linux VM上&#xff0c;未使用Docker方式, ES版本为7.10 ,选择7.10版本原因可以看往期文章介绍。 一、ElasticSearch集群搭建须知 JVM设置 Elasticsearch是基于Java运行的&#xff0c;es7.10可以使用jdk1.8 ~ jdk11之间的版本&#xff0c;更高版本还没…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包&#xff0c;之后&#xff0c;将端 口算出&#xff0c;将结果记录在sever-map表中&#xff0c;相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力&#xff1f;NPDP认证正是你需要的&#xff01;&#x1f525; NPDP认证&#xff0c;即产品经理国际资格认证&#xff0c;由美国产品开发与管理协会&#xff08;PDMA&#xff09;所发起&#xff0c;是全球公认的新产品开发专业认…

Redis(九)集群(cluster)

文章目录 概述作用1. redis集群的槽位slot2. redis集群的分片3. 第1,2点的优势&#xff1a;**最大优势&#xff0c;方便扩缩容和数据分派查找**4. slot槽位映射&#xff0c;一般业界有3种解决方案第一种&#xff1a;哈希取余分区第二种&#xff1a;一致性哈希算法分区第三种&am…