linux日常运维手册_[日常分享] 全栈工程师的常用运维技能(Linux + Java )

最近涨了不少粉,大多数是来自于我的这个回答

前端写代码真的有必要封装太好么?​www.zhihu.com

新粉可能以为我是个前端工程师,其实我不是。

我是组里的全栈工程师(主前端方向),除了lead 前端项目的开发,前端项目的 CI/CD 也是我负责的;我有时也帮忙写一些API,改改后端bug(Java);轮班oncall的时候,我也需要帮忙处理一些线上的问题——大多数是些运维工作。

接下来介绍一些我常用的运维技能,希望对你们也有帮助,看不懂的读者也可以当做知识扩展 —— 文章末尾有我对“前端/后端工程师需不需要了解运维知识”的回答,有兴趣的可以直接去文章结尾看看。


以下我会使用举例场景的方式,分享我常用的运维技能。

相信大多数公司已经开始使用容器化技术了,最常见的是 Kubernetes + Docker 的组合,eBay也是如此。

场景一:前端网站打不开了,显示无法连接或者404,我打算去看看 apache / nginx 是否在正常运行。

在 kubernetes 的世界里,大多数应用都是部署在 pod 里,所以我会去找对应的 pod(s)

kubectl get pods -o wide | grep pod_name

kubectl get pods -o wide 会罗列出在当前的 namespace 和 cluster 下的所有 pods 的名字, 运行状态,ip 等等信息,如下截图

9cf330725ca44fbb69727f6171126b24.png

grep指令 相当于筛选了包含指定文本的行,主要是用来筛选 pod 名字

这种查找方式比较万金油,但是速度往往比较慢, 尤其是当pod总数量较多时。

如果是自己部署出来的pod,我会在 pod specification 里加上自定义的label,这样在查找pod的时候可以指定label,快速查到。

kubectl get pods -o wide -l my_label_name=my_label_value

-l 参数后跟上label名字和值就可以了

如果在这个层面看不出 pod 有什么异常,我们可能还需要进入 pod 内部查看情况。

kubectl exec -it pod_name bash

pod 内部通常就是个 Linux 环境,所以大多数 linux 指定都可以使用,如 ps, df, du 等等。

但是 top 指令显示的总cpu,内存等信息并不是 pod 自身的总cpu和内存,参考 https://stackoverflow.com/questions/51641310/kubernetes-top-vs-linux-top

如果想查看pod当前的总memory使用情况,还是应该用 kubectl 指令

kubectl top pod pod_name

场景二:发现某个 pod 运行异常了,打算查看这个pod里的 log

首先进入这个 pod,找到对应的 log 文件路径。

怎么查看 log 文件呢?有人喜欢用 vim,有人喜欢用 tail ,我个人推荐的是 less 指令

less log_file_path

使用 less 打开文件后,你可以

  1. 使用上下方向键浏览前后的行,使用空格键翻到下一页,使用b键翻到上一页
  2. 跟vim类似,输入 / 加上打算搜索的文本 加回车就可以搜索内容,使用 n 键查看下一个搜索结果, N (shift + n )查看上一个搜索结果。
  3. 如果应用仍然在运行,不断有新的log写入,输入 F (shift + f) 就会让界面锁定在 这个文件的最后一页,并且保持更新 (类似于 tail -f 的效果)

场景三:某个后端服务(java应用)出问题了,需要去看看怎么回事。

首先进入对应的pod,接着可以使用 ps 指令查看 pod 中运行的所有进程

ps -aux

8c9d2b2df82d7ad116a0f16f4b226c89.png

其实,如果是 java 进程,还可以使用 jps 指令(jdk下的一个指令)

e0bd3f4cc8c3e9cecfb6e924f21acf17.png

会显示进程ID和 Java程序名称

接着,可以使用 jstack 指令查看这个java程序当前的 tread dump

jstack your_pid | less

jstack 通常可以用来debug死锁或者其他卡死问题。

有些时候,甚至需要把 java程序当前的 heap dump 也导出来,下载到本地进行分析

jmap -dump:live,format=b,file=/tmp/dump-heap.hprof your_pid

使用 kubectl cp 指令下载对应的文件到本地

tess kubectl cp your_namespace/pod_name:/tmp/dump-heap.hprof /Users/xxxx/temp/dump-heap.hprof

场景四:监控告警系统(比如 Prometheus)显示某个pod的磁盘使用满了,需要处理。

这种场景偶尔也会遇到,比如程序发生了异常,疯狂地写文件(比如log)

首先也是进入到对应的 pod

接着,可以使用 du 和 df 指令

df 指令可以看整体情况,如总的磁盘空间,已使用的空间。

d720b03141587d46318c23720664fce8.png

而 du 指令通常用来看特定的文件夹下的使用情况

3ae84737b07c93f2f1dcde06ef4b2d45.png

我习惯加 -h ,这样可以让显示的大小单位更友好一些(如 K,M,G,T)


以上就是所有可以分享的内容了,如果你也需要做一些日常运维工作,也可以在评论区分享你的常用的技能和技巧。

题外话:

有些读者可能会疑问:“我想做专业的前端/后端工程师,还需要了解这些运维知识吗?”

我的回答:

如果你想持续进步,还是需要了解的。不少公司采纳了 DevOps 的开发方式 ,即组内负责的产品从设计,研发,部署,监控和运维都由这个组全权负责,而不再是传统的精细分工。在这种情况下,开发人员还是需要掌握一定的运维技能。如果有多方面技能,面试的时候也会有一定加分。

此外,假如你的目标是tech lead , manager 甚至是 架构师,你也应该了解各方面的知识,而不是局限在某个技术领域。

9c52848dd84456e97861f86eeaf35a68.png
图片来自B站 素人离弦,侵删

参考链接:

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr015.html

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr016.html

https://kubernetes.io/docs/reference/kubectl/cheatsheet/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值