一款强大的 Kubernetes API 流量查看神器
作者 | 小碗湯
來源 |?我的小碗湯
mizu 是為 Kubernetes 提供的一個簡單而強大的 API 流量查看器,可以查看微服務之間的所有 API 通信,以幫助調試和排除故障。相當于 Kubernetes 的 TCPDump 和 Wireshark。
簡單而強大的 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為獨立的Pod,mizu-tapper-daemon-set為Daemonset 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>??????????8m19sMizu 將存儲高達 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 有豐富的過濾語法,可以靈活有效地查詢結果。語法可在界面上查看:
選擇指定命名空間,將顯示所選命名空間的流量:
過濾出 Kafka 協議:
過濾來源為ingress-nginx-controller的:
卸載
永久安裝后,可以通過以下方式卸載:
#?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/
往期推薦
Spring 完美導入 IDEA
k8s集群居然可以圖形化安裝了?
使用這個庫,讓你的服務操作 Redis 速度飛起
將 k8s 制作成 3D 射擊游戲,好玩到停不下來
點分享
點收藏
點點贊
點在看
總結
以上是生活随笔為你收集整理的一款强大的 Kubernetes API 流量查看神器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “低代码”将干掉 70% 的软件开发工作
- 下一篇: 亚信安全发布2021年挖矿病毒专题报告,