一款强大的 Kubernetes API 流量查看神器

3811bc6b07f73885a0549ed93f5fb7cf.gif

作者 | 小碗汤

来源 | 我的小碗汤

mizu 是为 Kubernetes 提供的一个简单而强大的 API 流量查看器,可以查看微服务之间的所有 API 通信,以帮助调试和排除故障。相当于 Kubernetes 的 TCPDump 和 Wireshark。

25fdf567f30797cb0fcabf229e3091d9.png

  • 简单而强大的 CLI

  • 丰富的过滤规则

  • API 调用实时监控网络流量视图,支持的协议:

    • HTTP/1.1(REST 等)、HTTP/2(gRPC)

    • AMQP(RabbitMQ、Apache Qpid 等)

    • Kafka

    • Redis

安装前准备

mizu 组件会用到以下四个镜像:

# Linux上执行mizu tap安装时,mizu-apiserver用到
ghcr.io/up9inc/basenine:v0.3.0# Linux上执行mizu tap安装时,mizu-apiserver用到
gcr.io/up9-docker-hub/mizu/develop:0.22.21# mac上执行mizu tap安装时,mizu-apiserver用到
gcr.io/up9-docker-hub/mizu/main:0.22.0# mizu install安装mizu-apiserver用到
gcr.io/up9-docker-hub/mizu-kratos/stable:0.0.0

但在国内会拉取失败,我已经将用到的镜像上传到阿里云仓库和 dockerhub 仓库,需要可自行拉取:

# 阿里云仓库
registry.cn-hangzhou.aliyuncs.com/smallsoup/up9inc-basenine:v0.3.0
# dockerhub 仓库
smallsoup/up9inc-basenine:v0.3.0registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-develop:0.22.21
smallsoup/mizu-develop:0.22.21registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-main:0.22.0
smallsoup/mizu-main:0.22.0registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-kratos-stable:0.0.0
smallsoup/mizu-kratos-stable:0.0.0

由于有些镜像名称是 mizu 源码中写死的不可配置(除了 agent-name),所以拉下来后需要修改 tag 后使用:

docker tag registry.cn-hangzhou.aliyuncs.com/smallsoup/up9inc-basenine:v0.3.0 ghcr.io/up9inc/basenine:v0.3.0docker tag registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-develop:0.22.21 gcr.io/up9-docker-hub/mizu/develop:0.22.21docker tag registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-kratos-stable:0.0.0 gcr.io/up9-docker-hub/mizu-kratos/stable:0.0.0docker tag registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-main:0.22.0 gcr.io/up9-docker-hub/mizu/main:0.22.0

安装可执行文件

Mizu[1]可以在GitHub 仓库[2]下载。

下面示例在 MacOS 上安装 mizu 二进制,k8s 版本为 1.18.14。

curl -Lo mizu \
https://github.com/up9inc/mizu/releases/latest/download/mizu_darwin_amd64 \
&& chmod 755 mizu
mv mizu /usr/local/bin

生成配置

mizu CLI 使用--set config-path=<PATH>提供的配置文件。如果未提供,将使用${HOME}/.mizu/config.yaml

可以使用 CLI 参数覆盖默认值,获取默认配置参数可以运行mizu config

使用config -r生成默认值配置文件:

# mizu config -r
Template File written to /Users/smallsoup/.mizu/config.yaml

自定义配置

编辑~/.mizu/config.yaml

tap:upload-interval: 10regex: .*gui-port: 8899proxy-host: 0.0.0.0namespaces: []analysis: falseall-namespaces: falseregex-masking: []ignored-user-agents: []no-redact: falsemax-entries-db-size: 200MBdry-run: falseworkspace: ""traffic-validation-file: ""contract: ""ask-upload-confirmation: trueapi-server-resources:cpu-limit: 750mmemory-limit: 1Gicpu-requests: 50mmemory-requests: 50Mitapper-resources:cpu-limit: 750mmemory-limit: 1Gicpu-requests: 50mmemory-requests: 50Miservice-mesh: false
version:debug: false
view:gui-port: 8899
logs:file: ""
auth:env-name: up9.apptoken: ""
image-pull-policy: IfNotPresent
mizu-resources-namespace: mizu
telemetry: true
dump-logs: false
kube-config-path: ""
headless: false

