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

  • 简单而强大的 CLI
  • 丰富的过滤规则
  • API 调用实时监控网络流量视图,支持的协议:
    • HTTP/1.1(REST 等)、HTTP/2(gRPC)
    • AMQP(RabbitMQ、Apache Qpid 等)
    • Kafka
    • Redis

      安装前准备

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

      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

  1. 但在国内会拉取失败,已经将用到的镜像上传到阿里云仓库和 dockerhub 仓库,需要可自行拉取:
  2. ```bash
  3. # 阿里云仓库
  4. registry.cn-hangzhou.aliyuncs.com/smallsoup/up9inc-basenine:v0.3.0
  5. # dockerhub 仓库
  6. smallsoup/up9inc-basenine:v0.3.0
  7. registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-develop:0.22.21
  8. smallsoup/mizu-develop:0.22.21
  9. registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-main:0.22.0
  10. smallsoup/mizu-main:0.22.0
  11. registry.cn-hangzhou.aliyuncs.com/smallsoup/mizu-kratos-stable:0.0.0
  12. smallsoup/mizu-kratos-stable:0.0.0

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

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

安装可执行文件

Mizu可以在GitHub 仓库下载。
下面示例在 MacOS 上安装 mizu 二进制,k8s 版本为 1.18.14。

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

生成配置

mizu CLI 使用--set config-path=<PATH>提供的配置文件。如果未提供,将使用${HOME}/.mizu/config.yaml
可以使用 CLI 参数覆盖默认值,获取默认配置参数可以运行mizu config
使用config -r生成默认值配置文件:

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

自定义配置

编辑~/.mizu/config.yaml

  1. tap:
  2. upload-interval: 10
  3. regex: .*
  4. gui-port: 8899
  5. proxy-host: 0.0.0.0
  6. namespaces: []
  7. analysis: false
  8. all-namespaces: false
  9. regex-masking: []
  10. ignored-user-agents: []
  11. no-redact: false
  12. max-entries-db-size: 200MB
  13. dry-run: false
  14. workspace: ""
  15. traffic-validation-file: ""
  16. contract: ""
  17. ask-upload-confirmation: true
  18. api-server-resources:
  19. cpu-limit: 750m
  20. memory-limit: 1Gi
  21. cpu-requests: 50m
  22. memory-requests: 50Mi
  23. tapper-resources:
  24. cpu-limit: 750m
  25. memory-limit: 1Gi
  26. cpu-requests: 50m
  27. memory-requests: 50Mi
  28. service-mesh: false
  29. version:
  30. debug: false
  31. view:
  32. gui-port: 8899
  33. logs:
  34. file: ""
  35. auth:
  36. env-name: up9.app
  37. token: ""
  38. image-pull-policy: IfNotPresent
  39. mizu-resources-namespace: mizu
  40. telemetry: true
  41. dump-logs: false
  42. kube-config-path: ""
  43. headless: false

修改的参数说明:
将配置文件中的image-pull-policy: Always改为 IfNotPresent 因为 mizu 运行时创建的 pod 使用的镜像在国内网络环境下无法正常拉取。
默认运行 mizu 需要通过本地主机访问http://localhost:8899:

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

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

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

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

临时安装

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

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

成功后,会自动打开浏览器,访问http://localhost:8899/。
这种方式安装的mizu apiserver为独立的Pod,mizu-tapper-daemon-set为Daemonset Pod。

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

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

永久安装

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

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

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

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

同时会创建 pvc 用于存储流量数据,所以集群中需要提前有storageClass
在 k8s 集群某一节点执行port-forward,将主机 8080 端口映射到 svc 的 80 端口:

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

此时用主机IP:8080访问即可:
一款强大的Kubernetes API流量查看神器 - 图2

体验使用

Mizu 有丰富的过滤语法,可以灵活有效地查询结果。语法可在界面上查看:一款强大的Kubernetes API流量查看神器 - 图3
选择指定命名空间,将显示所选命名空间的流量:
一款强大的Kubernetes API流量查看神器 - 图4
过滤出 Kafka 协议:
一款强大的Kubernetes API流量查看神器 - 图5
过滤来源为ingress-nginx-controller的:
一款强大的Kubernetes API流量查看神器 - 图6

卸载

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

  1. # mizu clean
  2. Removing mizu resources

遇到的坑

域名后缀问题

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

  1. [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,连接地址是在启动参数中指定的。

  1. --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 中一个容器的镜像可以修改:

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

其他镜像都是写死在代码中的。
以上两点的不可配置,会给使用者带来很大的不便。

参考资料

Mizu: https://github.com/up9inc/mizu
GitHub 仓库: https://github.com/up9inc/mizu
k8s 流量查看器: https://up9.com/traffic-viewer-kubernetes
mizu 高级用法: https://github.com/up9inc/mizu#advanced-usage