Kubernetes 集群分析查看内存,CPU (2)

格式化输出

[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 ...... 参考:

kubectl 命令技巧大全

记一次k8s环境java服务卡死的处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwygd.html