修改的参数说明:

将配置文件中的image-pull-policy: Always改为 IfNotPresent 因为 mizu 运行时创建的 pod 使用的镜像在国内网络环境下无法正常拉取。

默认运行 mizu 需要通过本地主机访问http://localhost:8899

# lsof -nP -iTCP -sTCP:LISTEN | grep mizu
mizu      59951 smallsoup   39u  IPv4 0xade0daed4de692db      0t0  TCP 127.0.0.1:8899 (LISTEN)

可以将tap.proxy-host更改为0.0.0.0,通过主机 IP 地址访问。

lsof -nP -iTCP -sTCP:LISTEN | grep mizu
mizu      60008 smallsoup   38u  IPv6 0xade0daed5a54616b      0t0  TCP *:8899 (LISTEN)

mizu 默认使用${HOME}/.kube/config中的配置。可以使用KUBECONFIG环境变量或--set kube-config-path=<PATH>修改。我在这里使用默认的配置。

临时安装

即使用mizu tap启动,会在 kubernetes 集群创建资源,在命令终止时会自行清理资源,一般用于本地调试阶段。

mizu tap
Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached.
Tapping pods in namespaces "default"
+chart-1642261340-waypoint-runner-d54b5bc5c-x7w5w
+chart-1642261340-waypoint-server-0
+example-nodejs-v1-dbffc74f6-6prt4
+example-nodejs-waypoint-nodejs-8764766d8-5xfjf
+netchecker-agent-8fs2m
+netchecker-agent-hostnet-vknsm
+netchecker-server-59fcd6bf86-5mtkn
Waiting for Mizu Agent to start...
Mizu is available at http://localhost:8899

成功后,会自动打开浏览器,访问http://localhost:8899/

这种方式安装的mizu apiserver为独立的Podmizu-tapper-daemon-setDaemonset Pod

# k get pod -n mizu
NAME                           READY   STATUS    RESTARTS   AGE
mizu-api-server                2/2     Running   0          2m21s
mizu-tapper-daemon-set-hb555   1/1     Running   0          23s# k get ds -n mizu
NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
mizu-tapper-daemon-set   1         1         1       1            1           <none>          8m19s

Mizu 将存储高达 200MB 的流量数据,一旦达到限制,旧的数据将被清除。这里没有 pvc 的创建,所以保存的流量数据会随着 Pod 被删除。

永久安装

可以使用命令mizu install将 mizu 实例永久的安装在集群中:

# mizu install --config-path /root/.mizu/config.yaml
namespace/mizu created
configmap/mizu-config created
serviceaccount/mizu-service-account created
clusterrole.rbac.authorization.k8s.io/mizu-cluster-role created
clusterrolebinding.rbac.authorization.k8s.io/mizu-cluster-role-binding created
role.rbac.authorization.k8s.io/mizu-role-daemon created
rolebinding.rbac.authorization.k8s.io/mizu-role-binding-daemon created
deployment.apps/mizu-api-server created
service/mizu-api-server created
Waiting for Mizu server to start...
mizu-api-server-59fbb5fc55-5krjb pod is running
Installation completed, run `mizu view` to connect to the mizu daemon instance

这种方式安装的 mizu apiserver 为 1 副本的Deployment以及mizu-tapper-daemon-set Pod

# kubectl  get deploy -n mizu
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
mizu-api-server   1/1     1            1           5m34s# kubectl  get ds -n mizu
NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
mizu-tapper-daemon-set   1         1         1       1            1           <none>          3m10s# kubectl  get pvc -n mizu
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mizu-volume-claim   Bound    pvc-81b8ebb6-2a72-4bc3-915d-79c943e6dfbb   700M       RWO            nfs-client     10m

