小哥之哥 小哥之哥
首页
    • Prometheus
    • Kubertenes
    • Docker
    • MySQL
  • Go
  • Python
  • Vue
  • Jenkins
  • ELK
  • LDAP
  • 随笔
  • 最佳实践
  • 博客搭建
  • 问题杂谈
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小哥之哥

运维扫地僧
首页
    • Prometheus
    • Kubertenes
    • Docker
    • MySQL
  • Go
  • Python
  • Vue
  • Jenkins
  • ELK
  • LDAP
  • 随笔
  • 最佳实践
  • 博客搭建
  • 问题杂谈
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Kubertenes

    • 安装部署

    • 技术杂谈

      • k8s-创建serviceAccount
      • k8s-serviceAccount最佳实践
      • k8s网络概述-容器网络
      • k8s网络概述-Service集群网络
      • k8s网络概述-pod抓包
        • k8s资源管理问题
      • 最佳实践

    • Prometheus

    • Docker

    • 数据库

    • 运维利器

    • 运维
    • Kubertenes
    • 技术杂谈
    tchua
    2023-06-26
    目录

    k8s网络概述-pod抓包

    # 一、概述


    说到抓包,我们首先想到的就是使用tcpdump对相关主机指定网络端口进行抓包的处理,随着k8s的普及应用,应用不在直接部署至宿主机,而是在pod之中,一个宿主机也会有很多的pod,这样我们如果直接指定宿主机网络端口,那么抓到的数据包,肯定会有其他应用pod的数据干扰,接下来,我们就探究下如何精确抓取pod的数据包。

    # 二、物料准备


    k8s集群: v1.26.2

    容器运行时: containerd 1.6.18

    抓取pod: dev命名空间下pod名称为nginx的pod数据包

    工具: tcpdump、jq、nsenter

    # 三、开始抓包


    # 3.1 获取pod 所在宿主机
    [root@k8s-master01 ~]# kubectl get pods -n dev  nginx -owide
    NAME    READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          10d   172.41.2.141   k8s-node01   <none>           <none>
    
    1
    2
    3
    # 3.2 安装抓包辅助工具

    通过上一步我们可以看到该nginx调度在k8s-node01节点,我们登录该节点

    [root@k8s-node01 ~]# yum -y install jq
    
    1
    # 3.3 获取应用进程pid

    注意: 这里grep nginx指的是pod名称,这里获取到的pid为29691

    [root@k8s-node01 ~]# crictl inspect $(crictl ps | grep `crictl pods | grep nginx | awk '{print $1}'` | awk '{print $1}') | jq .info.pid
    29691
    
    1
    2

    注意

    如果我们的k8s集群中运行时还是Docker,那么获取容器应用进程的pid则可以使用以下方式:

    # 登录pod所对应宿主机,找到容器id
    docker ps| grep nginx
    # 通过容器id 查找到容器对应的进程pid
    docker inspect -f {{.State.Pid}} 容器id
    
    1
    2
    3
    4
    # 3.4 安装nsenter

    nsenter 是一个命令行工具,用于进入已存在的命名空间(namespace)。命名空间是 Linux 内核提供的一种机制,用于隔离和管理不同进程的资源。通过进入一个特定的命名空间,可以在该命名空间的上下文中执行命令,观察和操作命名空间中的资源。

    [root@k8s-node01 ~]# yum -y install util-linux.x86_64
    
    1
    # 3.5 抓包

    eth0 指的是pod中的网卡名称,并不是宿主机的

    # 进入到容器的网络名称空间
    [root@k8s-node01 ~]# nsenter --target 29691 -n
    # 抓包
    [root@k8s-node01 ~]# tcpdump -i eth0 -s 0 -w /tmp/dev-nginx.pcap
    
    1
    2
    3
    4

    image-20230626101227442

    总结

    我们抓包之后,可以把数据包下载到本地,然后通过Wireshark进行数据包的分析。上面只是其中的一种模式,当然我们也可以直接进入容器中,安装相关的抓包命令,然后进行数据包的抓取,不过由于pod的生命周期性质,每次有问题都需要进入容器安装工具,也不方便,所以我个人觉得还是使用这种模式,直接在宿主机进行抓包,这样对容器也是没有任何侵入。

    img

    编辑 (opens new window)
    #k8s
    上次更新: 2024/01/02, 18:20:30
    k8s网络概述-Service集群网络
    k8s资源管理问题

    ← k8s网络概述-Service集群网络 k8s资源管理问题→

    最近更新
    01
    cert-manager自动签发Lets Encrypt
    09-05
    02
    Docker构建多架构镜像
    08-02
    03
    Prometheus数据迁移至VMstorage
    08-01
    更多文章>
    Theme by Vdoing | Copyright © 2023-2024 |豫ICP备2021026650号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式