Kubernetes方式
top命令查看所有pod,nodes中內存,CPU使用情況
查看pod
root @ master ➜ ~ kubectl top pod -n irm-server
NAME CPU(cores) MEMORY(bytes)
test-ecd-server-56b77d9fbb-zfctt 1m 1529Mi
test-flow-server-b477756f-2s5bc 1m 3006Mi
test-huishi-api-86dcfdb7c5-jtcpt 0m 1829Mi
test-huishi-message-5d4b456b88-n8xl5 241m 344Mi
test-huishi-schedule-bc5f5d4d5-z22gq 3m 510Mi
test-huishi-server-6f875487d7-9rzpd 44m 1483Mi
test-irm-bd9444948-rwtgn 1m 1270Mi
test-irm-task-89f65f5bd-zht2x 0m 1282Mi
test-order-server-5fcc5575bd-67c4r 32m 1066Mi
test-payment-6df4459864-5d8xl 1m 634Mi
test-urule-54f4b8f84f-l5xbm 1m 2382Mi
查看具體某一個pod
root @ master ➜ ~ kubectl top pod test-huishi-server-6f875487d7-9rzpd -n irm-server
NAME CPU(cores) MEMORY(bytes)
test-huishi-server-6f875487d7-9rzpd 36m 1489Mi
查看nodes
root @ master ➜ ~ kubectl top nodes -n irm-server
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 225m 9% 2853Mi 25%
node1 219m 3% 18990Mi 65%
node11 61m 6% 4236Mi 31%
node12 2344m 36% 27839Mi 101%
node2 76m 7% 7950Mi 59%
node4 106m 10% 8151Mi 61%
node5 123m 12% 4877Mi 92%
node6 129m 12% 5614Mi 42%
node7 58m 5% 3738Mi 28%
node8 132m 6% 9098Mi 57%
node9 60m 6% 3017Mi 22%
查看具體某一個node
root @ master ➜ ~ kubectl top nodes node1 -n irm-server
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node1 222m 3% 19009Mi 65%
上面使用nodes,node都可以
進入容器pod內部查看
root @ master ➜ ~ kubectl exec test-huishi-server-6f875487d7-9rzpd -it sh -n irm-server
/home # jps 1
sh: jps: not found
/home # jstack 1
sh: jstack: not found
/home # exit
command terminated with exit code 127
docker容器內部沒有jstack
命令
Docker方式
找到具體pod所在的節點,進入使用docker命令查看具體的信息
docker top命令查看
[root@node1 ~]# docker ps -a |grep huishi-server
73c1189ddd0e 18.16.200.191:5000/test/huishi-server "/bin/sh -c 'java $J…" 20 hours ago Up 20 hours k8s_test-huishi-server_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0
ed1a36493259 gcr.io/google_containers/pause-amd64:3.0 "/pause" 20 hours ago Up 20 hours k8s_POD_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0
[root@node1 ~]# docker top 73c1189ddd0e
UID PID PPID C STIME TTY TIME CMD
root 3439 3416 0 Dec18 ? 00:11:41 java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -Xms1024M -Duser.timezone=GMT+08 -Dfile.encoding=UTF-8 -javaagent:/data/jacocoagent.jar=includes=*,output=file,append=true,destfile=/data/log/huishi-server/jacoco.exec -jar /home/huishi-server.jar
docker stats 命令查看
docker stats 命令用來返回運行中的容器的實時數據流,
默認情況下,stats 使用參數-a或者--all,命令會每隔 1 秒鍾刷新一次輸出的內容直到你按下 ctrl + c。
[root@node1 ~]# docker stats -a
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1ad181f01c76 k8s_POD_test-capital-schedule-6468f8774f-2s6dd_common-server_78d133b9-21f7-11ea-932e-525400506c6a_0 0.00% 1.766MiB / 30.89GiB 0.01% 0B / 0B 0B / 0B 1
73c1189ddd0e k8s_test-huishi-server_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0 0.04% 1.178GiB / 2GiB 58.88% 0B / 0B 0B / 254kB 68
ed1a36493259 k8s_POD_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0 0.00% 1.25MiB / 30.89GiB 0.00% 0B / 0B 0B / 0B 1
05c08624b3d7 k8s_POD_test-p2p-bms-7db78b7c46-9vvnt_common-server_759c4604-1c7e-11ea-932e-525400506c6a_0 0.00% 1.543MiB / 30.89GiB 0.00% 0B / 0B 0B / 0B 1
9013e1d0a243 k8s_POD_test-institution-6569774458-t8sk9_institution-server_f35e22c0-1a2e-11ea-932e-525400506c6a_0 0.00% 1.578MiB / 30.89GiB 0.00% 0B / 0B 0B / 0B 1
輸出內容:
[CONTAINER]:以短格式顯示容器的 ID。
[CPU %]:CPU 的使用情況。
[MEM USAGE / LIMIT]:當前使用的內存和最大可以使用的內存。
[MEM %]:以百分比的形式顯示內存使用情況。
[NET I/O]:網絡 I/O 數據。
[BLOCK I/O]:磁盤 I/O 數據。
[PIDS]:PID 號。
如果不想持續的監控容器使用資源的情況,可以通過 --no-stream 選項只輸出當前的狀態:
[root@node1 ~]# docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1ad181f01c76 k8s_POD_test-capital-schedule-6468f8774f-2s6dd_common-server_78d133b9-21f7-11ea-932e-525400506c6a_0 0.00% 1.766MiB / 30.89GiB 0.01% 0B / 0B 0B / 0B 1
73c1189ddd0e k8s_test-huishi-server_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0 1.72% 1.178GiB / 2GiB 58.89% 0B / 0B 0B / 254kB 68
ed1a36493259 k8s_POD_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0 0.00% 1.25MiB / 30.89GiB 0.00% 0B / 0B 0B / 0B 1
05c08624b3d7 k8s_POD_test-p2p-bms-7db78b7c46-9vvnt_common-server_759c4604-1c7e-11ea-932e-525400506c6a_0 0.00% 1.543MiB / 30.89GiB 0.00% 0B / 0B 0B / 0B 1
9013e1d0a243 k8s_POD_test-institution-6569774458-t8sk9_institution-server_f35e22c0-1a2e-11ea-932e-525400506c6a_0 0.00% 1.578MiB / 30.89GiB 0.00% 0B / 0B 0B / 0B 1
366e27c0265f k8s_debug-agent_debug-agent-h88sf_kube-system_263ac99f-133f-11ea-932e-525400506c6a_0 0.00% 10.3MiB / 30.89GiB 0.03% 0B / 0B 0B / 0B 14
格式化輸出
[root@node1 ~]# docker stats --no-stream --format "table {{.Container}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
CONTAINER NAME CPU % MEM USAGE / LIMIT
1ad181f01c76 k8s_POD_test-capital-schedule-6468f8774f-2s6dd_common-server_78d133b9-21f7-11ea-932e-525400506c6a_0 0.00% 1.766MiB / 30.89GiB
73c1189ddd0e k8s_test-huishi-server_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0 0.32% 1.178GiB / 2GiB
ed1a36493259 k8s_POD_test-huishi-server-7f4f5c5f8c-kqzrw_irm-server_2bc27a95-216a-11ea-932e-525400506c6a_0 0.00% 1.25MiB / 30.89GiB
05c08624b3d7 k8s_POD_test-p2p-bms-7db78b7c46-9vvnt_common-server_759c4604-1c7e-11ea-932e-525400506c6a_0 0.00% 1.543MiB / 30.89GiB
9013e1d0a243 k8s_POD_test-institution-6569774458-t8sk9_institution-server_f35e22c0-1a2e-11ea-932e-525400506c6a_0 0.00% 1.578MiB / 30.89GiB
366e27c0265f k8s_debug-agent_debug-agent-h88sf_kube-system_263ac99f-133f-11ea-932e-525400506c6a_0 0.05% 10.3MiB / 30.89GiB
上面的命令中我們只輸出了 Name, CPUPerc 和 Memusage 三列。
下面是自定義的格式中可以使用的所有占位符:
.Container 根據用戶指定的名稱顯示容器的名稱或 ID。
.Name 容器名稱。
.ID 容器 ID。
.CPUPerc CPU 使用率。
.MemUsage 內存使用量。
.NetIO 網絡 I/O。
.BlockIO 磁盤 I/O。
.MemPerc 內存使用率。
.PIDs PID 號。
有了這些信息我們就可以完全按照自己的需求或者是偏好來控制 docker stats 命令輸出的內容了。
JSON格式輸出
docker stats --no-stream --format \
"{\"container\":\"{{ .Container }}\",\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"cpu\":\"{{ .CPUPerc }}\"}"
{"container":"1ad181f01c76","memory":{"raw":"1.766MiB / 30.89GiB","percent":"0.01%"},"cpu":"0.00%"}
{"container":"73c1189ddd0e","memory":{"raw":"1.178GiB / 2GiB","percent":"58.90%"},"cpu":"0.33%"}
{"container":"ed1a36493259","memory":{"raw":"1.25MiB / 30.89GiB","percent":"0.00%"},"cpu":"0.00%"}
{"container":"05c08624b3d7","memory":{"raw":"1.543MiB / 30.89GiB","percent":"0.00%"},"cpu":"0.00%"}
{"container":"9013e1d0a243","memory":{"raw":"1.578MiB / 30.89GiB","percent":"0.00%"},"cpu":"0.00%"}
{"container":"366e27c0265f","memory":{"raw":"10.3MiB / 30.89GiB","percent":"0.03%"},"cpu":"0.00%"}
{"container":"9f206bab70fd","memory":{"raw":"1.465MiB / 30.89GiB","percent":"0.00%"},"cpu":"0.00%"}
{"container":"7a34c4cb664f","memory":{"raw":"1.555MiB / 30.89GiB","percent":"0.00%"},"cpu":"0.00%"}
容器內部查看分析
進入到容器:
[root@node1 ~]# docker exec -it 1218a5d5022d sh
/home # cd /
/ # find . -name "jdk*"
^C
/ # find . -name "*jdk*"
^C
/ # find . -name "*jre*"
./opt/jre
./opt/jre1.8.0_231
進入到docker容器,發現並沒有jdk,只有jre
docker cp遷移jdk到容器
[root@node1 java]# docker cp jdk1.8.0_91 1218a5d5022d:/usr/local
[root@node1 java]# docker exec -it 1218a5d5022d sh
/home # cd /usr/local
/usr/local # ls
bin jdk1.8.0_91 lib share
/usr/local # jps
sh: jps: not found
命令不能使用
設置PATH環境變量
[root@node1 bin]# export PATH="$PATH:/usr/java/jdk1.8.0_91/bin"
[root@node1 bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/java/jdk1.8.0_91/bin
再次執行命令:
[root@node1 bin]# jps
-bash: /usr/java/jdk1.8.0_91/bin/jps: Permission denied
發現沒有權限。
這其實不是什么 Bug,而是 Docker 自 1.10 版本開始加入的安全特性。
類似於 jmap
這些 JDK 工具依賴於 Linux 的 PTRACE_ATTACH,而是 Docker 自 1.10 在默認的 seccomp 配置文件中禁用了 ptrace。
釋放docker容器ptrace權限
在docker run 命令中加上參數--cap-add=SYS_PTRACE
docker run --cap-add=SYS_PTRACE ......