同时会创建 pvc 用于存储流量数据,所以集群中需要提前有storageClass

在 k8s 集群某一节点执行port-forward,将主机 8080 端口映射到 svc 的 80 端口:

# kubectl  port-forward --address 0.0.0.0 -n mizu  service/mizu-api-server  8080:80
Forwarding from 0.0.0.0:8080 -> 8899

此时用主机IP:8080访问即可。

体验使用

Mizu 有丰富的过滤语法,可以灵活有效地查询结果。语法可在界面上查看:

747db18a47e56c07b1b04c125eb025c7.png

选择指定命名空间,将显示所选命名空间的流量:

37ea06d67bcd3d6da7da2fb1618a2b84.png

过滤出 Kafka 协议:

972fc64887ec3df656ebd6536aec234d.png

过滤来源为ingress-nginx-controller的:

64739a86efb85c2a106aefdb79440911.png

卸载

永久安装后,可以通过以下方式卸载:

# mizu  clean
Removing mizu resources

遇到的坑

域名后缀问题

mizu-tapper Daemonset Pod一直重建,查看日志发现,报错如下:

[2022-01-23T05:33:19.455+0000] INFO  ▶ socket connection to ws://mizu-api-server.mizu.svc.cluster.local/wsTapper failed: dial tcp: lookup mizu-api-server.mizu.svc.cluster.local: no such host, retrying 5 out of 30 in 2 seconds... ▶ [1 main.go:422 dialSocketWithRetry]

daemonset Pod需要连接mizu apiserver,连接地址是在启动参数中指定的。

--api-server-address ws://mizu-api-server.mizu.svc.cluster.local/wsTapper

默认使用的域名后缀为cluster.local,如果你修改过 k8s 集群的clusterDomain,则需要修改这里的值。不幸的是,这个cluster.local是写死在代码中的,需要安装之后手动edit daemonset修改。

镜像问题

mizu 组件使用到的镜像,只有mizu-api-server Pod 中一个容器的镜像可以修改:

agent-image: registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-develop:0.22.21

其他镜像都是写死在代码中的。

以上两点的不可配置,会给使用者带来很大的不便。

参考资料

[1]Mizu: https://github.com/up9inc/mizu
[2]GitHub 仓库: https://github.com/up9inc/mizu
[3]k8s 流量查看器: https://up9.com/traffic-viewer-kubernetes
[4]mizu 高级用法: https://github.com/up9inc/mizu#advanced-usage
[5]K8s的API流量查看器安装: https://www.lishuai.fun/2021/09/28/k8s-mizu/

273222c0d6afbff746045b16f457e204.gif

往期推荐

Spring 完美导入 IDEA

k8s集群居然可以图形化安装了?

使用这个库,让你的服务操作 Redis 速度飞起

将 k8s 制作成 3D 射击游戏,好玩到停不下来

4dca7477dac8d7db6c240a64efea1c21.gif

点分享

948a5af7b12939ed4dfb6e2cb1198fa8.gif

点收藏

e32b891f8e855191ac1a8b96fbca2349.gif

点点赞

7e5edca1b675118989c26dbf926202e9.gif

点在看

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

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

相关文章

用python画螺旋圈_利用Python绘制一个正方形螺旋线

1 安装turtlePython2安装命令&#xff1a;pip install turtulePython3安装命令&#xff1a;pip3 install turtle因为turtle库主要是在Python2中使用的&#xff0c;所以安装的时候可能会提示错误&#xff1a;Command "python setup.py egg_info" failed with error co…

Redis 巧用数据类型实现亿级数据统计

作者 | 码哥字节来源 | 码哥字节在移动应用的业务场景中&#xff0c;我们需要保存这样的信息&#xff1a;一个 key 关联了一个数据集合&#xff0c;同时还要对集合中的数据进行统计排序。常见的场景如下&#xff1a;给一个 userId &#xff0c;判断用户登陆状态&#xff1b;两亿…

