当前位置: 首页 > news >正文

【K8s】专题十五(6):Kubernetes 网络之 Pod 网络调试

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【K8s】专题十五(5):Kubernetes 网络之 CoreDNS


目录

一、基本介绍

二、Pod 网络调试

1、调试工具

2、调试原理

3、调试过程

三、nsenter 常用参数


一、基本介绍

在实际工作中,我们经常会遇到一些疑似网络方面的故障问题,从而需要对 Kubernetes 集群中的 Pod 进行网络调试。

但是由于最小化原则,Pod 的容器镜像中通常并不会安装 ping、curl、telnet、tcpdump 等调试工具,或者在 Pod 容器中可以临时安装工具但是效率不高,都给 Pod 网络调试带来困难。

针对上述场景的问题,笔者将在本文介绍一种 Pod 网络调试方法,以灵活应对网络调试需求。


二、Pod 网络调试
1、调试工具

nsenter 是 Linux 操作系统的一种命令行工具,允许用户进入指定进程的某个命名空间,并在该命名空间下灵活使用主机的命令行工具、执行特权操作等。

命名空间则是 Linux 内核的一种功能,用于将进程的资源隔离在不同的环境中,从而提高安全性和可靠性。常见的命名空间包括:

  • Mount:文件系统命名空间
  • UTS:主机名和域名命名空间
  • IPC:进程间通信命名空间
  • PID:进程命名空间
  • Network:网络命名空间
  • User:用户命名空间

通常在 Linux 操作系统中,默认安装有 nsenter。手动安装命令如下:

yum install -y util-linux || apt install -y util-linux

2、调试原理

在文章【Docker】专题一:Docker 基本架构 中提到,容器的本质是进程,但可以运行于独立的命名空间,拥有自己的 root 文件系统、网络配置、进程空间,甚至用户 ID 空间。

由此可见,我们可以通过 nsenter 进入 Pod 中容器(进程)的网络命名空间,利用 Node 节点已有的命令行工具实现对 Pod 进行网络调试。

3、调试过程

调试过程在使用 Containerd 作为运行时的 Kubernetes 集群中进行验证

  • 作为对比,进入 Pod 内容器查看是否安装有 ping、curl、telnet、tcpdump 等调试工具,可以看到相关命令都不存在
kubectl exec -it <pod_name> bash

  • 确定 Pod 所在 Node 节点
kubectl get po <pod_name> -owide

  • 登录到 Pod 所在 Node 节点
  • 在 Node 节点上操作,获取 Pod 内某个容器的 ID
crictl ps | grep <pod_name>

  • 根据容器 ID 获取容器 PID
crictl inspect <container_id> | grep -i pid

  • 进入容器网络命名空间,并验证
nsenter -t <pid> -n

  • 使用 Node 节点已安装的 ping、curl、telnet、tcpdump 等工具进行网络调试接口


三、nsenter 常用参数
-t <pid>:指定要进入的目标进程的 ID
-m:进入目标进程的文件系统命名空间
-u:进入目标进程的用户命名空间
-i:进入目标进程的 IPC 命名空间
-n:进入目标进程的网络命名空间
-p:进入目标进程的 PID 命名空间
--root=/path/to/root:指定容器根文件系统路径(仅在进入挂载命名空间时有效)
--wd=/path/to/workdir:指定工作目录=======================================================================
nsenter -hUsage:nsenter [options] [<program> [<argument>...]]Run a program with namespaces of other processes.Options:-a, --all              enter all namespaces-t, --target <pid>     target process to get namespaces from-m, --mount[=<file>]   enter mount namespace-u, --uts[=<file>]     enter UTS namespace (hostname etc)-i, --ipc[=<file>]     enter System V IPC namespace-n, --net[=<file>]     enter network namespace-p, --pid[=<file>]     enter pid namespace-C, --cgroup[=<file>]  enter cgroup namespace-U, --user[=<file>]    enter user namespace-S, --setuid <uid>     set uid in entered namespace-G, --setgid <gid>     set gid in entered namespace--preserve-credentials do not touch uids or gids-r, --root[=<dir>]     set the root directory-w, --wd[=<dir>]       set the working directory-F, --no-fork          do not fork before exec'ing <program>-Z, --follow-context   set SELinux context according to --target PID-h, --help             display this help-V, --version          display versionFor more details see nsenter(1).

http://www.lryc.cn/news/510594.html

相关文章:

  • CMake 构建项目并整理头文件和库文件
  • Boost之log日志使用
  • 多功能jquery图片预览放大镜插件
  • CSS系列(39)-- Shapes详解
  • AI 神经网络在智能家居场景中的应用
  • Rocky DEM tutorial7_Conical Dryer_锥形干燥器
  • CSS(二):美化网页元素
  • 平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题
  • 【论文笔记】Visual Alignment Pre-training for Sign Language Translation
  • NLP基础知识 - 向量化
  • JAVA学习笔记_MySQL进阶
  • ffmpeg: stream_loop报错 Error while filtering: Operation not permitted
  • Vue.use()和Vue.component()
  • javaweb 04 springmvc
  • [Visual studio] 性能探测器
  • 【漫话机器学习系列】017.大O算法(Big-O Notation)
  • IntelliJ IDEA中设置激活的profile
  • Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)
  • uniapp中实现APP调用本地通知栏通知、震动、本地提示音或者mp3提醒
  • ADB 上传文件并使用脚本监控上传百分比
  • 【数据库】PostgreSQL(持续更新)
  • overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案
  • pyqt5冻结+分页表
  • 一起学Git【第四节:添加和提交文件】
  • 【鸿蒙实战开发】HarmonyOS集成高德地图定位实现
  • ECharts散点图-气泡图,附视频讲解与代码下载
  • python操作Elasticsearch执行增删改查
  • 学习C++:关键字
  • FFmpeg在python里推流被处理过的视频流
  • 为什么推荐使用构造函数注入而非@Autowired注解进行字段注入