<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>运维 on Jiale's personal blog</title><link>http://savila.me/categories/%E8%BF%90%E7%BB%B4/</link><description>Recent content in 运维 on Jiale's personal blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 03 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="http://savila.me/categories/%E8%BF%90%E7%BB%B4/index.xml" rel="self" type="application/rss+xml"/><item><title>第一章：运维为什么要学 Go</title><link>http://savila.me/p/ops-why-learn-go/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0800</pubDate><guid>http://savila.me/p/ops-why-learn-go/</guid><description>&lt;img src="http://savila.me/p/ops-why-learn-go/cover.png" alt="Featured image of post 第一章：运维为什么要学 Go" /&gt;&lt;h3 id="本章目标"&gt;本章目标：
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Go为什么适合运维和云原生场景？&lt;/li&gt;
&lt;li&gt;运维团队学习go的目标不是做“go后端开发”，而是为了有语言级直觉下的排障能力（这一点AI也很难帮你做）&lt;/li&gt;
&lt;li&gt;文章后续会围绕“写工具，读Kubernetes源码，排查问题”这个框架展开&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="11-go与运维的关系"&gt;1.1 Go与运维的关系
&lt;/h3&gt;&lt;p&gt;对于运维/SRE同学来说，学习go是非常值得的，go非常适合写稳定且易于部署的运维工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨平台编译运行&lt;/li&gt;
&lt;li&gt;云原生生态贴近&lt;/li&gt;
&lt;li&gt;轻量并发
或者更好理解的，咱们谈谈常见的痛点来见go的优势：&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;同时探测几百台机器，这种大规模并发任务你还在用并发支持低效python或者粗粒度控制的shell？&lt;/li&gt;
&lt;li&gt;不同机器的环境依赖复杂，服务器需要有python解释器，有编译工具链，而go的编译文件可以直接发给服务器上运行，服务器不需要有网，甚至不需要装Go&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="12-我们一般在哪些场景使用go"&gt;1.2 我们一般在哪些场景使用go？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;巡检主机、端口、HTTP 接口，写探针或者检活服务&lt;/li&gt;
&lt;li&gt;调用 Kubernetes API 或云厂商 API。&lt;/li&gt;
&lt;li&gt;使用 pprof 分析 Go 服务的 CPU、内存和 goroutine 问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-关于kubernetes的源码"&gt;1.3 关于Kubernetes的源码
&lt;/h3&gt;&lt;p&gt;Kubernetes 自 2014 年由 Google 正式开源，并于 2015 年作为首个种子项目捐赠给 CNCF（云原生计算基金会）进行孵化。
但是其实当我们阅读其源码的时候就发现，所谓的Controller、Informer、WorkQueue、Scheduler、kube-proxy这些听起来很复杂的系统设计，其实本质上大量核心逻辑都是几个go语言很基础的能力：goroutine、channel、context、锁、map、接口、显示错误处理、pprof。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;举例：
&lt;img alt="Screenshot 2026-07-02 at 21.52.53.png" class="gallery-image" data-flex-basis="425px" data-flex-grow="177" height="736" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://cdn.jsdelivr.net/gh/XiDianJiale/picgo-repo-img/img/Screenshot%202026-07-02%20at%2021.52.53.png" srcset="http://savila.me/Screenshot%202026-07-02%20at%2021.52.53_970719520665925428_hu_4402a26717e4a25b.png 800w, https://cdn.jsdelivr.net/gh/XiDianJiale/picgo-repo-img/img/Screenshot%202026-07-02%20at%2021.52.53.png 1306w" width="1306"&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;-&amp;gt; 源码阅读收获key takeaway:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;k8s不是写个for循环阻塞起batch pods，而是直接起batch go routine来创建pod&lt;/li&gt;
&lt;li&gt;Waitgroup是goroutine常见的搭档：用于确保go routine都运行完毕且返回这种阻塞等待(鄙人之前就写过main函数已经退出了但是go routine还没跑完的垃圾代码)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="14-谈谈12-factors与go"&gt;1.4 谈谈12 factors与go
&lt;/h2&gt;&lt;p&gt;源自：Martin Fowler &amp;lt;企业应用架构模式&amp;gt;，参考： &lt;a class="link" href="https://12factor.net/" target="_blank" rel="noopener"
 &gt;https://12factor.net/&lt;/a&gt;
&lt;img alt="Screenshot 2026-07-02 at 21.47.24.png" class="gallery-image" data-flex-basis="614px" data-flex-grow="256" height="722" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://cdn.jsdelivr.net/gh/XiDianJiale/picgo-repo-img/img/Screenshot%202026-07-02%20at%2021.47.24.png" srcset="http://savila.me/Screenshot%202026-07-02%20at%2021.47.24_10780479108510643195_hu_6eee08a47224ae3c.png 800w, http://savila.me/Screenshot%202026-07-02%20at%2021.47.24_10780479108510643195_hu_c5ece0a0e522bff7.png 1600w, https://cdn.jsdelivr.net/gh/XiDianJiale/picgo-repo-img/img/Screenshot%202026-07-02%20at%2021.47.24.png 1850w" width="1850"&gt;&lt;/p&gt;</description></item></channel></rss>