<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on wd and cc</title><link>https://wdicc.com/</link><description>Recent content in Home on wd and cc</description><generator>Hugo</generator><language>en</language><copyright>wd © 2025</copyright><lastBuildDate>Fri, 09 Jan 2026 16:27:32 -0800</lastBuildDate><atom:link href="https://wdicc.com/atom.xml" rel="self" type="application/rss+xml"/><item><title>聊聊 AWS SSO auth 的 token 管理</title><link>https://wdicc.com/aws-sso-auth-token/</link><pubDate>Fri, 09 Jan 2026 16:27:32 -0800</pubDate><guid>https://wdicc.com/aws-sso-auth-token/</guid><description>&lt;p&gt;最近使用 Golang 重构了一个使用 python 写的和 aws 认证的项目。研究了一下 AWS 这个 SSO 是怎么回事，记录一下。&lt;/p&gt;
&lt;p&gt;
我们去年迁移到了 AWS identity center，通过 okta 来做 auth。okta 登录之后会根据用户所在 okta group 分配适当的权限。web 使用比较简单，这里主要说 cli 的使用。&lt;/p&gt;</description></item><item><title>Use Golang to Generate Eks Token</title><link>https://wdicc.com/use-golang-to-generate-eks-token/</link><pubDate>Sun, 02 Nov 2025 20:08:14 -0800</pubDate><guid>https://wdicc.com/use-golang-to-generate-eks-token/</guid><description>&lt;p&gt;在研究 kubeconfig 配置文件的时候，看到如果使用 aws 命令来生成 token 的话，就需要传递 cluster name 和 region 给到 aws 命令。这样就相等于每个集群都配置一个相应的命令，感觉有点傻好像。&lt;/p&gt;
&lt;p&gt;
研究的过程中发现 kubeconfig 的配置里面有一个 &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authentication/"&gt;KUBERNETES_EXEC_INFO&lt;/a&gt; 这样的变量，可以携带 cluster 中的配置给到执行的命令。这样好像就有可能使用这个特性来简化命令的配置了。&lt;/p&gt;</description></item><item><title>Aggregated Role in Kubernetes</title><link>https://wdicc.com/aggregated-role-in-kubernetes/</link><pubDate>Mon, 15 Sep 2025 13:02:30 -0700</pubDate><guid>https://wdicc.com/aggregated-role-in-kubernetes/</guid><description>&lt;p&gt;k8s 里面授权一般是通过创建一个 role/clusterrole 然后通过 rolebinding/clusterrolebinding 这些和 service account 绑定。&lt;/p&gt;
&lt;p&gt;
之前有一次需要研究为啥用户拥有我们没有显式赋予的权限的时候，发现了&lt;/p&gt;</description></item><item><title>Company and Team Culture</title><link>https://wdicc.com/company-culture/</link><pubDate>Mon, 18 Aug 2025 14:28:52 -0700</pubDate><guid>https://wdicc.com/company-culture/</guid><description>&lt;p&gt;我记得很多年前，头一次听说“公司文化”这个词的时候有点不明白是什么意思。这和我第一次听说价值观不理解什么意思一样。但是这么多年之后，我现在逐渐认识到公司文化和价值观的重要性。&lt;/p&gt;
&lt;p&gt;
公司文化通常指的是一个公司对待一些事情的通常的态度。例如常见的 996 是有些公司的文化，那么这些公司里面一个人工作到晚上 9 点下班大家就一点都不会奇怪，大家安排工作默认就会按照晚上 9 点你还会在公司来安排，如果你不在公司可能还会有人奇怪。公司文化就是深入公司每个人内心对一些事情的看法。这些事情还有可能是对外的，比如对待供应商是否允许有同情心这些等等。&lt;/p&gt;</description></item><item><title>Istio Multi Cluster</title><link>https://wdicc.com/istio-multi-cluster/</link><pubDate>Thu, 07 Aug 2025 18:39:44 -0700</pubDate><guid>https://wdicc.com/istio-multi-cluster/</guid><description>&lt;p&gt;istio 对于多集群的支持方式有很多不同的方式。取决于组网模式，controlplane 模式。可以参考&lt;a href="https://istio.io/latest/docs/ops/deployment/deployment-models/#network-models"&gt;这篇文章&lt;/a&gt;理解具体不同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;single or multiple cluster&lt;/li&gt;
&lt;li&gt;single or multiple network&lt;/li&gt;
&lt;li&gt;single or multiple control plane&lt;/li&gt;
&lt;li&gt;single or multiple mesh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;网络模式，主要是关注集群之间是否可以直接连接。主要是指多个集群之间的 pod 是否可以直接互相访问。这主要是考虑是否用了 VPC-cni。例如 EKS 里面使用 vpc-cni 之后 pod 获取的 ip 和节点获取的 ip 是同一个子网的。只要是在一个互相做了连接的 vpc 中就可以互相访问。
如果集群间 pod 可以互联，那就是 single network。如果不能互联，那就是 multiple network。&lt;/p&gt;</description></item><item><title>In the US</title><link>https://wdicc.com/in-the-us/</link><pubDate>Tue, 17 Jun 2025 08:30:20 -0700</pubDate><guid>https://wdicc.com/in-the-us/</guid><description>&lt;p&gt;2025.1 举家 relocate 到了美国。到现在快半年了。记录一下这边的见闻。&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-3"&gt;
&lt;h3 id="headline-1"&gt;
很多东西都比较大
&lt;/h3&gt;
&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;
&lt;p&gt;刚来的时候租车特意没选特别大的那种车，因为怕停车什么的不方便。结果出去几次就发现，他们这边的车位都奇大一个，甚至都不用倒车入库，直接头就可以进去，因为地方很大。他们这里驾照考试也没有要求说需要会倒车入库。我比较怀疑很多人可能根本就不会倒车入库。我开一个 suv，在路上有时候还会遇到那种高出我的车好多的车。这样的车都可以正常停车。&lt;/p&gt;</description></item><item><title>Gentoo</title><link>https://wdicc.com/gentoo/</link><pubDate>Fri, 27 Dec 2024 08:22:19 +0800</pubDate><guid>https://wdicc.com/gentoo/</guid><description>&lt;p&gt;好久没有玩 Linux 桌面了，上次感觉还是10几年前。最近弄了一个 IBM thinkpad x1 carbon，非常轻薄，对 Linux 的支持也不错。这几天折腾了一下，安装一个 Gentoo。&lt;/p&gt;
&lt;p&gt;
安装之前我其实使用 LiveUSB 尝试了好几个系统。甚至还安装一个 &lt;a href="https://manjaro.org/products/download/x86"&gt;manjaro&lt;/a&gt; 看了一下 wayland 的支持。我当时测试 Ubuntu 的时候，发现合盖之后一晚上居然消耗不到 10% 的电感觉很惊讶。就决定把 Windows 彻底干掉了。&lt;/p&gt;</description></item><item><title>Slow Is Fast 慢就是快</title><link>https://wdicc.com/slow-is-fast/</link><pubDate>Sun, 01 Dec 2024 19:37:35 +0800</pubDate><guid>https://wdicc.com/slow-is-fast/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
小步快跑
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;p&gt;&lt;a href="https://www.google.com/search?q=%E5%B0%8F%E6%AD%A5%E5%BF%AB%E8%B7%91&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;小步快跑&lt;/a&gt;是最近一些年流传的比较广的一种理论。大致是说要快速迭代，在市场里面快速测试想法可行性，不行就换方向重新迭代。
这个乍一听似乎没问题，天下武功唯快不破。你速度够快才能在别人还没有动作的时候早日抢占市场，抢占用户。但是真的是这样吗？实际上一个产品最终如何，通常都不是抢占的那点先机决定的。要经受住市场考验，用户才会真的有黏性。而为了抢占先机做出来的功能，通常会不完善，功能不完整等等，导致前期培养的一些黏性用户失望而离开。反而可能你的竞争对手认真的学习并 copy 之后，功能做的扎实完善，吸引了用户。
在我看来，小步快跑正是一些无能的领导们想出来的东西。因为他们心中对全局也没有很好的思路，并不知道下一步的战略应该在哪个方向。所以就让大家小步快跑，不停试错。但是这样时间必然会浪费一些，那么带来的后果就是大家加班严重。
我之前体验过任何功能定好了今晚上线，就必须今晚上线的公司。即使 QA 工程师测试的时候发现产品文档写的不清不楚，也一定需要上线。最后的结果就是，QA 加开发工程师和产品经理一起在最后一刻打磨功能，大家一起加班。而这个功能上线之后，还有下一个功能等着，结果就是无穷尽的加班。半年之后回顾的时候，会发现大家忙乎了大半年，产品做的好不好不一定，反正班加了不少，每个人都很忙碌。&lt;/p&gt;</description></item><item><title>Resolve Dependency Issue for a Simple Java Program</title><link>https://wdicc.com/resolve-dependency-issue-for-a-simple-java-program/</link><pubDate>Sat, 31 Aug 2024 09:58:48 +0800</pubDate><guid>https://wdicc.com/resolve-dependency-issue-for-a-simple-java-program/</guid><description>&lt;p&gt;最近需要把一个服务从对 Envoy 的依赖迁移到 Nginx。我们大都是 GRPC 请求，所以需要代码对 http2 + ssl 做支持。&lt;/p&gt;
&lt;p&gt;
GRPC 是基于 h2 的，当使用 Envoy 的时候，代码都是发 h2c 的情况给本地的 envoy。这个过程没有 ssl 握手。而 Nginx 不支持 h2c 的支持，必须处理 ssl 握手。我们的服务都是在 Nginx 后面的，Nginx 层面也做了会多 Virtual Host 的配置，所以需要通过 Host 来做匹配，这个 Host 也必须得正确，要不然就是会匹配到 default 的 server，无非是得到一个 404。&lt;/p&gt;</description></item><item><title>Open Decision Making</title><link>https://wdicc.com/open-decision-making/</link><pubDate>Sun, 14 Jul 2024 20:12:34 +0800</pubDate><guid>https://wdicc.com/open-decision-making/</guid><description>&lt;p&gt;最近读了一篇文章（论文），关于如何通过群里智慧来做决策的。网址在这里 &lt;a href="https://web.stanford.edu/~ouster/cgi-bin/decisions.php"&gt;https://web.stanford.edu/~ouster/cgi-bin/decisions.php&lt;/a&gt;。 作者是斯坦福大学的一个教授。下面是我自己做的一些笔记。&lt;/p&gt;
&lt;p&gt;
我们会遇到很多需要做决定的情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;technical decisions about how to build products&lt;/li&gt;
&lt;li&gt;personnel decisions about whom to hire&lt;/li&gt;
&lt;li&gt;business decisions about how to market and sell our products&lt;/li&gt;
&lt;li&gt;strategic decisions about company direction and financing&lt;/li&gt;
&lt;li&gt;and many others.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于有些决定比较满意，有些对过程和结果都不满意。所以作者根据自己经验给出来了一套框架来让你持续高效的做出好的决定，能让执行的人愿意去执行他。&lt;/p&gt;</description></item><item><title>How to Improve Sleep Quality</title><link>https://wdicc.com/how-to-improve-sleep-quality/</link><pubDate>Wed, 20 Dec 2023 09:02:00 +0800</pubDate><guid>https://wdicc.com/how-to-improve-sleep-quality/</guid><description>&lt;p&gt;在之前公司的时候，满脑子都是工作，所以经常性的半夜3，4点醒来然后就睡不着了。醒来比较常做的事情就是刷手机，希望能把自己刷睡着，但是往往事与愿违。越刷越睡不着。也尝试过褪黑素啥的，还别说好像是有点用。经过这几年的摸索，我感觉我好像摸索出来一点道道。&lt;/p&gt;</description></item><item><title>Dns Query</title><link>https://wdicc.com/dns-query/</link><pubDate>Sun, 13 Aug 2023 19:19:34 +0800</pubDate><guid>https://wdicc.com/dns-query/</guid><description>&lt;p&gt;总结一个前段时间遇到的问题。当时的现象是 Nginx 报错误说 dns 有问题，不能正常处理一个域名（我们的 upstream 配置的是域名。）&lt;/p&gt;
&lt;p&gt;
但是我使用 dig 测试总是可以成功的，看了下好像应该有的进程也都在，就有点摸不着头脑。后来另一个同事使用 nslookup 可以复现 dns 查询问题，然后发现是本机的一个 dns 服务对于 TCP 的端口的监听消失了。现在问题和原因都知道了，然后我就很好奇为啥我自己 dig 测试就没测试出来问题呢？&lt;/p&gt;</description></item><item><title>Setup Tproxy on Router</title><link>https://wdicc.com/setup-tproxy-on-router/</link><pubDate>Sun, 28 May 2023 12:00:46 +0800</pubDate><guid>https://wdicc.com/setup-tproxy-on-router/</guid><description>&lt;p&gt;使用了一段时间的 &lt;a href="https://wdicc.com/setup-policy-route-on-openwrt-x86-with-wireguard/"&gt;wireguard&lt;/a&gt; 之后，使用的时候时不时总是会断一会，我感觉体验不是很好。所以想换回使用 v2ray 了。当然 wireguard 还是继续作为国内回家使用。和国外的 tunnel 就换 v2ray 了。&lt;/p&gt;
&lt;p&gt;
首先需要做的就是调整原来的那套方案里面的出国线路。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把 ipset/dnsmasq/iptables 相关的配置删掉。&lt;/li&gt;
&lt;li&gt;把 hotplug 里面关于 ip rule add fwmark 的部分删掉。相关 route 还是需要留着，因为我还需要在家之外的网络连回家。&lt;/li&gt;
&lt;li&gt;吧 wireguard 里面和 VPS 的连接也去掉。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这一顿操作之后，出国应该就挂了。接下来就配置透明代理。&lt;/p&gt;</description></item><item><title>Use Rime Again</title><link>https://wdicc.com/use-rime-again/</link><pubDate>Thu, 06 Apr 2023 10:04:20 +0800</pubDate><guid>https://wdicc.com/use-rime-again/</guid><description>&lt;p&gt;Updates: 已经放弃了。感觉没有自带输入法流畅。
Updates2: 尝试了 &lt;a href="https://github.com/Mintimate/oh-my-rime"&gt;oh-my-rime&lt;/a&gt; 之后，我就一直用着了，这里面应该也集成了雾凇的一些东西，已经用了感觉得有一年了，感觉非常好用。&lt;/p&gt;
&lt;p&gt;
以前用过很久的 rime，但是后来换了原生输入法，因为现在原生输入法也很好用。最近这个&lt;a href="https://github.com/iDvel/rime-ice"&gt;雾凇拼音&lt;/a&gt;很火，就又尝试了一下 rime。这个确实也还不错的样子。&lt;/p&gt;</description></item><item><title>Howto Build an Old Golang Project</title><link>https://wdicc.com/howto-build-an-old-golang-project/</link><pubDate>Wed, 05 Apr 2023 17:29:47 +0800</pubDate><guid>https://wdicc.com/howto-build-an-old-golang-project/</guid><description>&lt;p&gt;我开始使用 golang 的时候，就已经进入了 go mod 时代了。这个时候就不用和 GOPATH 做斗争了。所以对于 GOPATH 时代的项目没啥经验。&lt;/p&gt;
&lt;p&gt;
最近需要 debug 一个 &lt;a href="https://github.com/hashicorp/consul/tree/v1.2.4"&gt;consul 的古老版本 v1.2.4&lt;/a&gt;，项目显示支持 go 1.10+。这一定不能是支持 go mod 的版本了，我查了一下 GOPATH 似乎是在 1.17 正式 deprecate 的。所以似乎理论上 1.10 - 1.16 的版本都可以。&lt;/p&gt;</description></item><item><title>Make DNS Service in K8s Stable</title><link>https://wdicc.com/make-dns-service-in-k8s-stable/</link><pubDate>Wed, 23 Nov 2022 19:51:18 +0800</pubDate><guid>https://wdicc.com/make-dns-service-in-k8s-stable/</guid><description>&lt;p&gt;我们用的 k8s 是通过 rancher 管理的。rancher 又是使用 rke 这个 engine 来创建集群的。我们使用的 CNI 是 calico，DNS 是 coredns。按说 DNS 服务是核心服务，如果这个玩意不稳定或者有问题，那么整个集群都不安宁。coredns 按说挺有名气来，按说没问题。。吧？&lt;/p&gt;</description></item><item><title>Use Emacs in terminal</title><link>https://wdicc.com/use-emacs-in-terminal/</link><pubDate>Tue, 22 Nov 2022 20:45:39 +0800</pubDate><guid>https://wdicc.com/use-emacs-in-terminal/</guid><description>&lt;p&gt;I usually use the Emacs GUI to manage and edit files for each project. The GUI version looks great and works great.&lt;/p&gt;
&lt;p&gt;
However, I have to use Vim in the terminal since it starts much faster than Emacs. I have tried with Emacs daemon in the past, but I met some weird issues when connecting GUI Emacs to the daemon. Some of the function does not work very well.&lt;/p&gt;
&lt;p&gt;
I used the combination of Vim and Emacs for a very long time until yesterday. I realized why I don&amp;#39;t use Emacs daemon in the terminal while using Emacs GUI without the daemon.&lt;/p&gt;</description></item><item><title>Use Kubeconform to Validate Manifests Locally</title><link>https://wdicc.com/use-kubeconform-to-validate-manifests-locally/</link><pubDate>Sat, 29 Oct 2022 17:58:39 +0800</pubDate><guid>https://wdicc.com/use-kubeconform-to-validate-manifests-locally/</guid><description>&lt;p&gt;
&lt;a href="https://github.com/yannh/kubeconform"&gt;kubeconform&lt;/a&gt; is a tool that allows us to validate Kubernetes manifests.&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-3"&gt;
&lt;h3 id="headline-1"&gt;
Retrieve open API specification from Kubernetes
&lt;/h3&gt;
&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;
&lt;p&gt;
Use this command to retrieve the open API specifications from Kubernetes.&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;k get --raw &lt;span style="color:#4070a0"&gt;&amp;#39;/openapi/v2&amp;#39;&lt;/span&gt; &amp;gt; /tmp/specs.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-3"&gt;
&lt;h3 id="headline-2"&gt;
Generate JSON schema file
&lt;/h3&gt;
&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;
&lt;p&gt;
Use &lt;a href="https://github.com/wd/openapi2jsonschema"&gt;openapi2jsonschema&lt;/a&gt; to generate the JSON schemas.&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&lt;/span&gt;&lt;span&gt;$ python openapi2jsonschema/command.py -o /tmp/json-schemas/v1.20.11-standalone-strict &lt;span style="color:#4070a0;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&lt;/span&gt;&lt;span&gt;--kubernetes --stand-alone &lt;span style="color:#4070a0;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&lt;/span&gt;&lt;span&gt;--expanded --strict &lt;span style="color:#4070a0;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&lt;/span&gt;&lt;span&gt;/tmp/specs.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&lt;/span&gt;&lt;span&gt;Downloading schema
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&lt;/span&gt;&lt;span&gt;Parsing schema
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&lt;/span&gt;&lt;span&gt;Generating shared definitions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&lt;/span&gt;&lt;span&gt;Generating individual schemas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&lt;/span&gt;&lt;span&gt;Processing alertmanager-monitoring-v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&lt;/span&gt;&lt;span&gt;Generating alertmanager-monitoring-v1.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&lt;/span&gt;&lt;span&gt;Processing alertmanagerlist-monitoring-v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&lt;/span&gt;&lt;span&gt;Generating alertmanagerlist-monitoring-v1.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&lt;/span&gt;&lt;span&gt;Processing prometheus-monitoring-v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&lt;/span&gt;&lt;span&gt;Generating prometheus-monitoring-v1.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&lt;/span&gt;&lt;span&gt;Processing prometheuslist-monitoring-v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17&lt;/span&gt;&lt;span&gt;....
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18&lt;/span&gt;&lt;span&gt;Processing networksetlist-crd-v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19&lt;/span&gt;&lt;span&gt;Generating networksetlist-crd-v1.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20&lt;/span&gt;&lt;span&gt;Generating schema &lt;span style="color:#007020;font-weight:bold"&gt;for&lt;/span&gt; all types&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The command will report some errors like the one below which is fine since the tool does not support `customresourcedefinition`.&lt;/p&gt;</description></item><item><title>Webhooks in Kubernetes</title><link>https://wdicc.com/webhooks-in-kubernetes/</link><pubDate>Sun, 28 Aug 2022 09:38:59 +0800</pubDate><guid>https://wdicc.com/webhooks-in-kubernetes/</guid><description>&lt;p&gt;
Kubernetes allows us to hook on API request chain to do some specific checks or modifies.&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
Kubernetes API access control
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;p&gt;
There are two types of control. One is to control which user(token, group) is allowed to access, the other one is to control which resource a user could access. The kube-apiserver has two arguments to allow users to define that.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication: &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication"&gt;–authentication-token-webhook-config-file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Authorization: &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/webhook/"&gt;–authorization-webhook-config-file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-2"&gt;
&lt;h2 id="headline-2"&gt;
Admission webhook
&lt;/h2&gt;
&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;
&lt;p&gt;
&lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#what-are-admission-webhooks"&gt;Here&lt;/a&gt; is the definition about what admission webhook could do.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Admission webhooks are HTTP callbacks that receive admission requests and do something with them. You can define two types of admission webhooks, validating admission webhook and mutating admission webhook. Mutating admission webhooks are invoked first, and can modify objects sent to the API server to enforce custom defaults. After all object modifications are complete, and after the incoming object is validated by the API server, validating admission webhooks are invoked and can reject requests to enforce custom policies.&lt;/p&gt;</description></item><item><title>Debugging Iptables</title><link>https://wdicc.com/debugging-iptables/</link><pubDate>Fri, 15 Apr 2022 14:30:46 +0800</pubDate><guid>https://wdicc.com/debugging-iptables/</guid><description>&lt;p&gt;
iptables 是个很有用的工具。可以可以方便的操纵包的走向，作为 ops 不可避免的需要了解如何 debug 一些问题。&lt;/p&gt;
&lt;p&gt;
首先肯定是需要对 iptables 的包在各个 table 和 chain 的走向需要有了解。这个随便一搜就有很多的图片，不过各个图可能还是有些许差别，另外有些理解起来没那么好懂。不过想要了解 iptables 还是需要硬着头皮去看看。&lt;/p&gt;</description></item><item><title>妞妞再见</title><link>https://wdicc.com/bye-niuniu/</link><pubDate>Wed, 30 Mar 2022 18:35:22 +0800</pubDate><guid>https://wdicc.com/bye-niuniu/</guid><description>&lt;p&gt;妞妞是我和老婆养的一只猫，前几天永远的离开了我们。享年将近 19 岁，算是大龄猫了。她比&lt;a href="https://wdicc.com/r.i.p-maomao"&gt;毛毛&lt;/a&gt;还大一岁，不过毛毛早几年就走了。&lt;/p&gt;
&lt;p&gt;
妞妞是在毛毛之后来到我们家的，当时想的是再找一只给毛毛作伴，避免一只猫太孤单。妞妞是我老婆从淘宝领养的（你没看错就是淘宝，当时有人会把猫图片放上去等领养）。当时看图片的时候，是被妞妞忧郁的眼神吸引的。原生家庭特别好，原主人家里有钱，我记得应该是银行工作的。当时家里很多只猫，还有专门的阁楼阳光房给猫。因为猫有点多，所以想送人几只。我们去领养的时候，人家还送了很多东西给我们。一点也不像现在的一些领养，各种要求。&lt;/p&gt;</description></item><item><title>Year in Review 2021</title><link>https://wdicc.com/year-in-review-2021/</link><pubDate>Mon, 03 Jan 2022 15:08:31 +0800</pubDate><guid>https://wdicc.com/year-in-review-2021/</guid><description>&lt;p&gt;2021 年结束了，照例来总结下。&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-3"&gt;
&lt;h3 id="headline-1"&gt;
Family
&lt;/h3&gt;
&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;
&lt;p&gt;幼幼越长越大了，1 岁生日的时候带着去了一趟澳门，那是唯一一个算是出国又不需要隔离的地区。不过即使这样，我的健康码回来之后有几天显示无法展示状态。。然后联系各种部门都无法解决。后来自己好了。。&lt;/p&gt;</description></item><item><title>Expand Yourself</title><link>https://wdicc.com/expand-yourself/</link><pubDate>Sun, 26 Dec 2021 11:09:15 +0800</pubDate><guid>https://wdicc.com/expand-yourself/</guid><description>&lt;p&gt;刚开始工作的时候，一个常见的话题就是自己遇到领导或者老板好不好。什么是好领导或者好老板呢？平时什么都不管你，你想干什么就干什么这种？还是你做的任何事情都过问，细节也不放过，对你做的这些都要把控？也可能是上面两种的综合？&lt;/p&gt;</description></item><item><title>Add Monitor Graphs to Openwrt</title><link>https://wdicc.com/add-monitor-graphs-to-openwrt/</link><pubDate>Sat, 11 Dec 2021 19:38:12 +0800</pubDate><guid>https://wdicc.com/add-monitor-graphs-to-openwrt/</guid><description>&lt;p&gt;
According to the docs here &lt;a href="https://openwrt.org/docs/guide-user/luci/luci_app_statistics,"&gt;https://openwrt.org/docs/guide-user/luci/luci_app_statistics,&lt;/a&gt; OpenWrt supports us using the Collectd to collect metrics and the Rrdtool draw the graph later.&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-3"&gt;
&lt;h3 id="headline-1"&gt;
Install
&lt;/h3&gt;
&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;opkg update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;opkg install luci-app-statistics&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
We can run the command &lt;code class="verbatim"&gt;opkg list | grep collectd-mod&lt;/code&gt; to see what mertics we can collect. I have installed these modules&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&lt;/span&gt;&lt;span&gt;collectd-mod-cpu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&lt;/span&gt;&lt;span&gt;collectd-mod-curl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&lt;/span&gt;&lt;span&gt;collectd-mod-dns
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&lt;/span&gt;&lt;span&gt;collectd-mod-exec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&lt;/span&gt;&lt;span&gt;collectd-mod-interface
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&lt;/span&gt;&lt;span&gt;collectd-mod-iwinfo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&lt;/span&gt;&lt;span&gt;collectd-mod-load
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&lt;/span&gt;&lt;span&gt;collectd-mod-memory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&lt;/span&gt;&lt;span&gt;collectd-mod-network
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&lt;/span&gt;&lt;span&gt;collectd-mod-ping
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&lt;/span&gt;&lt;span&gt;collectd-mod-rrdtool
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&lt;/span&gt;&lt;span&gt;collectd-mod-thermal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Most of the plugins work out of the box, such as the &lt;code class="verbatim"&gt;cpu&lt;/code&gt; one. And some of them need some configurations on the UI, such as the &lt;code class="verbatim"&gt;curl&lt;/code&gt; one. You have to tell the plugin the URL you want to monitor.&lt;/p&gt;</description></item><item><title>DNS Request in Alpine Image</title><link>https://wdicc.com/dns-request-in-alpine-image/</link><pubDate>Thu, 25 Nov 2021 20:15:39 +0800</pubDate><guid>https://wdicc.com/dns-request-in-alpine-image/</guid><description>&lt;p&gt;
Alpine 镜像可以带来很小的镜像体积，所以大家比较热衷于使用这个镜像做基础镜像。但是实际上因为一些系统库是阉割版本，可能会导致一些意想不到的问题。例如这里想说的 DNS 的问题。&lt;/p&gt;
&lt;p&gt;
有一个同事报告说在他们的应用的 container 里面使用 curl 请求一个网址的时候，有一定概率会收到 &lt;code class="verbatim"&gt;Could not resolve host:&lt;/code&gt; 这个错误，但是也有一定概率会成功返回 200。同时在同一个 pod 的一个 sidecar container 里面使用 curl 访问相同的网址就没问题，总是会返回 200。&lt;/p&gt;</description></item><item><title>Setup Policy Route on Openwrt X86 With Wireguard</title><link>https://wdicc.com/setup-policy-route-on-openwrt-x86-with-wireguard/</link><pubDate>Sat, 06 Nov 2021 15:07:32 +0800</pubDate><guid>https://wdicc.com/setup-policy-route-on-openwrt-x86-with-wireguard/</guid><description>&lt;h1 id="刷系统"&gt;刷系统&lt;/h1&gt;
&lt;p&gt;选择 image，我用的是 x86_64 的硬件。如果你不确定，可以选择 generic 的试试看，如果你能用 64 的，启动的时候提示你用 64 位的性能更好。&lt;/p&gt;
&lt;p&gt;然后需要选择不同的包，主要是在下面两个里面选。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;squashfs-combined：类似传统路由器，可以任意重置路由器。但是磁盘大小也是固定大小。&lt;/li&gt;
&lt;li&gt;ext4-combined：磁盘可以 resize，如果你有超过 50G 的磁盘，都想要在路由器里面用，那就选这个。否则上面那个更好，毕竟有问题的时候重置很方便。这个恐怕只能重新刷系统了，麻烦多了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;准备两个 u 盘。如果你能有一个 u 盘可以启动加存放那个 img 那就更好了。&lt;/p&gt;</description></item><item><title>An Incomplete List of Skills Senior Engineers Need Beyond Coding</title><link>https://wdicc.com/an-incomplete-list-of-skills-senior-engineers-need-beyond-coding/</link><pubDate>Sat, 25 Sep 2021 17:37:11 +0800</pubDate><guid>https://wdicc.com/an-incomplete-list-of-skills-senior-engineers-need-beyond-coding/</guid><description>&lt;p&gt;看到一篇文章，&lt;a href="https://skamille.medium.com/an-incomplete-list-of-skills-senior-engineers-need-beyond-coding-8ed4a521b29f"&gt;An incomplete list of skills senior engineers need, beyond coding&lt;/a&gt;, 感觉挺有意思，本来想要翻译的，结果发现已经有人翻译了，直接贴这里好了。。&lt;/p&gt;
&lt;p&gt;
翻译参考了: &lt;a href="https://kanchengzxdfgcv.blogspot.com/2021/07/incomplete-list-of-skills-senior.html"&gt;https://kanchengzxdfgcv.blogspot.com/2021/07/incomplete-list-of-skills-senior.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
How to run a meeting, and no, being the person who talks the most in the meeting is not the same thing as running it&lt;/p&gt;
&lt;p&gt;
&amp;gt; 知道如何主持会议。要注意成为会议里面说的最多的那个人并不同于主持会议。&lt;/p&gt;</description></item><item><title>Limit and Request in Kubernetes</title><link>https://wdicc.com/limit-and-request-in-kubernetes/</link><pubDate>Sun, 01 Aug 2021 17:28:00 +0800</pubDate><guid>https://wdicc.com/limit-and-request-in-kubernetes/</guid><description>&lt;p&gt;程序跑在 K8s 里面的时候，特别要注意的是设置正确的 Request 和 limit。其中 Request 是 guaranteed 的资源是下限，如果节点上面不能给你保证这个资源，那么 pod 是不会调度上去的。而 Limit 是 burstable 资源，这部分资源有时候是会需要和节点上面其他程序竞争的。对于 CPU 来说，如果产生了竞争，那会遇到比较严重的 throttle，对于内存，那可能就会遇到 OOM kill 了。这些内容很容易查到资料，不多说了。&lt;/p&gt;</description></item><item><title>Local Persistent Volume vs HostPath</title><link>https://wdicc.com/local-persist-volume-vs-hostpath/</link><pubDate>Sun, 28 Feb 2021 14:52:23 +0800</pubDate><guid>https://wdicc.com/local-persist-volume-vs-hostpath/</guid><description>&lt;p&gt;Kubernetes 可以用 Local persistent volume 来使用本机的磁盘。那和 hostPath volume 有啥区别呢？ &lt;a href="https://kubernetes.io/blog/2019/04/04/kubernetes-1.14-local-persistent-volumes-ga/"&gt;这篇文档&lt;/a&gt;有说明，大致翻译下。&lt;/p&gt;
&lt;p&gt;
一般来说 Persistent volume 都是通过远程文件系统实现的。远程文件系统可以不依赖 kubernetes 节点而保存数据。但是远程文件系统往往不能提供本地文件系统一样的性能。&lt;/p&gt;
&lt;p&gt;
为了能更好的理解 Local Persistent Volume，有必要把它和 HostPath volume 比较下。HostPath volume 是挂载主机的一个文件或者目录到 pod。类似的 Local Persistent Volume 是挂载主机的一块磁盘或者分区到一个 pod。&lt;/p&gt;</description></item><item><title>Upgrade Yourself</title><link>https://wdicc.com/upgrade-yourself/</link><pubDate>Sun, 21 Feb 2021 10:37:37 +0800</pubDate><guid>https://wdicc.com/upgrade-yourself/</guid><description>&lt;p&gt;前几年一直在做管理，之前写过一篇&lt;a href="https://wdicc.com/upgrade-myself/"&gt;成长&lt;/a&gt;。最近开始做独立开发者，感觉可能前面忽视了一些东西。这里补充总结下。&lt;/p&gt;
&lt;p&gt;
对于各方面能力都很强的人来说，做管理人员可以让他成就更大的事情。毕竟一个人精力有限，即使很多方面都精通也没法说 7x24 把这些方面的事情都安排的妥妥当当的，这个时候必定会需要代理给别人，那就是组建团队和做所谓的管理了。&lt;/p&gt;</description></item></channel></rss>