最近涨了不少粉,大多数是来自于我的这个回答
前端写代码真的有必要封装太好么?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](https://i-blog.csdnimg.cn/blog_migrate/cb2333c2778b416e7250042e5054f059.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 打开文件后,你可以
- 使用上下方向键浏览前后的行,使用空格键翻到下一页,使用b键翻到上一页
- 跟vim类似,输入 / 加上打算搜索的文本 加回车就可以搜索内容,使用 n 键查看下一个搜索结果, N (shift + n )查看上一个搜索结果。
- 如果应用仍然在运行,不断有新的log写入,输入 F (shift + f) 就会让界面锁定在 这个文件的最后一页,并且保持更新 (类似于 tail -f 的效果)
场景三:某个后端服务(java应用)出问题了,需要去看看怎么回事。
首先进入对应的pod,接着可以使用 ps 指令查看 pod 中运行的所有进程
ps -aux
![8c9d2b2df82d7ad116a0f16f4b226c89.png](https://i-blog.csdnimg.cn/blog_migrate/c319c2215ca0368d6dc35052a2bdca68.jpeg)
其实,如果是 java 进程,还可以使用 jps 指令(jdk下的一个指令)
![e0bd3f4cc8c3e9cecfb6e924f21acf17.png](https://i-blog.csdnimg.cn/blog_migrate/ac78ac5dd8c6f385b2fff2a96c98e96f.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](https://i-blog.csdnimg.cn/blog_migrate/822ad33d129c502fa11e5bd29c74080e.png)
而 du 指令通常用来看特定的文件夹下的使用情况
![3ae84737b07c93f2f1dcde06ef4b2d45.png](https://i-blog.csdnimg.cn/blog_migrate/9915ca874fc53705b3814663c50b53b2.jpeg)
我习惯加 -h ,这样可以让显示的大小单位更友好一些(如 K,M,G,T)
以上就是所有可以分享的内容了,如果你也需要做一些日常运维工作,也可以在评论区分享你的常用的技能和技巧。
题外话:
有些读者可能会疑问:“我想做专业的前端/后端工程师,还需要了解这些运维知识吗?”
我的回答:
如果你想持续进步,还是需要了解的。不少公司采纳了 DevOps 的开发方式 ,即组内负责的产品从设计,研发,部署,监控和运维都由这个组全权负责,而不再是传统的精细分工。在这种情况下,开发人员还是需要掌握一定的运维技能。如果有多方面技能,面试的时候也会有一定加分。
此外,假如你的目标是tech lead , manager 甚至是 架构师,你也应该了解各方面的知识,而不是局限在某个技术领域。
![9c52848dd84456e97861f86eeaf35a68.png](https://i-blog.csdnimg.cn/blog_migrate/375ce55473df057f8712297346c5fe69.jpeg)
参考链接:
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/