2021杭州·云栖大会来了!门票免费预约!

2021杭州云栖大会&#xff0c;定了&#xff01; 10月19日-22日&#xff0c;就在杭州云栖小镇 2场重磅主论坛上百场分论坛 超4万平米科技展 今年&#xff0c;云栖大会将首次免费开放 门票可在官网免费预约 入口现已开启 戳此预约&#xff0c;我们不见不散&#xff01; ​ …

js 可以做什么东西_Deno需要做什么才能取代Node.js?

全文共1843字&#xff0c;预计学习时长5分钟Deno是一个Javascript/TypeScript的运行时&#xff0c;旨在取代Node.js的地位。它拥有广泛功能&#xff0c;讨论度非常高&#xff0c;在Github上有将近68000个星星&#xff1a;既然这么受欢迎&#xff0c;那么有人要问了&#xff1a;…

37 手游基于 Flink CDC + Hudi 湖仓一体方案实践

简介&#xff1a; 介绍了 37 手游为何选择 Flink 作为计算引擎&#xff0c;并如何基于 Flink CDC Hudi 构建新的湖仓一体方案。 本文作者是 37 手游大数据开发徐润柏&#xff0c;介绍了 37 手游为何选择 Flink 作为计算引擎&#xff0c;并如何基于 Flink CDC Hudi 构建新的湖…

手把手搭建一个容器化+代理网关+可视化管理环境

作者 | togettoyou来源 | SuperGopher前言本文主要分享个人服务器的应用部署方案现状&#xff0c;容器化代理网关可视化管理。准备阶段我购买的是腾讯云服务器&#xff08;2 核 4GB 3Mbps&#xff09;域名也是在腾讯云备案过的&#xff0c;提前准备域名解析配置环境安装 Docker…

漫画 | 一口气搞懂 Serverless !

简介&#xff1a; 第二届云原生编程挑战赛为热爱技术的年轻人提供一个挑战世界级技术问题的舞台&#xff0c;希望用技术为全社会创造更大价值。 作者 | 刘欣 呃&#xff0c;我可能是别人眼中所说的不用奋斗的一代。 大家喜欢听的什么多姿多彩的生活&#xff0c;我都经历过一…

python蒙特卡洛算法求积分_python中实现蒙特卡洛算法

蒙特卡洛算法&#xff0c;是一种以概率统计理论为指导的一类非常的数值计算方法&#xff0c;是指使用随机数来解决很多计算问题的方法。应用一&#xff1a;用蒙特卡洛算法求解圆周率思路&#xff1a;在直角座标系中选取x[-1,1],y[-1,1]的正方形区域&#xff0c;其内接圆是以原点…

OpenKruise v0.10.0 新特性 WorkloadSpread 解读

简介&#xff1a; 针对需求&#xff0c;OpenKruise 在 v0.10.0 版本中新增了 WorkloadSpread 特性。目前它支持配合 Deployment、ReplicaSet、CloneSet 这些 workload&#xff0c;来管理它们下属 Pod 的分区部署与弹性伸缩。下文会深入介绍 WorkloadSpread 的应用场景和实现原理…

CSS 状态管理,玩出花样了!

作者 | 零一来源 | 前端印象CSS用于交互的方式无非就那么几种&#xff1a;伪类&#xff1a;:hover、:link、:active ...动画&#xff1a;animation过渡动画&#xff1a;transition这些交互方式组合起来&#xff0c;真的可以玩出一些花样&#xff0c;例如我们本文的主题&#xf…

custom的短语_custom是什么意思中文翻译

音标&#xff1a;英[ˈkʌstəm]美[ˈkʌstəm]n.习惯&#xff0c;惯例&#xff1b;海关&#xff0c;关税&#xff1b;经常光顾&#xff1b;[总称](经常性的)顾客adj.(衣服等)定做的&#xff0c;定制的网络自定义&#xff1b;习惯&#xff1b;风俗&#xff1b;习俗英英释义noun…

告别Kafka Stream,让轻量级流处理更加简单

简介&#xff1a; 还在花精力去选型Kafka组件去做清洗转化&#xff1f;来试试Kafka ETL任务功能&#xff01; 一说到数据孤岛&#xff0c;所有技术人都不陌生。在 IT 发展过程中&#xff0c;企业不可避免地搭建了各种业务系统&#xff0c;这些系统独立运行且所产生的数据彼此独…

元宇宙“性骚扰”现象频出,Meta推出“个人结界”能保护好女玩家吗?

作者 | 小码君来源 | 抓码青年元宇宙&#xff0c;可以说是最近最炙手可热的概念了。各大厂纷纷入局元宇宙&#xff0c;Faceebook甚至将总公司名字都改名为Meta。不过盯上元宇宙的可不止资本大鳄&#xff0c;还有一些不怀好意的色狼。据外媒报道称&#xff0c;在Meta的Oculus设备…

【CDS技术揭秘系列 01】阿里云CDS-OSS容灾大揭秘

简介&#xff1a; 本文主要阐述 CDS 产品中 OSS 服务在容灾方面的部署形态以及实现的其本原理。 容灾功能可以保证用户一份数据在多个地方存在冗余备份&#xff0c;当某个机房出现极端异常&#xff08;比如物理损毁&#xff09;情况下&#xff0c;数据也不会出现丢失&#xff1…

如何促合作共赢?技术人的一点经验分享

简介&#xff1a; 本文作者将通过与詹韦团队一起合作的《树懒平台》&#xff0c;分享在工作过程中&#xff0c;我们什么情况下会有合作诉求&#xff1f;有了合作诉求之后&#xff0c;如何寻找对的人&#xff1f;锁定候选人之后&#xff0c;如何打动对方促成合作&#xff1f;合作…

caputo分数阶导数程序_caputo分数阶导数

Caputo 分数阶微分算子合成性质的推广① 秦彤晖, 张笛 【摘要】摘要: 运用微积分学的基本方法,得到了 Riemann-Liouville 分数 阶积分算子和 Caputo 分数阶微分算子......而且对于分数阶序列导数的微分方程的求解 是比较实用的.本文的目的在于展示微分变换方法不仅适用于Caputo…

不记得 Git 命令? 懒人版 Git 值得拥有!

作者 | Eason来源 | 程序员巴士Git的强大是所有开发者都心知肚明的事情&#xff0c;但是其多样的命令令人很是难受。不过在Github上有着这么一个开源项目lazygit[1]。Lazygit是由Jesseduffield开发并维护的项目&#xff0c;其代码托管在Github。通过使用Lazygit&#xff0c;我们…

Dubbo3.0|阿里巴巴服务框架三位一体的选择与实践

简介&#xff1a; 服务框架就像铁路的铁轨一样&#xff0c;是互通的基础&#xff0c;只有解决了服务框架的互通&#xff0c;才有可能完成更高层的业务互通&#xff0c;所以用相同的标准统一&#xff0c;合二为一并共建新一代的服务框架是必然趋势。Dubbo3.0 是 Dubbo2.0 与 HSF…

海康录像机能用别的摄像头吗_海康录像机怎么添加网络摄像头,你会了吗?

原标题&#xff1a;海康录像机怎么添加网络摄像头&#xff0c;你会了吗&#xff1f;1、录像机和摄像头通电连接好设备。2、在显示器画面右击鼠标点击主菜单。3、输入海康录像机密码登录设备。4、进入主菜单选择系统设置。5、在系统设置中点击网络配置&#xff0c;进入基本设置&…

全球首款乘云而来的存储产品CDS诞生!

9月22日&#xff0c;阿里云发布全球首款“云定义存储”&#xff08;Cloud Defined Storage&#xff0c;CDS&#xff09;产品。作为一款本地部署的分布式存储产品&#xff0c;阿里云CDS拥有与公共云存储相同的技术架构&#xff0c;让企业客户在本地也能部署和使用与公共云一致的…