<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ストイックに生きたい</title><description>ストイックに生きたい</description><link>https://blog.sakamo.dev/</link><language>ja</language><item><title>Goodbye 2025</title><link>https://blog.sakamo.dev/post/review-2025/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2025/</guid><description>2025 年も終わりなので振り返る。年末は忙しく書けなかった。</description><pubDate>Sun, 11 Jan 2026 13:42:30 GMT</pubDate><content:encoded>&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;p&gt;転職して 4 年 4 ヶ月が経過した。なかなかの長続きだし、ここまで長いともう転職してからみたいな言い方ではない気がする。&lt;/p&gt;
&lt;p&gt;今のポジションとしては CSE II だけど、今年の 4 月ぐらいからフルタイムで社内ツールの開発をやっているので、実質 SysDE では?と思う。チームとしてはグローバルなので英語しか使わず、タイムゾーンの関係上変な時間で生活するようになったので、もう普通の日本時間での生活に戻れる気はしない。そして、Kubernetes を全く触らなくなったので若干危機を感じている。&lt;/p&gt;
&lt;h2 id=&quot;技術&quot;&gt;技術&lt;/h2&gt;
&lt;p&gt;コンテナ関連で唯一やったといえるのは、Multipass で Kubernetes クラスターを作成できる &lt;a href=&quot;https://github.com/ryota-sakamoto/kubernetes-on-multipass&quot;&gt;kubernetes-on-multipass&lt;/a&gt; のメンテをちょっとやったぐらい。&lt;/p&gt;
&lt;p&gt;コミットログを見てたら 2 月に &lt;a href=&quot;https://github.com/kubernetes/kubernetes/pull/130401&quot;&gt;Fix kernel version check condition in nftables proxier #130401&lt;/a&gt; というのもやってた。たしか、nftables 関連のコード読んでたら見つけた。&lt;/p&gt;
&lt;p&gt;そして、12 月あたりから Linux Kernel へのコントリビュートを始め、Mac の上で VMware Fusion で VM 立てて作業していたが限界を感じたので、UM790 Pro を買ったら快適になった。駆け込みで買ったので、メモリ高騰の波に襲われずに済んだ。2026 年からは Linux Kernel に全振りする予定である。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;快適になった &lt;a href=&quot;https://t.co/hgXsf8ZFbK&quot;&gt;pic.twitter.com/hgXsf8ZFbK&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(27) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/2004498366970159285?ref_src=twsrc%5Etfw&quot;&gt;December 26, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;英語&quot;&gt;英語&lt;/h2&gt;
&lt;p&gt;フルタイムで英語で仕事しているおかげか英語での会話に抵抗はなくなった。抵抗がなくなっただけで字幕は使っているし、集中していないと普通に聞き逃す。やはり英語での世界の方が広いので今後も英語を使っていきたい。&lt;/p&gt;
&lt;h2 id=&quot;筋トレ&quot;&gt;筋トレ&lt;/h2&gt;
&lt;p&gt;家でよりかは週に何回かジムに行きみたいな生活となった。意外とレッグプレスなどの脚のメニューもやるようになり、昔は脚なんてやってられないと思っていたが意識が変わった。&lt;/p&gt;
&lt;h2 id=&quot;プライベート&quot;&gt;プライベート&lt;/h2&gt;
&lt;p&gt;大阪万博に行ったり、箱根行ったりと今年も旅行をした。そして家を購入したのでローンに追われている。もっと給料が欲しいと切に願うのであった。&lt;/p&gt;
&lt;h2 id=&quot;総括&quot;&gt;総括&lt;/h2&gt;
&lt;p&gt;来年も引き続き、プライベートも仕事も頑張りましょう。&lt;/p&gt;</content:encoded></item><item><title>Goodbye 2024</title><link>https://blog.sakamo.dev/post/review-2024/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2024/</guid><description>2024 年も終わりなので振り返る。年末に書くつもりだったが忘れてた。</description><pubDate>Mon, 24 Feb 2025 07:52:30 GMT</pubDate><content:encoded>&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;p&gt;転職して 3 年 4 ヶ月が経過した。去年の時点ですでに過去の在籍期間の中では最長だったが、自分で驚くぐらい長続きしている。プロモーションしてジョブレベルが上がったのでより頑張っていきたいところではある。&lt;/p&gt;
&lt;p&gt;2023 年と比べるとコードを書くことも増え、メンテしている &lt;a href=&quot;https://github.com/awslabs/dynein&quot;&gt;dynein&lt;/a&gt; では Rust を書いたりした。コードを書いてるとやはり楽しいので、そろそろソフトウェアエンジニアに戻りたい気持ちも出てきた。&lt;/p&gt;
&lt;h2 id=&quot;技術&quot;&gt;技術&lt;/h2&gt;
&lt;p&gt;主な領域としては、コンテナというのは変わらず。Kubernetes コアの部分というよりかは kube-proxy とか CoreDNS あたりを触れていた時間が長い気がする。一方で、ネットワーク関連に強くなったかといえばそうでもない。2025 年は Kubernetes にコミットするなどもっと OSS に関わる年にしたいところである。&lt;/p&gt;
&lt;p&gt;だいぶ前から作って放置してる自作 DNS サーバーを完成させたいと思って RFC 読んだらいつも発見があって面白い、そろそろ完成させてちゃんと公開したい。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;Domain Name Compression に RDATA の圧縮についてちゃんと書かれていた&lt;a href=&quot;https://t.co/LoJJeTKnnD&quot;&gt;https://t.co/LoJJeTKnnD&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(26) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1858121198527488299?ref_src=twsrc%5Etfw&quot;&gt;November 17, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;コード書く時は、Sourcegraph の &lt;a href=&quot;https://sourcegraph.com/cody&quot;&gt;Cody&lt;/a&gt; を使うようになった。GitHub Copilot でも良い気がするが正直違いはわからない。そもそも AI の進化が早く Cursor とか Cline とか色々出てきているもののキャッチアップできていない。コードは自分で書くからこそ楽しさがあるという思いはあったが、検索する代わりに ChatGPT とか Perplexity に投げることで便利さを享受しているので、結局はどう活用するかというだけの話であった。&lt;/p&gt;
&lt;h2 id=&quot;英語&quot;&gt;英語&lt;/h2&gt;
&lt;p&gt;TOEIC を 2024 年の 1 月に受けてまあ妥当という点数を取った。そして、数ヶ月英語のみで仕事する機会があり英語力のなさを実感したので英語の勉強を頑張りたい。最近は &lt;a href=&quot;https://stackoverflow.blog/podcast&quot;&gt;The Stack Overflow Podcast&lt;/a&gt; を聞くなど意識はしている。&lt;/p&gt;
&lt;h2 id=&quot;筋トレ&quot;&gt;筋トレ&lt;/h2&gt;
&lt;p&gt;たまにジムに通うようになり、マシン中心にやるようになり、ベンチプレスなどのフリーウェイトもやるようになった。扱える重量が伸びると成長を感じて面白い。&lt;/p&gt;
&lt;h2 id=&quot;プライベート&quot;&gt;プライベート&lt;/h2&gt;
&lt;p&gt;箱根に連れて行ってもらったり、熱海とか韓国に行ったりした。やはり旅行は楽しい。&lt;br&gt;
韓国では、現金と &lt;a href=&quot;https://wise.com/&quot;&gt;Wise&lt;/a&gt; を使って過ごしてたが、急に Wise が使えなくなり焦ったものの、普段のクレカも持ってたので助かった。やはり信じられるのはアメックス様。&lt;/p&gt;
&lt;h2 id=&quot;総括&quot;&gt;総括&lt;/h2&gt;
&lt;p&gt;来年も引き続き、プライベートも仕事も頑張りましょう。&lt;/p&gt;</content:encoded></item><item><title>CoreDNS の仕組みとプラグイン</title><link>https://blog.sakamo.dev/post/coredns-plugins/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/coredns-plugins/</guid><description>&lt;a href=&quot;https://coredns.io/&quot;&gt;CoreDNS&lt;/a&gt; がどうやって動いているかをプラグインをもとに調べた</description><pubDate>Sun, 29 Dec 2024 09:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;概要&quot;&gt;概要&lt;/h2&gt;
&lt;p&gt;CoreDNS は、Go で実装された DNS サーバーであり、Kubernetes の DNS サーバーとしても利用されている。&lt;br&gt;
特徴的な仕組みとして、プラグインという仕組みがあり、殆どの機能はプラグインで実装されており、プラグインを自分で実装することも可能である。&lt;/p&gt;
&lt;p&gt;CoreDNS のローカルでのビルドおよび実行は、簡単に行うことができる。&lt;br&gt;
具体的には、下記のように make コマンドを実行することで、ビルドを行える。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/coredns/coredns.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; make&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ビルドが完了すると、&lt;code&gt;coredns&lt;/code&gt; というバイナリが生成されるので、実行することで CoreDNS が起動する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;maxprocs:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Leaving&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GOMAXPROCS=12:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; quota&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; undefined&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CoreDNS-1.12.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;darwin/amd64,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; go1.23.3,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 177253340&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;基礎&quot;&gt;基礎&lt;/h2&gt;
&lt;p&gt;CoreDNS では、Corefile という設定ファイルを読み込み、その設定に従って DNS サーバーを起動する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Corefile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:10053&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    forward&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./coredns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;maxprocs:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Leaving&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GOMAXPROCS=12:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; quota&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; undefined&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:10053&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CoreDNS-1.12.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;darwin/amd64,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; go1.23.3,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 177253340&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] 127.0.0.1:63479 - 32124 &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;A IN example.com. udp 40 false 4096&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; NOERROR qr,rd,ra,ad 67 0.005239353s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上記のような Corefile を用意することで、下記のような動作を行うようになる。&lt;br&gt;
errors プラグインが有効でない場合、デフォルトではエラーログは出力されないので、エラーを確認したいなら有効にしましょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10053 番ポートで DNS サーバーを起動する&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://coredns.io/plugins/forward/&quot;&gt;forward&lt;/a&gt; プラグインにより 1.1.1.1 に DNS クエリを転送する&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://coredns.io/plugins/log/&quot;&gt;log&lt;/a&gt; プラグインによりクエリログを出力する&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://coredns.io/plugins/errors/&quot;&gt;errors&lt;/a&gt; プラグインによりエラーログを出力する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もし、Corefile が存在しない場合は、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/core/dnsserver/register.go#L19-L31&quot;&gt;デフォルトの設定&lt;/a&gt;で起動するようになっており、&lt;a href=&quot;https://coredns.io/plugins/whoami/&quot;&gt;whoami&lt;/a&gt; と &lt;a href=&quot;https://coredns.io/plugins/log/&quot;&gt;log&lt;/a&gt; プラグインが有効になっている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	caddy.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;RegisterServerType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(serverType, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;caddy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ServerType&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Directives: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() []&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Directives },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		DefaultInput: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;caddy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Input&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;			return&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CaddyfileInput&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;				Filepath:       &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Corefile&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;				Contents:       []&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;byte&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.:&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Port &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot; {&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;whoami&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;				ServerTypeName: serverType,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		NewContext: newContext,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;corefile&quot;&gt;Corefile&lt;/h3&gt;
&lt;p&gt;Corefile は、&lt;a href=&quot;https://caddyserver.com/docs/caddyfile&quot;&gt;Caddyfile&lt;/a&gt; と同じようにパースされるものとなっており、環境変数等を使用することが可能である。&lt;br&gt;
なお、内部的に使用している &lt;a href=&quot;https://github.com/coredns/caddy&quot;&gt;coredns/caddy&lt;/a&gt; は &lt;a href=&quot;https://github.com/caddyserver/caddy&quot;&gt;caddyserver/caddy&lt;/a&gt; の v1 のフォークであるため、v2 の機能を利用することはできない。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;forward . {$FORWARDS}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ FORWARDS=1.1.1.1 ./coredns&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、複数のゾーンを指定することができ、それぞれのゾーンに対して別の設定を行うこともできる。&lt;br&gt;
たとえば、example.net では hosts プラグインを有効にし、それ以外では forward プラグインを有効にするような設定を行うことができる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:10053&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    forward&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example.net:10053&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    hosts&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        127.0.0.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.net&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;プラグインの仕組み&quot;&gt;プラグインの仕組み&lt;/h2&gt;
&lt;p&gt;Corefile でデフォルトで使うことができるプラグインは、&lt;a href=&quot;https://coredns.io/plugins/&quot;&gt;Plugins&lt;/a&gt; から確認することができる。&lt;br&gt;
これらのプラグインは、&lt;a href=&quot;https://github.com/coredns/coredns/tree/v1.12.0/plugin&quot;&gt;plugin&lt;/a&gt; に実装があり、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin.cfg&quot;&gt;plugin.cfg&lt;/a&gt; に定義されているプラグインがビルド時に追加されるようになっている。&lt;/p&gt;
&lt;p&gt;また、&lt;a href=&quot;https://coredns.io/explugins/&quot;&gt;External Plugins&lt;/a&gt; に記載されているプラグインは、plugin.cfg に定義されていない外部のプラグインとなるため、自分で追記した上でビルドする必要がある。&lt;/p&gt;
&lt;p&gt;では、具体的にどのように plugin.cfg に定義されているプラグインがビルド時に追加されるかというと、&lt;code&gt;go generate&lt;/code&gt; コマンドを実行することで、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/coredns.go#L3&quot;&gt;plugin.go&lt;/a&gt; で定義されている &lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/directives_generate.go&quot;&gt;directives_generate.go&lt;/a&gt; が plugin.cfg を読み込んでコードを生成するようになっている。&lt;br&gt;
その結果、 &lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/core/dnsserver/zdirectives.go&quot;&gt;core/dnsserver/zdirectives.go&lt;/a&gt; および &lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/core/plugin/zplugin.go&quot;&gt;core/plugin/zplugin.go&lt;/a&gt; が生成されて、プラグインを使用することができるようになる。&lt;/p&gt;
&lt;h3 id=&quot;プラグインの順番&quot;&gt;プラグインの順番&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://coredns.io/manual/plugins/#configuration&quot;&gt;Configuration&lt;/a&gt; に記載があるとおり、各プラグインが実行される順番は Corefile の順番ではなく、plugin.cfg に定義されている順番で実行される。&lt;br&gt;
たとえば、&lt;a href=&quot;https://coredns.io/plugins/cache/&quot;&gt;cache&lt;/a&gt; プラグインが使用している場合、キャッシュが存在すれば、それ以降のプラグインは実行されない。&lt;br&gt;
このため、Corefile に記載するプラグインの順番を気にする必要はない。&lt;/p&gt;
&lt;h3 id=&quot;プラグインの追加&quot;&gt;プラグインの追加&lt;/h3&gt;
&lt;p&gt;サンプルプラグインとして、&lt;a href=&quot;https://github.com/coredns/example&quot;&gt;example&lt;/a&gt; が提供されているので、これを使ってプラグインの追加を試すことができる。&lt;br&gt;
plugin.cfg に下記のように追加し、make コマンドを実行することで、example プラグインが追加された状態でビルドされる。&lt;br&gt;
また、前述したとおり、plugin.cfg に定義されているプラグインの順番は重要なため、今回の場合、example プラグインは forward プラグインより前に定義する必要がある。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;example:github.com/coredns/example&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;forward:forward&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; diff&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; core/dnsserver/zdirectives.go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; core/plugin/zplugin.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;diff&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a/core/dnsserver/zdirectives.go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; b/core/dnsserver/zdirectives.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 56174955c..91ef82a7d&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100644&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a/core/dnsserver/zdirectives.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+++&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; b/core/dnsserver/zdirectives.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;@@&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -56,6&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; +56,7&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @@&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Directives&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []string{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;secondary&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;etcd&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;loop&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       &quot;example&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;forward&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;grpc&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;erratic&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;diff&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a/core/plugin/zplugin.go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; b/core/plugin/zplugin.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 12bb4ce15..59bb64a51&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 100644&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;---&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a/core/plugin/zplugin.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+++&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; b/core/plugin/zplugin.go&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;@@&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -57,4&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; +57,5&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @@&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        _&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;github.com/coredns/coredns/plugin/tsig&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        _&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;github.com/coredns/coredns/plugin/view&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        _&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;github.com/coredns/coredns/plugin/whoami&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       _&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;github.com/coredns/example&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;もし、プラグインが追加されていない場合は、CoreDNS の起動時に Corefile のパースに失敗する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Corefile:6&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; during&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; parsing:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Unknown&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; directive&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;example&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;サンプルプラグイン&quot;&gt;サンプルプラグイン&lt;/h3&gt;
&lt;p&gt;example プラグインでは、log.Info および log.Debug を使用しており、log.Debug の出力を確認するためには &lt;a href=&quot;https://coredns.io/plugins/debug/&quot;&gt;debug&lt;/a&gt; プラグインも有効にする必要がある。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.:10053 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    forward . 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    debug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    example&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;example プラグインを有効にした状態で、上記の Corefile を使用することで、クエリの実行時に example プラグインが実行されログが出力されるようになる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[DEBUG] plugin/example: Received response&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] plugin/example: example&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] 127.0.0.1:65349 - 13760 &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;A IN example.com. udp 40 false 4096&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; NOERROR qr,rd,ra,ad 67 0.013614538s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;もし、debug プラグインが有効でない場合、log.Debug は出力されない。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] plugin/example: example&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] 127.0.0.1:49451 - 57280 &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;A IN example.com. udp 40 false 4096&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; NOERROR qr,rd,ra,ad 67 0.008662355s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;プラグインの実装&quot;&gt;プラグインの実装&lt;/h3&gt;
&lt;p&gt;プラグインを実装する方法については、&lt;a href=&quot;https://coredns.io/manual/toc/#writing-plugins&quot;&gt;Writing Plugins&lt;/a&gt; および &lt;a href=&quot;https://coredns.io/2017/03/01/how-to-add-plugins-to-coredns/&quot;&gt;How to Add Plugins to CoreDNS&lt;/a&gt; に記載がある。&lt;br&gt;
より具体的には、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/plugin.go#L50-L53&quot;&gt;plugin.Handler interface&lt;/a&gt; を実装し、AddPluggin でプラグインを登録することで実装できる。&lt;br&gt;
&lt;a href=&quot;https://github.com/coredns/example/tree/master&quot;&gt;example&lt;/a&gt; プラグインがわかりやすいので参考にすると良い。&lt;/p&gt;
&lt;p&gt;はじめに、&lt;a href=&quot;https://github.com/coredns/example/blob/master/setup.go&quot;&gt;setup&lt;/a&gt; を通して、plugin.Handler interface を実装している Example struct をプラグインとして追加している。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	// Add the Plugin to CoreDNS, so Servers can use it in their plugin chain.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	dnsserver.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;GetConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(c).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;AddPlugin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; plugin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;plugin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Handler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		return&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Example&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{Next: next}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/coredns/example/blob/master/example.go#L27&quot;&gt;ServeDNS&lt;/a&gt; では、プラグインが実行された際の処理を実装している。
また、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/plugin.go#L73&quot;&gt;plugin.NextOrFailure&lt;/a&gt; を使用することで、次のプラグインに処理を委譲することができる。&lt;br&gt;
このため、plugin.NextOrFailure を意図的に呼びださないことで、プラグインチェーンの途中で処理を止めることができる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;e &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Example&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ServeDNS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ctx&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Context&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;w&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ResponseWriter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Msg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;また、各プラグインでは、ログを出力するために、&lt;a href=&quot;https://github.com/coredns/coredns/tree/v1.12.0/plugin/pkg/log&quot;&gt;github.com/coredns/coredns/plugin/pkg/log&lt;/a&gt; を使用することができる。&lt;br&gt;
このパッケージは、Go の log パッケージをラップしたもので、ログレベルのプレフィックスをつけたり、debug プラグインによって有効化されるデバッグログの管理も行なっている。&lt;/p&gt;
&lt;h2 id=&quot;各プラグインの仕組み&quot;&gt;各プラグインの仕組み&lt;/h2&gt;
&lt;p&gt;例として、いくつかのプラグインの実装を見ていく。&lt;/p&gt;
&lt;h3 id=&quot;cache&quot;&gt;cache&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://coredns.io/plugins/cache/&quot;&gt;cache&lt;/a&gt; プラグインは、TTL をもとにクエリの結果をキャッシュすることができる。&lt;br&gt;
どのようにキャッシュを行なっているかというと、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/cache/handler.go#L38-L43&quot;&gt;plugin/cache/handler.go&lt;/a&gt; で &lt;code&gt;dns.ResponseWriter&lt;/code&gt; のラッパーを作成し処理を移譲、その後のプラグインで &lt;code&gt;WriteMsg()&lt;/code&gt; が呼ばれたらラッパーの &lt;code&gt;WriteMsg()&lt;/code&gt; が呼ばれて、キャッシュするという仕組みである。&lt;/p&gt;
&lt;p&gt;forward と cache プラグインを有効化した際の具体的な処理の流れとしては、下記のようになっている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/cache/handler.go#L42&quot;&gt;plugin/cache/handler.go:42&lt;/a&gt; - キャッシュが存在するか確認し、存在しなければ &lt;code&gt;dns.ResponseWriter&lt;/code&gt; のラッパーを作成する&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/cache/handler.go#L108&quot;&gt;plugin/cache/handler.go:108&lt;/a&gt; - &lt;code&gt;plugin.NextOrFailure&lt;/code&gt; を呼び出し、次のプラグインに処理を委譲する&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/forward/forward.go#L208&quot;&gt;plugin/forward/forward.go:208&lt;/a&gt; - forward プラグイン内でラッパーの &lt;code&gt;WriteMsg()&lt;/code&gt; を呼び出す&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/cache/cache.go#L184&quot;&gt;plugin/cache/cache.go:184&lt;/a&gt; - ラッパーの &lt;code&gt;WriteMsg()&lt;/code&gt; でキャッシュを行い、&lt;code&gt;dns.ResponseWriter&lt;/code&gt; の &lt;code&gt;WriteMsg()&lt;/code&gt; を呼び出す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ログを確認するとわかるとおり、キャッシュ後はレスポンスが早くなっている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] 127.0.0.1:64375 - 49069 &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;A IN example.com. udp 40 false 4096&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; NOERROR qr,rd,ra,ad 56 0.019756003s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[INFO] 127.0.0.1:50379 - 49563 &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;A IN example.com. udp 40 false 4096&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; NOERROR qr,aa,rd,ra,ad 56 0.000075345s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ready&quot;&gt;ready&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://coredns.io/plugins/ready/&quot;&gt;ready&lt;/a&gt; プラグインは、&lt;code&gt;/ready&lt;/code&gt; エンドポイントを有効にし、すべてのプラグインが使用可能なら OK、そうでなければ使用可能ではないプラグインを出力する。&lt;br&gt;
どういう時に使うかというと、Kuberentes において CoreDNS がリクエストを受ける準備が完了したか確認するための readinessProbe を設定するために使用する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; localhost:8181/ready&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;HTTP/1.1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 200&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Date:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Wed,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Jan&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2025&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 16:24:44&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GMT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Content-Length:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Content-Type:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; text/plain&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; charset&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;utf-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; localhost:8181/ready&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;HTTP/1.1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 503&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Service&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Unavailable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Date:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Wed,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Jan&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2025&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 16:24:16&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GMT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Content-Length:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Content-Type:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; text/plain&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; charset&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;utf-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;errors,log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;より具体的には、各プラグインで &lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/ready/readiness.go&quot;&gt;Readiness interface&lt;/a&gt; を実装することで、ready プラグインはそれを使用して、プラグインが使用可能かどうかを確認する。&lt;br&gt;
なお、errors や log プラグインは、Readiness interface を実装していないので、上記の結果になることはない。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// The Readiness interface needs to be implemented by each plugin willing to provide a readiness check.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Readiness&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	// Ready is called by ready to see whether the plugin is ready.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;	Ready&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;prometheus&quot;&gt;prometheus&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://coredns.io/plugins/metrics/&quot;&gt;prometheus&lt;/a&gt; プラグインは、prometheus および各プラグインが集計したメトリクスを prometheus 形式で出力するプラグインである。&lt;br&gt;
メトリクスは、&lt;code&gt;localhost:9153/metrics&lt;/code&gt; で公開されるようになっている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; localhost:9153/metrics&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns_cache_hits_total&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HELP coredns_cache_hits_total The count of cache hits.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# TYPE coredns_cache_hits_total counter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;coredns_cache_hits_total&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{server=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;dns://:10053&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,view&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;,zones&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;実装としてはシンプルで、promhttp パッケージを使用して /metrics に対する HTTP ハンドラを登録、coredns_dns_requests_total などのメトリクスを集計している。&lt;br&gt;
また、各プラグインでは、promauto パッケージを使用してメトリクスを定義しているので、このプラグインを有効化するだけでメトリクスを収集することができる。&lt;br&gt;
たとえば、cache プラグインでは、&lt;a href=&quot;https://github.com/coredns/coredns/blob/v1.12.0/plugin/cache/metrics.go&quot;&gt;plugin/cache/metrics.go&lt;/a&gt; にメトリクスを定義している。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	// cacheHits is counter of cache hits by cache type.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	cacheHits &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; promauto.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewCounterVec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;prometheus&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CounterOpts&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Namespace: plugin.Namespace,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Subsystem: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;cache&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Name:      &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;hits_total&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		Help:      &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;The count of cache hits.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}, []&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;zones&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;view&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>Goodbye 2023</title><link>https://blog.sakamo.dev/post/review-2023/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2023/</guid><description>2023 年も終わりなので振り返る。</description><pubDate>Sun, 31 Dec 2023 04:07:30 GMT</pubDate><content:encoded>&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;p&gt;転職して 2 年 4 ヶ月が経過した。過去の会社の在籍期間の中で最長となった。&lt;/p&gt;
&lt;p&gt;去年はコードを書くことはなかったが、今年は CDK とか React を少しだけ書いたので、全くコードを書かないということはなかった。グローバルでの仕事も行っていたのでたまに英語で会話することもあったが、英語はやはり難しい。&lt;br&gt;
4 月には、EKS に詳しくなって assessment を通過したので、&lt;a href=&quot;https://www.credly.com/badges/983c6ef4-c566-448e-a1cb-a3236924730d&quot;&gt;EKS (Container Service for Kubernetes) Subject Matter Expert&lt;/a&gt; というのを取得した。&lt;/p&gt;
&lt;h2 id=&quot;技術&quot;&gt;技術&lt;/h2&gt;
&lt;p&gt;主な領域としては、コンテナというのは変わらず。Kubernetes のソースコードを読む機会は少なくなかったので多少詳しくなったといえる。&lt;/p&gt;
&lt;p&gt;Multipass を使った Kubernetes 環境を用意してみたが、思いのほか便利であった。リポジトリは &lt;a href=&quot;https://github.com/ryota-sakamoto/kubernetes-on-multipass&quot;&gt;ryota-sakamoto/kubernetes-on-multipass&lt;/a&gt; である。クラスターを作ったり壊したりが簡単にできて検証が捗った。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;k3s とかの軽量 Kubernetes が使いたいわけではないから cloud-init で kubeadm 使うやつ書いたけど快適だな&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1639936120371945473?ref_src=twsrc%5Etfw&quot;&gt;March 26, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;eBPF を学ぶため Learning eBPF を読んでいたが完走しなかった。今は日本語訳も出ているのでそちらを読むのがいい気がしている。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;これ読み始めた&lt;a href=&quot;https://t.co/bfcfZt5bb4&quot;&gt;https://t.co/bfcfZt5bb4&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1655613339593236483?ref_src=twsrc%5Etfw&quot;&gt;May 8, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;ISUCON 13 で 3 位を取った。詳細は &lt;a href=&quot;/post/isucon13/&quot;&gt;ISUCON 13 で 3 位でした(ultra_fast_gopher)&lt;/a&gt; に書いたが、ISUCON 7 から毎年参加しており 3 位という順位を取れたのは嬉しかった。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;3位でした &lt;a href=&quot;https://twitter.com/hashtag/isucon?src=hash&amp;#x26;ref_src=twsrc%5Etfw&quot;&gt;#isucon&lt;/a&gt; &lt;a href=&quot;https://t.co/rHFsUdySzR&quot;&gt;pic.twitter.com/rHFsUdySzR&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1728363018147557872?ref_src=twsrc%5Etfw&quot;&gt;November 25, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;資格&quot;&gt;資格&lt;/h2&gt;
&lt;p&gt;2 月あたりに CKA を受けて受かった。CKAD と比べると難易度はそこまで変わらないという印象を受けた。CKS は受けようと思っていたが expire した。&lt;br&gt;
TOEIC を受けようと思っていたが忘れていたので来年受けようと思う。&lt;/p&gt;
&lt;h2 id=&quot;筋トレ&quot;&gt;筋トレ&lt;/h2&gt;
&lt;p&gt;筋トレは継続しており、懸垂マシンとダンベルをもらった。懸垂マシンは懸垂以外にもディップスができたりするので色々な筋トレができて便利である。ダンベルはベンチが欲しいという気持ちがある。&lt;br&gt;
また、ジムに行くのはやはりめんどくさいので、このまま道具を増やす可能性が高い。&lt;/p&gt;
&lt;h2 id=&quot;総括&quot;&gt;総括&lt;/h2&gt;
&lt;p&gt;来年も引き続き、プライベートも仕事も頑張りましょう。&lt;/p&gt;</content:encoded></item><item><title>ISUCON 13 で 3 位でした(ultra_fast_gopher)</title><link>https://blog.sakamo.dev/post/isucon13/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/isucon13/</guid><description>ISUCON 13 に ultra_fast_gopher(&lt;a href=&quot;https://twitter.com/_tsuzu_&quot;&gt;Tsuzu&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/__MOX__&quot;&gt;mox.si&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/let_constant&quot;&gt;AL1C3&lt;/a&gt;) で参加して、214,941 点 で 3 位で入賞した</description><pubDate>Sat, 30 Dec 2023 08:23:13 GMT</pubDate><content:encoded>&lt;h2 id=&quot;やったこと&quot;&gt;やったこと&lt;/h2&gt;
&lt;p&gt;リポジトリは &lt;a href=&quot;https://github.com/ultra-fast-gopher/isucon13&quot;&gt;ultra-fast-gopher/isucon13&lt;/a&gt; で公開してある、当然ながら言語は Go を選択した。&lt;/p&gt;
&lt;p&gt;アプリケーションに対する改善としては下記を行った。DNS の実装や、bcrypt を逃したりがスコアに効いていた記憶がある。キャッシュは最終手段と言われているが、改善できるところがなくなってもキャッシュするとスコアが伸びるので正義であった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;遅いクエリに INDEX を貼る&lt;/li&gt;
&lt;li&gt;N+1 を剥がす&lt;/li&gt;
&lt;li&gt;DB に icon_hash を持って、条件付き GET リクエストに対応&lt;/li&gt;
&lt;li&gt;DNS を実装して水責めに対応&lt;/li&gt;
&lt;li&gt;DB から画像を剥がす&lt;/li&gt;
&lt;li&gt;色々キャッシュ&lt;/li&gt;
&lt;li&gt;JSONSerializer を早くする&lt;/li&gt;
&lt;li&gt;bcrypt を余裕のあるサーバーで実行&lt;/li&gt;
&lt;li&gt;不要なトランザクションを剥がす&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;デプロイには GitHub Actions の self-hosted runners を使用して各インスタンスへのデプロイを行い Discord への通知を行った。通知がきたらベンチマークを実行すればいいので便利だった。また、master ブランチおよび PR への push を契機にデプロイを行っていたので、気軽に改善をデプロイすることができ、高速にイテレーションを回すことができた。&lt;/p&gt;
&lt;p&gt;インスタンスへの接続には、Tailscale を使用した。セキュリティグループがどうとか気にしなくていいし、GitHub の Organization で tailnet を共有できるのでとても便利だった。&lt;/p&gt;
&lt;p&gt;アプリケーションの解析には、&lt;a href=&quot;https://github.com/kaz/pprotein&quot;&gt;pprotein&lt;/a&gt; を使用した。pprof やスロークエリを簡単に見ることができるのでとても便利であった。phpMyAdmin もインデックスを簡単に貼れたり便利だった。&lt;/p&gt;
&lt;p&gt;やり残した点として、アプリケーションとベンチマーカーへの理解があげられる。アプリケーションの特性を理解し、ベンチマーカーが何をしているのか理解することで、さらに点数は伸ばす余地があったように思う。たとえば、投げ銭やモデレーションといった点に対して対応する時間がなかった。&lt;/p&gt;
&lt;h2 id=&quot;スクショ&quot;&gt;スクショ&lt;/h2&gt;
&lt;p&gt;文字だけなのもあれなので、スクショを貼ることにする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 位を出した時&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/163704.CYmPnQ4__1U5twv.webp&quot; alt width=&quot;2038&quot; height=&quot;614&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最後までベンチマークを回し続けた、危なかった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/benchmark.CYljiG71_ZozC9v.webp&quot; alt width=&quot;2036&quot; height=&quot;1188&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;感想&quot;&gt;感想&lt;/h2&gt;
&lt;p&gt;元々毎年別のチームで参加していたものの、チームメンバーの都合により ultra_fast_gopher へ入れてもらったので足を引っ張らないが不安であったが、このように結果を残すことができて良かった。個人としては、ISUCON 7 から毎年参加しており入賞を目標としていたので、3 位という順位を取れ満足のいく結果ではあった。&lt;br&gt;
一方で、改善できそうでできなかった点や、問題に対する理解を深めることでさらに点を伸ばせる可能性もあったので、来年に向け精進していきたい。&lt;/p&gt;
&lt;h2 id=&quot;景品&quot;&gt;景品&lt;/h2&gt;
&lt;p&gt;「TOP30チーム」と「はてな賞」をもらった。ありがとうございます。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;ありがとうございます &lt;a href=&quot;https://twitter.com/hashtag/isucon?src=hash&amp;#x26;ref_src=twsrc%5Etfw&quot;&gt;#isucon&lt;/a&gt; &lt;a href=&quot;https://t.co/JdCEewz2eh&quot;&gt;pic.twitter.com/JdCEewz2eh&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1741309486873403654?ref_src=twsrc%5Etfw&quot;&gt;December 31, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;</content:encoded></item><item><title>Nodelocal DNSCache とはなにか</title><link>https://blog.sakamo.dev/post/node-local-dns-cache/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/node-local-dns-cache/</guid><description>&lt;a href=&quot;https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/&quot;&gt;Using NodeLocal DNSCache in Kubernetes Clusters&lt;/a&gt; に書いてある</description><pubDate>Wed, 19 Apr 2023 14:13:48 GMT</pubDate><content:encoded>&lt;h2 id=&quot;概要&quot;&gt;概要&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/&quot;&gt;公式ドキュメント&lt;/a&gt; で紹介されているとおり、DNS のキャッシュ用エージェント（CoreDNS）を DaemonSet で各 Node に配置することで、DNS のパフォーマンスを改善しようというものである。やってること自体はシンプルで、キャッシュがあればそれを返すし、なければ kube-dns に問い合わせたり、Node 上の /etc/resolv.conf を参照して名前解決をしたりする。&lt;br&gt;
ソースコードは、&lt;a href=&quot;https://github.com/kubernetes/dns&quot;&gt;Kubernetes DNS&lt;/a&gt; にある。&lt;/p&gt;
&lt;h2 id=&quot;仕組み&quot;&gt;仕組み&lt;/h2&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/nodelocaldns.68tf6CA3_2tIvWf.svg&quot; alt width=&quot;601&quot; height=&quot;501&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;公式ドキュメントの図がわかりやすいので引用した。&lt;/p&gt;
&lt;p&gt;デフォルト（clusterDNS: kube-dns）では、クライアント側の Pod の dnsPolicy が ClusterFirst の場合、kubelet に指定されている clusterDNS で名前解決を行う。&lt;br&gt;
Nodelocal DNSCache では kube-dns と同じ IP アドレスのインターフェースを作成、bind することで、kube-dns ではなく Nodelocal DNSCache へパケットをルーティングされるようにしている。169.254.20.10 は NodeLocal DNSCache の IP アドレスで、172.20.0.10 は kube-dns の IP アドレスである。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;17: nodelocaldns: &amp;#x3C;BROADCAST,NOARP&gt; mtu 1500 qdisc noop state DOWN group default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    link/ether c6:df:93:00:8f:3a brd ff:ff:ff:ff:ff:ff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    inet 169.254.20.10/32 scope global nodelocaldns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       valid_lft forever preferred_lft forever&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    inet 172.20.0.10/32 scope global nodelocaldns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;       valid_lft forever preferred_lft forever&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そして、流れてきた DNS クエリは、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.27.1/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml#L48-L102&quot;&gt;Corefile&lt;/a&gt; をもとに処理されていて、プレースホルダーについては後述する。&lt;br&gt;
この Corefile わかることは、それぞれ cache が設定されていて、&lt;code&gt;__PILLAR__DNS__DOMAIN__:53&lt;/code&gt;（in-addr.arpa:53、ip6.arpa:53） は &lt;code&gt;__PILLAR__CLUSTER__DNS__&lt;/code&gt; に forward されること、それ以外の場合は &lt;code&gt;__PILLAR__UPSTREAM__SERVERS__&lt;/code&gt; に forward されることである。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    __PILLAR__DNS__DOMAIN__:53 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        cache {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                success 9984 30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                denial 9984 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        reload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        forward . __PILLAR__CLUSTER__DNS__ {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                force_tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        prometheus :9253&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        health __PILLAR__LOCAL__DNS__:8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    .:53 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        cache 30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        reload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        loop&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        bind __PILLAR__LOCAL__DNS__ __PILLAR__DNS__SERVER__&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        forward . __PILLAR__UPSTREAM__SERVERS__&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        prometheus :9253&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このマニフェストでは、使用者側が置換するべきプレースホルダーがいくつか用意されている。&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;key&lt;/th&gt;&lt;th&gt;example value&lt;/th&gt;&lt;th&gt;description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PILLAR__DNS__DOMAIN&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;cluster.local&lt;/td&gt;&lt;td&gt;クラスター内で使用されるドメインを指定する。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PILLAR__LOCAL__DNS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;169.254.20.10&lt;/td&gt;&lt;td&gt;NodeLocal DNSCache が使用する IP アドレスを使用する、既存の IP アドレスと被ってなければなんでもいい。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PILLAR__DNS__SERVER&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;172.20.0.10&lt;/td&gt;&lt;td&gt;kube-dns の IP アドレスを指定する。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PILLAR__CLUSTER__DNS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;10.108.67.154&lt;/td&gt;&lt;td&gt;&lt;code&gt;-upstreamsvc&lt;/code&gt; に指定されたサービスの IP アドレス。デフォルトでは &lt;code&gt;-upstreamsvc&lt;/code&gt; には &lt;code&gt;kube-dns-upstream&lt;/code&gt; が指定されていて、手動で置換する必要はない。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;PILLAR__UPSTREAM__SERVERS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;/etc/resolv.conf&lt;/td&gt;&lt;td&gt;デフォルトでは &lt;code&gt;/etc/resolv.conf&lt;/code&gt; が指定されていて、手動で置換する必要はない。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ここで出てくる &lt;code&gt;kube-dns-upstream&lt;/code&gt; とはなにかというと、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.27.1/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml#L25-L46&quot;&gt;ここ&lt;/a&gt;で定義されている Service で、kube-dns の代わりである。NodeLocal DNSCache が動いている Node では、kube-dns の IP アドレスを使っても NodeLocal DNSCache へルーティングされるので、別の Service を用意することで疎通できるようにしている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-dns-upstream&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  namespace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  labels&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    k8s-app&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    kubernetes.io/cluster-service&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    addonmanager.kubernetes.io/mode&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Reconcile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    kubernetes.io/name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;KubeDNSUpstream&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  ports&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;UDP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    targetPort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;dns-tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    port&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    protocol&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;TCP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    targetPort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  selector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    k8s-app&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-dns&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そして Nodelocal DNSCache は、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.27.1/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml#L131&quot;&gt;ここ&lt;/a&gt;で定義されているとおり、dnsPolicy は Default である。このため、kubelet に指定されている resolvConf が Pod の /etc/resolv.conf として使用される。&lt;/p&gt;
&lt;p&gt;ここまでまとめると下記のような動作をする。&lt;/p&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;domain&lt;/th&gt;&lt;th&gt;behavior&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;内部ドメイン&lt;/td&gt;&lt;td&gt;キャッシュがあればそれを返す、なければ &lt;code&gt;kube-dns-upstream&lt;/code&gt; へ forward&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;外部ドメイン&lt;/td&gt;&lt;td&gt;キャッシュがあればそれを返す、なければ Nodelocal DNSCache が &lt;code&gt;/etc/resolv.conf&lt;/code&gt; をもとに名前解決を行う&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;インストール方法&quot;&gt;インストール方法&lt;/h2&gt;
&lt;h3 id=&quot;通常&quot;&gt;通常&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/#configuration&quot;&gt;公式ドキュメント&lt;/a&gt;で紹介されている方法は、kubernetes/kubernetes で提供されているマニフェストを使う方法である。前述した一部のプレースホルダーを置換することで完了する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/v1.27.1/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ kubedns=$(kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ sed -i &quot;s/__PILLAR__LOCAL__DNS__/169.254.20.10/g; s/__PILLAR__DNS__DOMAIN__/cluster.local/g; s/__PILLAR__DNS__SERVER__/$kubedns/g&quot; nodelocaldns.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ k apply -f nodelocaldns.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cilium&quot;&gt;cilium&lt;/h3&gt;
&lt;p&gt;cilium を使っている場合は注意が必要で、Local Redirect Policy を使わないと NodeLocal DNSCache ではなく kube-dns へクエリが飛ぶので動いていない状態となる。これについては&lt;a href=&quot;https://docs.cilium.io/en/v1.13/network/kubernetes/local-redirect-policy/#node-local-dns-cache&quot;&gt;ドキュメント&lt;/a&gt;に記載されており、下記のように cilium から提供されているマニフェストをそのまま使うのが簡単である。&lt;/p&gt;
&lt;p&gt;なお、hostNetwork を使っていなかったり、インターフェースが作成されないようになってるので色々違う。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ curl -O https://raw.githubusercontent.com/cilium/cilium/v1.13/examples/kubernetes-local-redirect/node-local-dns.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ kubedns=$(kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ sed -i &quot;s/__PILLAR__DNS__SERVER__/$kubedns/g;&quot; node-local-dns.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ kubectl apply -f node-local-dns.yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.13/examples/kubernetes-local-redirect/node-local-dns-lrp.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;検証&quot;&gt;検証&lt;/h2&gt;
&lt;p&gt;NodeLocal DNSCache と CoreDNS のログを出しつつ、検証用の Pod を立ててコマンドを実行して結果を見ていく。各 Pod と実行するコマンドは下記のとおりである。&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pod&lt;/th&gt;&lt;th&gt;IP&lt;/th&gt;&lt;th&gt;command&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CoreDNS&lt;/td&gt;&lt;td&gt;10.244.0.29&lt;/td&gt;&lt;td&gt;k -n kube-system logs -f -l k8s-app=kube-dns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NodeLocal DNSCache&lt;/td&gt;&lt;td&gt;172.23.111.195&lt;/td&gt;&lt;td&gt;k -n kube-system logs -f -l k8s-app=node-local-dns&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;netshoot&lt;/td&gt;&lt;td&gt;10.244.0.38&lt;/td&gt;&lt;td&gt;k run netshoot —image=nicolaka/netshoot -it — bash&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;内部ドメイン&quot;&gt;内部ドメイン&lt;/h3&gt;
&lt;p&gt;netshoot では、デフォルトで存在する kubernetes Service の名前解決を行うことにする。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;netshoot:~# dig kubernetes.default.svc.cluster.local.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NodeLocal DNSCache 側のログはこんな感じで、netshoot の IP アドレスが記録されている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] 10.244.0.38:51834 - 38845 &quot;A IN kubernetes.default.svc.cluster.local. udp 77 false 1232&quot; NOERROR qr,aa,rd 106 0.001695631s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CoreDNS 側のログはこんな感じで、NodeLocal DNSCache の IP アドレスが記録されている、&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] 172.23.111.195:57492 - 21023 &quot;A IN kubernetes.default.svc.cluster.local. tcp 77 true 65535&quot; NOERROR qr,aa,rd 106 0.00025829s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2 回目は、NodeLocal DNSCache だけでログが出ていて、キャッシュされているので早いことがわかる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] 10.244.0.38:37972 - 54802 &quot;A IN kubernetes.default.svc.cluster.local. udp 77 false 1232&quot; NOERROR qr,aa,rd 106 0.000112795s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;外部ドメイン&quot;&gt;外部ドメイン&lt;/h3&gt;
&lt;p&gt;netshoot では、外部ドメインとして example.com. の名前解決を行うことにする。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;netshoot:~# dig example.com.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;外部ドメインの場合は、NodeLocal DNSCache で名前解決が行われるので、NodeLocal DNSCache だけでログが出ている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] 10.244.0.38:56892 - 40871 &quot;A IN example.com. udp 52 false 1232&quot; NOERROR qr,rd,ra,ad 56 0.355279087s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2 回目はキャッシュされているので早いことがわかる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] 10.244.0.38:42148 - 17723 &quot;A IN example.com. udp 52 false 1232&quot; NOERROR qr,aa,rd,ra,ad 56 0.000070897s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cilium-1&quot;&gt;cilium&lt;/h3&gt;
&lt;p&gt;さて、cilium を使っている場合は、hubble observe を使うと簡単に経路を確認できる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;k -n kube-system exec -it cilium-p89s9 -c cilium-agent -- hubble observe --since 3m --pod kube-system/node-local-dns-f2mr6 -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内部ドメインの場合は、kube-dns で名前解決が行われていることが確認できる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.059: default/netshoot:47939 (ID:39341) -&gt; kube-system/node-local-dns-f2mr6:53 (ID:49464) to-endpoint FORWARDED (UDP)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.060: kube-system/node-local-dns-f2mr6:58070 (ID:49464) -&gt; kube-system/coredns-5d78c9869d-xh4ql:53 (ID:6868) to-endpoint FORWARDED (TCP Flags: SYN)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.060: kube-system/node-local-dns-f2mr6:58070 (ID:49464) &amp;#x3C;- kube-system/coredns-5d78c9869d-xh4ql:53 (ID:6868) to-endpoint FORWARDED (TCP Flags: SYN, ACK)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.060: kube-system/node-local-dns-f2mr6:58070 (ID:49464) -&gt; kube-system/coredns-5d78c9869d-xh4ql:53 (ID:6868) to-endpoint FORWARDED (TCP Flags: ACK)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.060: kube-system/node-local-dns-f2mr6:58070 (ID:49464) -&gt; kube-system/coredns-5d78c9869d-xh4ql:53 (ID:6868) to-endpoint FORWARDED (TCP Flags: ACK, PSH)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.062: kube-system/node-local-dns-f2mr6:58070 (ID:49464) &amp;#x3C;- kube-system/coredns-5d78c9869d-xh4ql:53 (ID:6868) to-endpoint FORWARDED (TCP Flags: ACK, PSH)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:01:09.063: default/netshoot:47939 (ID:39341) &amp;#x3C;- kube-system/node-local-dns-f2mr6:53 (ID:49464) to-endpoint FORWARDED (UDP)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;外部ドメインの場合は、NodeLocal DNSCache で名前解決が行われていることが確認できる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:02:09.529: default/netshoot:37900 (ID:39341) -&gt; kube-system/node-local-dns-f2mr6:53 (ID:49464) to-endpoint FORWARDED (UDP)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:02:09.530: kube-system/node-local-dns-f2mr6:35227 (ID:49464) -&gt; 10.188.1.1:53 (world) to-stack FORWARDED (UDP)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:02:09.530: kube-system/node-local-dns-f2mr6:35227 (ID:49464) &amp;#x3C;- 10.188.1.1:53 (world) to-endpoint FORWARDED (UDP)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Apr 18 15:02:09.531: default/netshoot:37900 (ID:39341) &amp;#x3C;- kube-system/node-local-dns-f2mr6:53 (ID:49464) to-endpoint FORWARDED (UDP)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>kube-proxy は何をしてるのか</title><link>https://blog.sakamo.dev/post/kube-proxy/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/kube-proxy/</guid><description>&lt;a href=&quot;https://github.com/kubernetes/kubernetes/tree/v1.26.0/pkg/proxy&quot;&gt;kube-proxy&lt;/a&gt; の実装を読む</description><pubDate>Fri, 06 Jan 2023 15:44:05 GMT</pubDate><content:encoded>&lt;h2 id=&quot;前置き&quot;&gt;前置き&lt;/h2&gt;
&lt;p&gt;Kubernetes において、kube-proxy がどのような動きをしているのか知ることは非常に重要である。ソースコード自体は読みやすい。&lt;/p&gt;













&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;日付&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2023-01-07&lt;/td&gt;&lt;td&gt;&lt;code&gt;v1.26.0&lt;/code&gt; の内容で公開&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;kube-proxy-とは&quot;&gt;kube-proxy とは&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/ja/docs/concepts/overview/components/#kube-proxy&quot;&gt;ドキュメント&lt;/a&gt;に書かれているとおり、kube-proxy は DaemonSet でデプロイされており、各 Node のネットワークプロキシとして動作する。&lt;a href=&quot;https://kubernetes.io/ja/docs/concepts/services-networking/service/&quot;&gt;Service&lt;/a&gt; の一部を実装しており、iptables や ipvs を使用してトラフィックを制御している。userspace も使えたが、v1.26 で&lt;a href=&quot;https://github.com/kubernetes/kubernetes/pull/112133&quot;&gt;削除&lt;/a&gt;された。&lt;/p&gt;
&lt;h2 id=&quot;cmdkube-proxyappservergo&quot;&gt;cmd/kube-proxy/app/server.go&lt;/h2&gt;
&lt;p&gt;早速ソースコードを読み始めるが、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/cmd/kube-proxy/app/server.go&quot;&gt;これ&lt;/a&gt;は kube-proxy の初期化やサーバーの起動を行っている。&lt;/p&gt;
&lt;p&gt;ここで重要なのは、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/cmd/kube-proxy/app/server_others.go#L73&quot;&gt;NewProxyServer&lt;/a&gt; で iptables と ipvs の proxier の初期化を行っている点である。メインの処理としては、proxier で行っているといっても過言ではない。ここでは、iptalbes の&lt;a href=&quot;#pkgproxyiptablesproxiergo&quot;&gt;実装&lt;/a&gt;を見ていくことにする。&lt;/p&gt;
&lt;h3 id=&quot;func-s-proxyserver-run-error&quot;&gt;func (s *ProxyServer) Run() error&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/cmd/kube-proxy/app/server.go#L651-L786&quot;&gt;ここ&lt;/a&gt;で、healthz・メトリクス・proxier の起動、healthz の設定とかをしている。&lt;/p&gt;
&lt;h2 id=&quot;pkgproxyiptablesproxiergo&quot;&gt;pkg/proxy/iptables/proxier.go&lt;/h2&gt;
&lt;p&gt;デュアルスタックに対応しているかどうかで &lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L219-L319&quot;&gt;NewProxier&lt;/a&gt; と &lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L321-L354&quot;&gt;NewDualStackProxier&lt;/a&gt; のどちらかが呼ばれる。関数自体は分かれているものの、NewDualStackProxier では ipv4 と ipv6 の分 NewProxier を呼び出しているだけなので、とりあえずは NewProxier の実装を見ていく。&lt;/p&gt;
&lt;h3 id=&quot;newproxier&quot;&gt;NewProxier&lt;/h3&gt;
&lt;p&gt;ここでは、NodePort を localhost で通信できるようにするための route_localnet、ブリッジしたパケットをフィルタリングするための bridge-nf-call-iptables が有効化されているかどうか確認している。ちなみに、v1.26 からは &lt;code&gt;--iptables-localhost-nodeports&lt;/code&gt; を指定することで localhost への通信を&lt;a href=&quot;https://github.com/kubernetes/kubernetes/pull/108250&quot;&gt;無効化できる&lt;/a&gt;ようになった。&lt;br&gt;
あとはマスカレード、&lt;a href=&quot;#pkgproxyhealthcheckservice_healthgo&quot;&gt;LoadBalancer のヘルスチェック用のサーバー&lt;/a&gt;の設定もしている。&lt;/p&gt;
&lt;h3 id=&quot;func-proxier-proxier-syncloop&quot;&gt;func (proxier *Proxier) SyncLoop()&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L498-L508&quot;&gt;ここ&lt;/a&gt;はなんかしている。重要なのは proxier.syncRunner.Loop で、NewProxier で下記のように&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L304-L307&quot;&gt;初期化&lt;/a&gt;されている。2 番目の引数に渡されている syncProxyRules が実行される関数で、メインの処理である。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	// We pass syncPeriod to ipt.Monitor, which will call us only if it needs to.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	// We need to pass *some* maxInterval to NewBoundedFrequencyRunner anyway though.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	// time.Hour is arbitrary.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	proxier.syncRunner &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; async.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewBoundedFrequencyRunner&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sync-runner&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, proxier.syncProxyRules, minSyncPeriod, time.Hour, burstSyncs)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;syncproxyrules&quot;&gt;syncProxyRules&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L799&quot;&gt;ここ&lt;/a&gt;はメインの処理で iptables のルールを生成している。800 行ぐらいしかないが、行数以上にでかい。&lt;/p&gt;
&lt;h4 id=&quot;snat&quot;&gt;SNAT&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L901-L923&quot;&gt;ここ&lt;/a&gt;で MARK がついている場合に SNAT をしている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-POSTROUTING&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mark&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mark&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0x00004000/0x00004000&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RETURN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-POSTROUTING&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MARK&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --xor-mark&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0x00004000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-POSTROUTING&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kubernetes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; service&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; traffic&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; requiring&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; SNAT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MASQUERADE&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --random-fully&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MARK のルールは&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L925-L931&quot;&gt;ここ&lt;/a&gt;で生成されている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-MARK-MASQ&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; MARK&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --or-mark&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0x00004000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そして、どういう場合に MARK がつくかというと、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L1255-L1310&quot;&gt;外部からのアクセス&lt;/a&gt;や&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L1236-L1252&quot;&gt;クラスタの IP 外からのアクセス&lt;/a&gt;、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L1385-L1389&quot;&gt;ループバック&lt;/a&gt;の時とかにつくルールが生成される。&lt;/p&gt;
&lt;h4 id=&quot;dnat&quot;&gt;DNAT&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L1369-L1397&quot;&gt;ここ&lt;/a&gt; で Service から Pod への DNAT を行っている。下記のようなルールが生成されて、各 Pod へリクエストが送られることがわかる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-FTG4NWKEUMM5OZ72&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 192.168.0.5&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-MARK-MASQ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-FTG4NWKEUMM5OZ72&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DNAT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --to-destination&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.0.5:53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-GHNVWKROTCCBFQKZ&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 192.168.1.2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-MARK-MASQ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-GHNVWKROTCCBFQKZ&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DNAT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --to-destination&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.2:53&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-QTGKLRHEXOFUNUWC&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 192.168.1.3&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-MARK-MASQ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-QTGKLRHEXOFUNUWC&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DNAT&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --to-destination&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3:53&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;さて、実際に DNAT していることを tcpdump を使って確認していく。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;node:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clusterIP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.615574&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 64,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51177,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [none], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 80)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.1.3.40884&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 10.96.0.10.domain:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [bad &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;udp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cksum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0xcc62&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0x2bdb!]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [1au] A&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; example.com. ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (52&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;node:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coredns&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pod&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;DNAT&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.615608&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 63,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51177,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [none], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 80)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.1.3.40884&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.0.5.domain:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [bad &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;udp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cksum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0x82a6&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0x7597!]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [1au] A&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; example.com. ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (52&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;controlplane:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.604418&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 63,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51177,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [none], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 80)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.1.3.40884&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.0.5.domain:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [udp &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ok]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [1au] A&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; example.com. ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (52&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;controlplane:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.604441&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 62,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51177,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [none], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 80)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.1.3.40884&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.0.5.domain:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [udp &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ok]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [1au] A&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; example.com. ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (52&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;controlplane:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.604696&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 64,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 65186,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [DF], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 107)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.0.5.domain&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3.40884:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [bad &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;udp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cksum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0x82c1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0x5737!]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; q:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; A?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1/0/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [18s] A 93.184.216.34 ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (79&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;controlplane:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.604706&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 63,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 65186,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [DF], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 107)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.0.5.domain&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3.40884:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [bad &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;udp&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cksum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0x82c1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0x5737!]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; q:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; A?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1/0/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [18s] A 93.184.216.34 ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (79&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;node:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.616404&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 63,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 65186,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [DF], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 107)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    192.168.0.5.domain&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3.40884:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [udp &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ok]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; q:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; A?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1/0/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [18s] A 93.184.216.34 ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (79&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17:22:36.616415&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; IP&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (tos &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0x0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ttl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 62,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 65186,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; offset&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 0,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flags&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [DF], proto UDP (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;), length 107)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    10.96.0.10.domain&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3.40884:&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [udp &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ok]&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 51013&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; q:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; A?&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 1/0/1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; example.com.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [18s] A 93.184.216.34 ar: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; OPT UDPsize&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1232&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; (79&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;writeservicetoendpointrules&quot;&gt;writeServiceToEndpointRules&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/iptables/proxier.go#L1599&quot;&gt;ここ&lt;/a&gt;では、Service の ClusterIP へのリクエストがきた際に、Pod へランダムに振り分けるためのルールを生成している。また、Service の sessionAffinity を指定した際のルールもここで生成されている。&lt;/p&gt;
&lt;p&gt;CoreDNS の replicas を 3 にした場合、下記のようなルールが生成されるのだが、ここで面白いのは &lt;code&gt;--probability&lt;/code&gt; に指定されている数値である。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SVC-TCOU7JCQXEZGVUNU&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.0.5:53&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; statistic&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mode&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; random&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --probability&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.3333333333&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-FTG4NWKEUMM5OZ72&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SVC-TCOU7JCQXEZGVUNU&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.2:53&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; statistic&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --mode&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; random&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --probability&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.5000000000&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-GHNVWKROTCCBFQKZ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SVC-TCOU7JCQXEZGVUNU&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3:53&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-QTGKLRHEXOFUNUWC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;iptables は上から順に評価されるので、下記のように振り分けられることになる。上から順に 1/N で割り振ることで、均等に振り分けることができるのである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;全てのリクエストの 1/3 を KUBE-SEP-FTG4NWKEUMM5OZ72 へ流す&lt;/li&gt;
&lt;li&gt;1 の残りのリクエスト（2/3）の 1/2 を KUBE-SEP-GHNVWKROTCCBFQKZ へ流す&lt;/li&gt;
&lt;li&gt;2 の残りのリクエスト（1/3）を KUBE-SEP-QTGKLRHEXOFUNUWC へ流す&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;sessionAffinity に ClientIP を指定した場合は、前述したルールの前に下記のルールが生成される。ここでは、タイムアウトとしてデフォルトの 10,800 秒（3 時間）が設定されており、最後のリクエストからタイムアウトの秒数が経過していなければ、同じ Pod へリクエストが流れることがわかる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SVC-TCOU7JCQXEZGVUNU&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.0.5:53&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; recent&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-FTG4NWKEUMM5OZ72&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --rcheck&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --seconds&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10800&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --reap&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-FTG4NWKEUMM5OZ72&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SVC-TCOU7JCQXEZGVUNU&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.2:53&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; recent&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-GHNVWKROTCCBFQKZ&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --rcheck&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --seconds&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10800&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --reap&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-GHNVWKROTCCBFQKZ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-A&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SVC-TCOU7JCQXEZGVUNU&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --comment&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kube-system/kube-dns:dns&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 192.168.1.3:53&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; recent&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-QTGKLRHEXOFUNUWC&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --rcheck&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --seconds&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10800&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --reap&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; KUBE-SEP-QTGKLRHEXOFUNUWC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pkgproxyhealthcheckservice_healthgo&quot;&gt;pkg/proxy/healthcheck/service_health.go&lt;/h2&gt;
&lt;p&gt;LoadBalancer のヘルスチェック用のサーバーは、&lt;a href=&quot;https://github.com/kubernetes/kubernetes/blob/v1.26.0/pkg/proxy/healthcheck/service_health.go#L83-L86&quot;&gt;NewServiceHealthServer&lt;/a&gt; により作成されている。&lt;/p&gt;
&lt;p&gt;そもそも LoadBalancer のヘルスチェック用のサーバーとは何かというと、type が LoadBalancer かつ externalTrafficPolicy が Local の場合に必要なもので、特定の Node に Endpoints が存在しない時にヘルスチェックを失敗させることで、その Node へトラフィックを流さないようにするものである。&lt;br&gt;
healthCheckNodePort を設定することでポートを指定でき、指定しなかった場合は自動で設定される。externalTrafficPolicy が Local ではない時に設定しようとすると、下記のようにエラーになる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;The&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Service&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;test-service&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; invalid:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; spec.healthCheckNodePort:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Invalid&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; value:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 32234:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; may&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; only&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; be&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; when&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;LoadBalancer&apos;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;externalTrafficPolicy&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;Local&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これをどう使うかというと、下記のように Node に対してリクエストを送るとヘルスチェックができる。エンドポイントが存在すれば 200、存在しなければ 503 が返ってくるのでこれでその Node へトラフィックを流してもいいかどうかわかる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; k&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; node&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; node01&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; wide&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     STATUS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   ROLES&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    AGE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   VERSION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   INTERNAL-IP&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   EXTERNAL-IP&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   OS-IMAGE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;             KERNEL-VERSION&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      CONTAINER-RUNTIME&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;node01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Ready&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   16d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   v1.26.0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   172.30.2.2&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Ubuntu&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 20.04.5&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; LTS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   5.4.0-131-generic&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   containerd://1.6.12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; k&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; service&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; test-service&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; json&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; jq&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .spec.healthCheckNodePort&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;32234&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 172.30.2.2:32234&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -v&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;   Trying 172.30.2.2:32234...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; TCP_NODELAY set&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Connected to 172.30.2.2 (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;172.30.2.2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) port 32234 (#0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; GET&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Host: 172.30.2.2:32234&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; User-Agent: curl/7.68.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Accept: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Mark bundle as not supporting multiuse&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; HTTP/1.1 503 Service Unavailable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Content-Type: application/json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; X-Content-Type-Options: nosniff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Date: Sun, 08 Jan 2023 12:11:40 GMT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Content-Length: 93&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;service&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                &quot;namespace&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;default&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;                &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;test-service&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        &quot;localEndpoints&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Connection &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#0 to host 172.30.2.2 left intact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>Goodbye 2022</title><link>https://blog.sakamo.dev/post/review-2022/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2022/</guid><description>2022 年も終わりなので振り返る。</description><pubDate>Sat, 31 Dec 2022 13:04:20 GMT</pubDate><content:encoded>&lt;p&gt;去年はもうちょっと余裕を持って書いていたが、今年はもう年越し直前で蕎麦を食べながら書いている。&lt;/p&gt;
&lt;!-- ## プライベート

去年と同様に、今年もそこそこ経済を回した。  
今年はより食にフォーカスした年となり、鮨とかイタリアンとかまた行きたいと思えるお店を見つけることができたし良かった。  
今年もいろいろありがとう。 --&gt;
&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;p&gt;転職して 1 年 4 ヶ月が経過した。ソフトウェアエンジニアではなくなったので、仕事としてコードを書くことはないが、今のところそれ自体が苦しいことはない。仕事内容は良く同僚にも恵まれており日々の学びが多いためとても充実している。&lt;br&gt;
ソフトウェアエンジニアに戻るかどうかについては、今すぐに戻りたいということはなく、まあそのうち戻るだろうという感じではある。興味のあるチーム自体はいろいろあるのでどこかのチームの人と話してみたい。&lt;/p&gt;
&lt;h2 id=&quot;技術&quot;&gt;技術&lt;/h2&gt;
&lt;p&gt;主な領域としては、コンテナというのは変わらず。あとは IaC だったり、興味のある分野とかやりたい分野は一貫して変わっていない。&lt;br&gt;
まあでも最新トレンドを追うというよりかは、クラウドの技術にシフトした感じがする。&lt;/p&gt;
&lt;p&gt;久しぶりに本をちゃんと読んだ。この本は、Kubernetes の基本的なネットワークについて学ぶことができ、netns とか iptables がどう使われているのかわかる。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;Networking and Kubernetes 読み始めた&lt;a href=&quot;https://t.co/BzDG3gmyR1&quot;&gt;https://t.co/BzDG3gmyR1&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1512373815182958595?ref_src=twsrc%5Etfw&quot;&gt;April 8, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;個人的に記憶にあるのが Zig とか Erlang を触ったことである。Zig は手に馴染む感じがせず Rust で良くねと思った。Erlang はパターンマッチが強く、Scala を初めて書いた時と同じような面白さを感じたし、多分 2023 年も触っている気がする。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;Zig が流行ってるのでとりあえず触ってみた &lt;a href=&quot;https://t.co/cHXcTePYAG&quot;&gt;pic.twitter.com/cHXcTePYAG&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1548660551781269505?ref_src=twsrc%5Etfw&quot;&gt;July 17, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;Erlang おさわりしてる&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1604068339990396929?ref_src=twsrc%5Etfw&quot;&gt;December 17, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;あとは、DNS とかいろいろ作りかけのものが今年も完成しなかったので、来年こそは完成させたい。&lt;/p&gt;
&lt;h2 id=&quot;資格&quot;&gt;資格&lt;/h2&gt;
&lt;p&gt;去年のサイバーマンデーで買っていた CKAD をやっと受けた。2020 年ぐらいから受けようと思っていたのでついにという感じではある。&lt;br&gt;
CKA / CKS をサイバーマンデーで買ったので、ちゃんと勉強する必要があるなと思っている。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;受けた &lt;a href=&quot;https://t.co/6rztMu0fwy&quot;&gt;pic.twitter.com/6rztMu0fwy&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1597598124926963712?ref_src=twsrc%5Etfw&quot;&gt;November 29, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;筋トレ&quot;&gt;筋トレ&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/post/muscle-training-2022/&quot;&gt;筋トレ 2022&lt;/a&gt; に書いた通り、真面目に続けているので継続したいし、懸垂を頑張りたい。&lt;/p&gt;
&lt;h2 id=&quot;総括&quot;&gt;総括&lt;/h2&gt;
&lt;p&gt;来年もプライベートも仕事も頑張りましょう。あとは英語を頑張りたい。&lt;/p&gt;</content:encoded></item><item><title>筋トレ 2022</title><link>https://blog.sakamo.dev/post/muscle-training-2022/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/muscle-training-2022/</guid><description>何をしていたか</description><pubDate>Sun, 18 Dec 2022 12:25:23 GMT</pubDate><content:encoded>&lt;h2 id=&quot;してたこと&quot;&gt;してたこと&lt;/h2&gt;
&lt;p&gt;基本的に自重中心で腕立て伏せとか懸垂とかしていた。&lt;br&gt;
腹筋ローラーで膝コロ・立ちコロしてたが、あまり楽しくないので最近はしていない。&lt;br&gt;
あとは、今年の後半ぐらいからなんとなくではなく、ちゃんとスケジュールを組んで取り組むようにしてから効果が上がった気がする。&lt;/p&gt;
&lt;p&gt;懸垂は最近始めた。もともと家の近くに鉄棒は存在しないと思っていて断念していたが、下記のツイートにある「&lt;a href=&quot;https://kensui-to-watashi.com/&quot;&gt;懸垂のできる公園リスト&lt;/a&gt;」を見て、家の近くにあるのを知ったので始めた。懸垂を始めるまでは、チューブ使ったりしていたが、使い方があまり上手くなかったのもあって効果はなかったように思う。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;懸垂ができる公園リストです&lt;a href=&quot;https://t.co/isawQvvs5J&quot;&gt;https://t.co/isawQvvs5J&lt;/a&gt;&lt;/p&gt;— Dai Tamesue 爲末大 (@daijapan) &lt;a href=&quot;https://twitter.com/daijapan/status/1590476116485365760?ref_src=twsrc%5Etfw&quot;&gt;November 9, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;使ったもの使ってたもの&quot;&gt;使ったもの/使ってたもの&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;アームバー 30kg&lt;/li&gt;
&lt;li&gt;プッシュアップバー&lt;/li&gt;
&lt;li&gt;チューブ&lt;/li&gt;
&lt;li&gt;腹筋ローラー&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;プロテイン&quot;&gt;プロテイン&lt;/h2&gt;
&lt;p&gt;プロテインはいつになっても何が良いのかよくわからない。&lt;br&gt;
今まではビーレジェンドのホエイプロテインだったが、マイプロテインのウェイトゲイナーに変えた。5 キログラムあるので量が多いのは良いなと思う。&lt;/p&gt;
&lt;h2 id=&quot;来年&quot;&gt;来年&lt;/h2&gt;
&lt;p&gt;懸垂を頑張っていきたい、あとはアームバーの負荷を上げたい。&lt;br&gt;
効率を考えるとジムに行くのが良いのだろうがめんどくさいので、家にジムを作りたい。&lt;/p&gt;</content:encoded></item><item><title>Catch All Custom Domain</title><link>https://blog.sakamo.dev/post/catch-all-custom-domain/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/catch-all-custom-domain/</guid><description>独自ドメインでメールを受信する</description><pubDate>Sat, 05 Feb 2022 11:16:12 GMT</pubDate><content:encoded>&lt;h2 id=&quot;モチベーション&quot;&gt;モチベーション&lt;/h2&gt;
&lt;p&gt;ドメインをいくつか持っていて有効活用したくなり、特定のドメインに送信されたメールを Gmail に転送したくなった。&lt;br&gt;
送信はできなくていいし、メールサーバーを立てるなんてことはしたくないし、この目的のためにクラウド上に何かを作るやる気もなかった。&lt;/p&gt;
&lt;p&gt;とりあえず実際に動くことを確認したのは &lt;a href=&quot;https://domains.google/intl/ja_jp/&quot;&gt;Google Domains&lt;/a&gt; と &lt;a href=&quot;https://blog.cloudflare.com/ja-jp/introducing-email-routing-ja-jp/&quot;&gt;Cloudflare Email Routing&lt;/a&gt; である。&lt;/p&gt;
&lt;h2 id=&quot;google-domains&quot;&gt;Google Domains&lt;/h2&gt;
&lt;p&gt;Google Domains を使っている場合は、&lt;a href=&quot;https://domains.google/intl/ja_jp/learn/how-to-use-email-forwarding/&quot;&gt;メール転送&lt;/a&gt;の機能を使うだけでいいので簡単である。&lt;br&gt;
下記のように、&lt;code&gt;*@example.com&lt;/code&gt; に対して設定すれば、全てのメールを転送することができる。&lt;br&gt;
Google Domains のネームサーバーを使っていない場合でも、&lt;a href=&quot;https://support.google.com/domains/answer/9428703&quot;&gt;カスタム ネームサーバーによるメール転送を設定する&lt;/a&gt; に書いてあるとおり、MX レコードを追加すると転送できる。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/google_domains.DjW0ukiH_1YQKXD.webp&quot; alt=&quot;image/google_domains.png&quot; width=&quot;822&quot; height=&quot;391&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;cloudflare-email-routing&quot;&gt;Cloudflare Email Routing&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;Email Routing は現在ベータ版の機能なので、Waitlist に登録しましょう。&lt;/del&gt;&lt;br&gt;
Email Routing は&lt;a href=&quot;https://blog.cloudflare.com/migrating-to-cloudflare-email-routing/&quot;&gt;オープンベータ&lt;/a&gt;になったので誰でも使えます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/email-routing/email-routing-options#catch-all-address&quot;&gt;Catch-all address&lt;/a&gt; に書かれているとおり、機能として Catch-all があるので設定するだけで特定のアドレスに転送することができる。&lt;br&gt;
また、受信したものを転送ではなく Drop することもできるので便利である。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/cloudflare_email.BfiugRyo_Z1HMkUd.webp&quot; alt=&quot;image/cloudflare_email.png&quot; width=&quot;1037&quot; height=&quot;286&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;また、&lt;a href=&quot;https://blog.cloudflare.com/email-routing-insights/&quot;&gt;Email Routing Insights&lt;/a&gt; で紹介されているとおり、メトリクスやログを見ることができるので普通に便利である。&lt;/p&gt;
&lt;h2 id=&quot;おわり&quot;&gt;おわり&lt;/h2&gt;
&lt;p&gt;Google Domains のメール転送を使っていたが、DNS は Cloudflare を使っているので Email Routing を使うようにした。&lt;/p&gt;</content:encoded></item><item><title>Goodbye 2021</title><link>https://blog.sakamo.dev/post/review-2021/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2021/</guid><description>2021年も終わりなので振り返る。</description><pubDate>Thu, 30 Dec 2021 14:58:31 GMT</pubDate><content:encoded>&lt;p&gt;2021年も色々変化があったがここに記すには余白が狭すぎる。&lt;br&gt;
結局また直前に書き始めることになるとは思ってもいなかった。&lt;/p&gt;
&lt;!-- ## プライベート

今年もそれなりに経済を回した。  
行きつけのお店ができたり、お鮨を食べたり、不思議な料理を食べたり、割と食が中心の一年だった気がする。  
まだ23歳なのに歩けなくなってきていて、帰り道にタクシーに乗る生活をしているの笑ってしまう。

振り返ると色々あったが今年も後悔はしておらず、今後も後悔することないと断言ができる。  
今年も一緒にいてくれてありがとう。 --&gt;
&lt;h2 id=&quot;oss&quot;&gt;OSS&lt;/h2&gt;
&lt;p&gt;今年の3月に &lt;a href=&quot;https://github.com/argoproj/argo-cd/&quot;&gt;Argo CD&lt;/a&gt; 等の OSS を開発している argoproj のメンバーになった。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;頑張ります &lt;a href=&quot;https://t.co/hN5DnFmvrZ&quot;&gt;pic.twitter.com/hN5DnFmvrZ&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(23) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1369987987178590210?ref_src=twsrc%5Etfw&quot;&gt;March 11, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;主にやっていたのは &lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications&quot;&gt;argocd-notifications&lt;/a&gt; と &lt;a href=&quot;https://github.com/argoproj/notifications-engine&quot;&gt;notifications-engine&lt;/a&gt; で、ドキュメントを充実させたり PR のレビューしたり Slack で人間を助けたりしていた。&lt;br&gt;
ちなみに、argocd-notifications は &lt;a href=&quot;https://github.com/argoproj/argo-cd/pull/7744&quot;&gt;argo-cd/pull/7744&lt;/a&gt; で Argo CD 本体にマージされてv2.3でリリースされる。&lt;/p&gt;
&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;p&gt;8月に転職し、ソフトウェアエンジニアからクラウドサポートエンジニアになった。&lt;br&gt;
ソフトウェアエンジニアから離れたので仕事でコードを書いてはいないが、今のところ毎日技術に触れているので面白いし、これがクラウドかって気持ちになる。&lt;br&gt;
また数年したらソフトウェアエンジニアに戻る気はするが、今のところは今のポジションで頑張る予定である。&lt;/p&gt;
&lt;p&gt;転職するまでは結局ずっと Go を書いていたし、多分今後も何か書く際は Go で書いていく気がする。&lt;/p&gt;
&lt;h2 id=&quot;技術&quot;&gt;技術&lt;/h2&gt;
&lt;p&gt;基本的にコンテナ系を追っていた一年ではあったし、きっと2021年もコンテナ系を追っていくつもりではある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BMSファイル再生&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;途中まで作って満足してやめてしまったが、BMS ファイルを読み込んで再生するやつを作っていた。&lt;br&gt;
これは Go で &lt;a href=&quot;https://engoengine.github.io/&quot;&gt;Engo&lt;/a&gt; というライブラリを使っていて、リポジトリは &lt;a href=&quot;https://github.com/ryota-sakamoto/beatgo&quot;&gt;ryota-sakamoto/beatgo&lt;/a&gt; にある。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;任意のBMSファイルを読んで再生するところまで作った &lt;a href=&quot;https://t.co/LZ3EDYSZU3&quot;&gt;pic.twitter.com/LZ3EDYSZU3&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(23) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1345686348037050368?ref_src=twsrc%5Etfw&quot;&gt;January 3, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;/post/automating-chaos-experiments/&quot;&gt;「Automating chaos experiments in production」を読んだ&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;人生で初めてまともに英語の論文を読んだ。内容は多少古いが。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;DNSサーバー&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DNS がどうやって動くかを理解したかったので、RFC を読みながら DNS サーバーを作っていた。完全に理解した状態になり、これも途中で飽きてやめた。&lt;br&gt;
これは Rust で書いていたが、UDP のパケットをパースする部分は &lt;code&gt;std::io::Cursor&lt;/code&gt; を使って丁寧に書いていた。&lt;br&gt;
リポジトリはソースコードの質が低いので private。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;フルサービスリゾルバまで実装した &lt;a href=&quot;https://t.co/SOte47y8BH&quot;&gt;pic.twitter.com/SOte47y8BH&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(23) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1387731021513203716?ref_src=twsrc%5Etfw&quot;&gt;April 29, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;ブログの移行&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Netlify から Cloudflare Pages に移行した。とにかく簡単だった。&lt;br&gt;
基本的に持っているドメインは全て Cloudflare を通しているのと、なんとなく移行したくなったから移行した。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;NetlifyからCloudflare Pagesへ移行&lt;/p&gt;— さかもとりょーた(23) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1419498841485692929?ref_src=twsrc%5Etfw&quot;&gt;July 26, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;2021年の目標&quot;&gt;2021年の目標&lt;/h2&gt;
&lt;p&gt;2021年は下記の目標を一応掲げてはいた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TOEIC: 800点&lt;/li&gt;
&lt;li&gt;資格: AP, CKAD&lt;/li&gt;
&lt;li&gt;発狂皆伝&lt;/li&gt;
&lt;li&gt;買った本をちゃんと読む&lt;/li&gt;
&lt;li&gt;賢くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まず TOEIC、これは定期的に受けてはいるし英語の勉強もたまにしていて12月も受けたのでそれの結果次第なところはある。&lt;br&gt;
資格はAPは申し込み忘れ、CKAD は Black Friday で買ったので来年受ける。&lt;br&gt;
発狂皆伝は発狂六段あたりまで地力を戻したが壁が高すぎるので諦めた。&lt;br&gt;
買った本は今年も色々買ったが読まずに本棚に積まれている。&lt;br&gt;
賢くはなれなかった気がする。&lt;/p&gt;
&lt;p&gt;こう見ると何も達成してないが忘れていたことはないし、ここに書いてあること以外の進捗が良いのでよしとする。&lt;br&gt;
一応立てておくことで頭の片隅に置いておくことができるので、2022年も何か立てておくことにする。&lt;/p&gt;
&lt;h2 id=&quot;総括&quot;&gt;総括&lt;/h2&gt;
&lt;p&gt;来年は仕事も技術も頑張りましょう。&lt;/p&gt;</content:encoded></item><item><title>ArgoCD with AWS SSO</title><link>https://blog.sakamo.dev/post/argocd-aws-sso/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/argocd-aws-sso/</guid><description>ArgoCD の &lt;a href=&quot;https://argoproj.github.io/argo-cd/operator-manual/user-management/#sso&quot;&gt;SSO&lt;/a&gt; で &lt;a href=&quot;https://aws.amazon.com/jp/single-sign-on/&quot;&gt;AWS SSO&lt;/a&gt; を使う</description><pubDate>Thu, 01 Jul 2021 09:05:37 GMT</pubDate><content:encoded>&lt;h2 id=&quot;前提&quot;&gt;前提&lt;/h2&gt;
&lt;p&gt;ArgoCDでは&lt;a href=&quot;https://github.com/dexidp/dex&quot;&gt;dex&lt;/a&gt;を使い認証・認可を行っている。そのため、LDAP・OIDC・SAML等を使うことができる。&lt;/p&gt;
&lt;p&gt;動作確認したバージョンは &lt;code&gt;v2.0.4&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;argocd&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v2.0.4+0842d44&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;BuildDate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;2021-06-23T01:27:53Z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;GitCommit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;0842d448107eb1397b251e63ec4d4bc1b4efdd6e&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;GitTreeState&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;clean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;GoVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;go1.16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Compiler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;gc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;Platform&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;linux/amd64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;aws-ssoと一緒に使う&quot;&gt;AWS SSOと一緒に使う&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;argocd.example.com&lt;/code&gt; にArgoCDが立っている前提で&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;まずAWS SSOの設定をする&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;新規アプリケーションの追加&lt;/li&gt;
&lt;li&gt;カスタム SAML 2.0 アプリケーションの追加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;表示名や説明は任意のものを設定し、アプリケーションメタデータは下記のように設定する&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/metadata.BDNLoyrj_Z18KNDE.webp&quot; alt=&quot;metadata.png&quot; width=&quot;2034&quot; height=&quot;496&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;さっきの情報を元に &lt;code&gt;dex.config&lt;/code&gt; を書く&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;ssoURL&lt;/code&gt; は先ほど作成したアプリケーションのAWS SSO サインイン URLをいれる&lt;br&gt;
&lt;code&gt;entityIssuer&lt;/code&gt; と &lt;code&gt;redirectURI&lt;/code&gt; は同じものをいれる&lt;br&gt;
&lt;code&gt;caData&lt;/code&gt; は先ほど作成したアプリケーションのAWS SSO 証明書をダウンロードしbase64したものを入れる&lt;br&gt;
&lt;code&gt;attr&lt;/code&gt; に何を入れるかは後述&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ConfigMap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;argocd-cm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  url&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://argocd.example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  dex.config&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    connectors:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      - type: saml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        id: saml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        name: saml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        config:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          ssoURL: https://portal.sso.us-west-2.amazonaws.com/saml/assertion/~~~&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          entityIssuer: https://argocd.example.com/api/dex/callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          redirectURI: https://argocd.example.com/api/dex/callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          caData: $dex.saml.caData&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          usernameAttr: subject&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          emailAttr: email&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;argocd-secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  namespace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;argocd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;stringData&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  dex.saml.caData&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;~~~&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;RBACの設定をする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これの書き方は&lt;a href=&quot;https://argoproj.github.io/argo-cd/operator-manual/rbac/&quot;&gt;RBAC Configuration&lt;/a&gt;を参考に&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ConfigMap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;argocd-rbac-cm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  policy.default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;role:readonly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  policy.csv&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    g, ryota-sakamoto, role:admin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  scopes&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;attribute-mappings&quot;&gt;Attribute mappings&lt;/h2&gt;
&lt;p&gt;先ほど後述すると書いた部分だが管理されているユーザー属性とマッピングをしやりとりをする必要がある。管理画面にはアプリケーションの中に属性マッピングという項目があるのでそこで設定を下記のように行う。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/singlesignon/latest/userguide/attributemappingsconcept.html#supportedssoattributes&quot;&gt;Supported AWS SSO attributes&lt;/a&gt;にどういったものが用意されているのか記載されている。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/attr.DKMbE_TB_JY3WR.webp&quot; alt=&quot;attr.png&quot; width=&quot;2046&quot; height=&quot;868&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;ユーザーを作成し実際にどういった値が返ってくるのか下記に記載した。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/user.B-hrHzpS_2rcd7A.webp&quot; alt=&quot;user.png&quot; width=&quot;2024&quot; height=&quot;1098&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;attribute&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;${user:AD_GUID}&lt;/td&gt;&lt;td&gt;926771f849-5b9aa823-3145-4b54-b974-7939f62d405b&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:email}&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;mailto:sakamo.ryota+argocd@gmail.com&quot;&gt;sakamo.ryota+argocd@gmail.com&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:familyName}&lt;/td&gt;&lt;td&gt;Sakamoto&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:givenName}&lt;/td&gt;&lt;td&gt;Ryota&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:middleName}&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:name}&lt;/td&gt;&lt;td&gt;Ryota Sakamoto!!!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:preferredUsername}&lt;/td&gt;&lt;td&gt;Ryota Sakamoto!!!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${user:subject}&lt;/td&gt;&lt;td&gt;ryota-sakamoto&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</content:encoded></item><item><title>英語の勉強を始めて半年が経った</title><link>https://blog.sakamo.dev/post/study-english-half-year/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/study-english-half-year/</guid><description>英語の勉強の途中経過のメモ</description><pubDate>Thu, 01 Apr 2021 12:45:14 GMT</pubDate><content:encoded>&lt;h2 id=&quot;現状&quot;&gt;現状&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/post/study-english&quot;&gt;前回&lt;/a&gt;はYouTubeとか映画とか見ていたが勉強した気になるだけで効果がないのでやめた。&lt;br&gt;
去年9月から12月でTOEIC IPの点数は+85点上がったが3月に受け忘れたので定点観測ができていない。4月にTOEIC LRを受ける。&lt;/p&gt;
&lt;h2 id=&quot;何をしているか&quot;&gt;何をしているか&lt;/h2&gt;
&lt;p&gt;とりあえず現状持っている本は以下で、1日1時間から2時間程度勉強している。たまに何もしない日もある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/4900790052&quot;&gt;DUO 3.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/4757412118&quot;&gt;キク英文法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/4862902413&quot;&gt;Core1900&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/gp/product/475743653X&quot;&gt;英会話ペラペラビジネス100&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;duo-30&quot;&gt;DUO 3.0&lt;/h3&gt;
&lt;p&gt;1日1周できるようになるまではSECTION5つ分ぐらいを毎日1時間ぐらいかけて進めた。1日1周できるようになって大体3ヶ月ぐらいやってから触っていないが、英語初心者でも気合いで乗り切れば語彙力はつくことがわかった。&lt;/p&gt;
&lt;p&gt;音声は復習用CD買ってきてiPhoneに入れて聞いてた、練習用CDは使ってない。&lt;/p&gt;
&lt;h3 id=&quot;キク英文法&quot;&gt;キク英文法&lt;/h3&gt;
&lt;p&gt;英文法を鍛えようと思って買ったが1ページもやってない、そのうちやる。&lt;/p&gt;
&lt;h3 id=&quot;core1900&quot;&gt;Core1900&lt;/h3&gt;
&lt;p&gt;Part1の1章分を毎日1時間ぐらいかけて進めた。1日1周できるようになると1時間ぐらいでPart1が回せる。&lt;br&gt;
途中で&lt;a href=&quot;https://mutuno.sakura.ne.jp/index.html&quot;&gt;英語完全上達マップ&lt;/a&gt;の存在を知ってからは1週回すのではなく音読パッケージとしてCore1900をやっている。&lt;/p&gt;
&lt;p&gt;音読は下記の順番で回してる。シャドーイングは難しすぎてできないのでやってないのとリスニングはおまけ。大体1ページ1時間で終わる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;オーバーラッピング(5回)&lt;/li&gt;
&lt;li&gt;音読(15回)&lt;/li&gt;
&lt;li&gt;リピーティング(5回)&lt;/li&gt;
&lt;li&gt;オーバーラッピング(5回)&lt;/li&gt;
&lt;li&gt;リスニング(3回)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;音声はnaturalの方を使っている。&lt;/p&gt;
&lt;h3 id=&quot;英会話ペラペラビジネス100&quot;&gt;英会話ペラペラビジネス100&lt;/h3&gt;
&lt;p&gt;最近買った。とりあえず会話ができるようになるための一歩として。書いてある内容は難しいわけではないのでひたすら回して表現を覚えるのが良さそうな印象がある。&lt;/p&gt;</content:encoded></item><item><title>「Automating chaos experiments in production」を読んだ</title><link>https://blog.sakamo.dev/post/automating-chaos-experiments/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/automating-chaos-experiments/</guid><description>&lt;a href=&quot;https://arxiv.org/abs/1905.04648&quot;&gt;Automating chaos experiments in production&lt;/a&gt; を読んだのでメモ</description><pubDate>Mon, 08 Mar 2021 15:32:27 GMT</pubDate><content:encoded>&lt;h2 id=&quot;前置き&quot;&gt;前置き&lt;/h2&gt;
&lt;p&gt;この&lt;a href=&quot;https://arxiv.org/abs/1905.04648&quot;&gt;論文&lt;/a&gt;が出されたのが2019年5月だが紹介されているシステム(例えば&lt;a href=&quot;https://github.com/Netflix/vizceral&quot;&gt;Vizceral&lt;/a&gt;)はもう既にNetflix内部では利用されていなかったりするので注意が必要。&lt;br&gt;
まあ&lt;a href=&quot;https://www.infoq.com/presentations/netflix-chaos-platform/&quot;&gt;Automating Chaos Experiments in Production&lt;/a&gt;に2017年3月に動画が出ているのでそういうことだと思うが。&lt;/p&gt;
&lt;h2 id=&quot;要約&quot;&gt;要約&lt;/h2&gt;
&lt;h3 id=&quot;chap&quot;&gt;ChAP&lt;/h3&gt;
&lt;p&gt;Netflixでは1,000台以上のサーバーでマイクロサービスが動いていて、あるコンポーネントで障害が発生した際に可用性を維持するためにタイムアウトやリトライといった仕組みをシステムに入れているがそれがシステム全体に対してどう影響を与えるか等をテストするためにChaos Engineeringを行っている。&lt;br&gt;
また、それを行うために&lt;a href=&quot;https://netflixtechblog.com/chap-chaos-automation-platform-53e6d528371f&quot;&gt;Chaos Automation Platform(ChAP)&lt;/a&gt;という基盤を開発している。&lt;br&gt;
ChAPではアプリケーションレベルでfault injectionを行い、failure(呼び出しの代わりに例外)とlatency(呼び出しを実行するときに遅延を入れる)をサポートしている。&lt;/p&gt;
&lt;h3 id=&quot;experiment&quot;&gt;experiment&lt;/h3&gt;
&lt;p&gt;実験を行う最初に2つのクラスター(apii-beseline, api-canary)をSpinnaker経由で作成する。&lt;br&gt;
ランダムに選ばれた1%のユーザーが各々のクラスターにリクエストがいくように&lt;a href=&quot;https://github.com/Netflix/eureka&quot;&gt;Eureka&lt;/a&gt;というService Discoveryのためのツール(他のOSSでいうと&lt;a href=&quot;https://coredns.io/&quot;&gt;CoreDNS&lt;/a&gt;とか&lt;a href=&quot;https://www.consul.io/&quot;&gt;
Consul&lt;/a&gt;とか色々ある)を使いリクエストを流す。&lt;br&gt;
その2つのクラスターに対してfault injectionを行いKPIやCPU使用率等の結果を比べることで障害が起きた際のシステムに与える影響を確認している。&lt;/p&gt;
&lt;h3 id=&quot;safety-mechanism&quot;&gt;safety mechanism&lt;/h3&gt;
&lt;p&gt;fault injectionは障害を引き起こす可能性がある。そのリスクを軽減するためにいくつかの仕組みが導入されている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;働いている時間(9AM-5PM)のみ実行&lt;/li&gt;
&lt;li&gt;顧客に多大な影響を与えた場合に自動的に止まる&lt;/li&gt;
&lt;li&gt;総トラフィックの5%を超えないように&lt;/li&gt;
&lt;li&gt;failover時には実行できない&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;monocle&quot;&gt;Monocle&lt;/h3&gt;
&lt;p&gt;ChAPは元々self-serveモデルを採用しユーザーが設定等を行っていたが、Monocleと呼ばれるシステムを作り設定を自動で行い実験を行うといったmanagedなモデルも採用した。&lt;/p&gt;
&lt;p&gt;Monocleでは3つの種類の実験を生成することができる。これらは経験則に基づいて定義されるためよりシステムの脆弱な部分を見つけることができる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Failure&lt;/li&gt;
&lt;li&gt;Latency just below configured timeout (highest timeout - P99 latency over the past 7 days + 5% buffer)&lt;/li&gt;
&lt;li&gt;Latency causing failure (highest configured timeout + 5% buffer)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;また、Criticality scoreを用いて実験の優先順位を決めている。このscoreは依存関係やリクエスト量等によって計算される。&lt;/p&gt;
&lt;h3 id=&quot;fault-injection&quot;&gt;fault injection&lt;/h3&gt;
&lt;p&gt;開発言語としてJavaを使っていたため&lt;a href=&quot;https://github.com/Netflix/Hystrix&quot;&gt;Hystrix&lt;/a&gt;というライブラリを開発し使っていたが、Node.jsでの開発もしたりで新しいライブラリを作る必要があったので、fault injectionの仕組みを言語ベースではなく別のアプローチとしてService Meshを採用し&lt;a href=&quot;https://github.com/istio/istio&quot;&gt;Istio&lt;/a&gt;を開発した。&lt;/p&gt;
&lt;h2 id=&quot;感想&quot;&gt;感想&lt;/h2&gt;
&lt;p&gt;読みやすかったし面白かった。内容としては若干古いが考え方として参考になる部分も多いと思う。&lt;/p&gt;
&lt;p&gt;これを書いてから気付いたけど&lt;a href=&quot;https://blog.acolyer.org/2019/07/05/automating-chaos-experiments-in-production/&quot;&gt;the morning paper&lt;/a&gt;というブログにまとめられていた。&lt;/p&gt;
&lt;p&gt;Chaos Engineeringではないが仕事でバッチを開発した時にどこでエラーが起きてもリトライ可能なように設計をしたのだが、一定の確率でエラーが起きる前提で開発をすると冪等性の担保が簡単にできるようになったのでよかったことを思い出した。&lt;/p&gt;</content:encoded></item><item><title>ArgoCD Notifications v1 Slack Config</title><link>https://blog.sakamo.dev/post/argocd-notifications-v1-slack-config/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/argocd-notifications-v1-slack-config/</guid><description>&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications&quot;&gt;argocd-notifications&lt;/a&gt; の &lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/releases/tag/v1.0.0&quot;&gt;v1.0.0&lt;/a&gt; がリリースされて ConfigMap が若干変わったのでメモ</description><pubDate>Tue, 26 Jan 2021 14:52:57 GMT</pubDate><content:encoded>
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;日付&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2020-01-26&lt;/td&gt;&lt;td&gt;&lt;code&gt;v1.0.1&lt;/code&gt; の内容で公開&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-03-11&lt;/td&gt;&lt;td&gt;&lt;code&gt;v1.0.2&lt;/code&gt; の内容で更新&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&quot;さて&quot;&gt;さて&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://argocd-notifications.readthedocs.io/en/stable/upgrading/0.x-1.0/&quot;&gt;v0.x to v1.0&lt;/a&gt;を見るとわかるがそれなりに破壊的変更があった。&lt;br&gt;
ソースコードレベルでは一部しか見ていないので全部の変更についてはここには書かないし、Slackでしか使ってないのでそこだけ書く。&lt;/p&gt;
&lt;p&gt;ちなみに &lt;code&gt;v0.x&lt;/code&gt; の設定は&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/blob/v1.0.0/shared/legacy/settings.go#L174&quot;&gt;deprecated&lt;/a&gt;なだけでまだ使える。&lt;/p&gt;
&lt;h1 id=&quot;v0xのslackの設定&quot;&gt;v0.xのSlackの設定&lt;/h1&gt;
&lt;p&gt;まずは今までどうやって書いていたかを書く。&lt;/p&gt;
&lt;h2 id=&quot;configmap&quot;&gt;ConfigMap&lt;/h2&gt;
&lt;p&gt;ビルトインとしていくつかのトリガーが存在したのでそれを有効にする。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ConfigMap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;argocd-notifications-cm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  config.yaml&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    triggers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - name: on-sync-status-unknown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - name: on-sync-failed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - name: on-sync-running&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - name: on-sync-succeeded&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - name: on-health-degraded&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      enabled: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;annotations&quot;&gt;annotations&lt;/h2&gt;
&lt;p&gt;下記のようなアノテーションをつけると通知された。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  annotations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    recipients.argocd-notifications.argoproj.io&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;slack:my-channel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;v100のslackの設定&quot;&gt;v1.0.0のSlackの設定&lt;/h1&gt;
&lt;p&gt;まずは提供されているマニフェストを適用する。&lt;br&gt;
&lt;code&gt;v1.0.0&lt;/code&gt; からは2種類提供されるようになっていて&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/blob/v1.0.0/manifests/install.yaml&quot;&gt;controller&lt;/a&gt;と&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/blob/v1.0.0/catalog/install.yaml&quot;&gt;catalog&lt;/a&gt;である。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;controller&lt;/code&gt; は &lt;code&gt;controller&lt;/code&gt; で、&lt;code&gt;catalog&lt;/code&gt; は通知する内容のテンプレート等が書かれている。&lt;br&gt;
これを適用したら &lt;code&gt;ConfigMap&lt;/code&gt; と &lt;code&gt;annotations&lt;/code&gt; を追加する。&lt;/p&gt;
&lt;h2 id=&quot;configmap-1&quot;&gt;ConfigMap&lt;/h2&gt;
&lt;p&gt;同様の動作をさせるための &lt;code&gt;ConfigMap&lt;/code&gt; の書き方は下記のようになる。&lt;br&gt;
&lt;code&gt;argocd-notifications-cm&lt;/code&gt; は既に存在するので &lt;code&gt;defaultTriggers&lt;/code&gt; を追加する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ConfigMap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;argocd-notifications-cm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  defaultTriggers&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - on-deployed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - on-health-degraded&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - on-sync-failed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - on-sync-running&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - on-sync-status-unknown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    - on-sync-succeeded&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;annotations-v102&quot;&gt;annotations (v1.0.2)&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;v1.0.2&lt;/code&gt; 以降で同様の動作をさせるための &lt;code&gt;annotations&lt;/code&gt; の書き方は下記のようになる。&lt;br&gt;
&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/pull/159&quot;&gt;improve annotation iterate #159&lt;/a&gt;がマージされたので下記のような書き方ができる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  annotations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    notifications.argoproj.io/subscribe.slack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;my-channel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;annotations-v101&quot;&gt;annotations (v1.0.1)&lt;/h2&gt;
&lt;p&gt;これは古い情報だがメモとして残しておく。&lt;br&gt;
&lt;code&gt;.&lt;/code&gt; が2つ続いてるのは意味がわからないと思うが、&lt;code&gt;v1.0.1&lt;/code&gt; 以前ではこうする必要がある。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  annotations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    notifications.argoproj.io/subscribe..slack&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;my-channel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;なぜこの書き方をするのか&quot;&gt;なぜこの書き方をするのか&lt;/h3&gt;
&lt;p&gt;アノテーションを舐める処理は&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/blob/v1.0.0/pkg/subscriptions/annotations.go#L32-L55&quot;&gt;pkg/subscriptions/annotations.go#L32-L55&lt;/a&gt;でやっているのだがここには問題がある。&lt;/p&gt;
&lt;p&gt;ここでは変数として &lt;code&gt;trigger&lt;/code&gt; と &lt;code&gt;service&lt;/code&gt; が重要になる。&lt;br&gt;
&lt;code&gt;trigger&lt;/code&gt; は何を起因に通知を飛ばすか、&lt;code&gt;service&lt;/code&gt;は &lt;code&gt;slack&lt;/code&gt; 等が入る。&lt;/p&gt;
&lt;p&gt;上に書いた例でいうと &lt;code&gt;trigger&lt;/code&gt; には空文字、&lt;code&gt;service&lt;/code&gt; には &lt;code&gt;slack&lt;/code&gt; が入る。&lt;br&gt;
&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications/blob/v1.0.0/pkg/subscriptions/annotations.go#L112-L115&quot;&gt;pkg/subscriptions/annotations.go#L112-L115&lt;/a&gt; に書いてあるのだが、&lt;code&gt;trigger&lt;/code&gt; に空文字が入ることで引数として渡された &lt;code&gt;defaultTriggers&lt;/code&gt; を使うことができる。&lt;br&gt;
この &lt;code&gt;defaultTriggers&lt;/code&gt; には先ほど &lt;code&gt;ConfigMap&lt;/code&gt; に書いていた値が入ってくる。&lt;/p&gt;
&lt;p&gt;さて問題点だがこの &lt;code&gt;if&lt;/code&gt; 文は必ず通るので &lt;code&gt;trigger&lt;/code&gt; を空文字にするためにはこのような書き方をする必要がある。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;parts &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; strings.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Split&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(k[&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(prefix):], &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;trigger &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; parts[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;service &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; len&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(parts) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	service &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; parts[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	service &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; parts[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	trigger &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>Goodbye 2020</title><link>https://blog.sakamo.dev/post/review-2020/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2020/</guid><description>2020年も終わりなので振り返る。</description><pubDate>Thu, 31 Dec 2020 14:16:25 GMT</pubDate><content:encoded>&lt;p&gt;さて色々変化があった2020年だがここに記すには余白が狭すぎる(?)&lt;br&gt;
1週間ぐらい前から書こうと思ってたのに当日に駆け込みで書くことになるとは思っていなかった。&lt;/p&gt;
&lt;!-- ## プライベート

個人的には筋トレと英語を始めた。  
こんな時期だが色々なところに出かけて経済を回した。  
あと[ピアスを開けてもらった](/post/open-earrings/)。

筋トレはコロナ太り対策のために始めたのがきっかけで、アームバーと腹筋ローラーを買って隔日で夜中にやってる。  
昔は全然筋肉つかないとか思ってたがちゃんとやればそれなりに効果があることがわかった。

英語は今年の最初からやるって言っていたが、始めたのは9月ぐらいから。  
社内でTOEIC受けたり、単語帳とか文法の参考書買って勉強したり。  
無限に伸びを感じるので楽しい。

京都に行ったり、人生で初めてアフタヌーンティーに行ったり、可愛いパフェを食べたり、薔薇を見に行ったり、高級ホテルに行ったり・・・思い出すと楽しい1年だったなあとなる。  
美味しいものもいっぱい食べたしワインも日本酒もいっぱい飲んだ。人生で一番飲んだ年だと思う。今日はケーキ食べた。美味しかった。一緒にいてくれてありがとう。 --&gt;
&lt;h2 id=&quot;技術&quot;&gt;技術&lt;/h2&gt;
&lt;p&gt;メモとして残してるのは&lt;a href=&quot;/post/ingress-nginx/&quot;&gt;Ingress Nginxのソースコードを読んだり&lt;/a&gt;、&lt;a href=&quot;/post/cert-manager-external/&quot;&gt;cert-managerでExternal Issuerを実装する方法&lt;/a&gt;を調べたぐらい。&lt;br&gt;
他にはTerraformで遊んだり、kubeadm触ったり、Kubernetesで遊んだりまあそれなりに色々してた。たぶん。&lt;br&gt;
Kong触ったり、kubectlのソース読んだりして色々書こうと思ってたけど書いてる途中でやめた。&lt;br&gt;
2021年はちゃんとCKADをとります。ソフトウェアエンジニアとしては機械学習やったりゲーム作ったりで幅を広げていきたい。&lt;br&gt;
あとはCコンパイラを完成させてないのでちゃんとやる。&lt;/p&gt;
&lt;h2 id=&quot;仕事&quot;&gt;仕事&lt;/h2&gt;
&lt;p&gt;まだ転職してないので&lt;a href=&quot;https://linegt.com/ja/&quot;&gt;LINE Growth Technology&lt;/a&gt;にいる。2019-08-15に入社したので前職より長く在籍している。僕は仕事としてはSREをやりたいのでよろしくお願いします。あと全く出社しなくなって生活週間が崩壊した。&lt;/p&gt;
&lt;p&gt;普段はAnsible書いたりCI/CDのやり方考えたりGo書いたり負荷テストしたり色々してる。&lt;br&gt;
社内システムの脆弱性見つけたり、&lt;a href=&quot;https://github.com/line/line-bot-sdk-ruby&quot;&gt;line/line-bot-sdk-ruby&lt;/a&gt;のContributorになったりもした。&lt;br&gt;
人前で発表するのは苦手だったが、社内で勉強会があれば発表するようになったので機会があれば自発的にするもんなんだなと思った。&lt;br&gt;
色々社内システム作ったりしていたけど社外に名前が出ていないので色々やってたとだけ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://linedevday.linecorp.com/2020/ja&quot;&gt;LINE DEVELOPER DAY 2020&lt;/a&gt;のインフラ構築とかAPIの実装とかした。&lt;br&gt;
&lt;a href=&quot;https://line.connpass.com/event/198232/&quot;&gt;LINE DEVELOPER DAY 2020 Webサイト開発の裏側をお話しします！&lt;/a&gt;でサーバーサイド開発について話したが資料がまだ公開されていないのでそのうち。&lt;/p&gt;</content:encoded></item><item><title>Create External Issuer for cert-manager</title><link>https://blog.sakamo.dev/post/cert-manager-external/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/cert-manager-external/</guid><description>&lt;a href=&quot;https://github.com/jetstack/cert-manager&quot;&gt;cert-manager&lt;/a&gt; で &lt;a href=&quot;https://cert-manager.io/docs/contributing/external-issuers/&quot;&gt;External Issuer&lt;/a&gt; を実装する方法</description><pubDate>Sun, 20 Dec 2020 08:31:16 GMT</pubDate><content:encoded>&lt;h1 id=&quot;さて&quot;&gt;さて&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://cert-manager.io/docs/contributing/external-issuers/&quot;&gt;Implementing External Issuers&lt;/a&gt;を見ると証明書を発行するためにACME等を使わずに自分で実装できるらしいが何をすればいいかよくわからなかったので実装して確認した。&lt;br&gt;
&lt;a href=&quot;https://github.com/cloudflare/origin-ca-issuer&quot;&gt;cloudflare/origin-ca-issuer&lt;/a&gt;を参考にしたのでこっちを読めば基本的には何をすればいいかはわかる。&lt;/p&gt;
&lt;p&gt;どういう時にこれを実装するかというと例えば社内に証明書を管理しているAPIサーバーがあったとしてそこから証明書を取得するとか。&lt;/p&gt;
&lt;h1 id=&quot;実装&quot;&gt;実装&lt;/h1&gt;
&lt;p&gt;一部エスパーしている部分もあるが大まかにはこのような流れで動いている。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/flow.B1UZGAEk_15xdx1.webp&quot; alt=&quot;flow.png&quot; width=&quot;601&quot; height=&quot;369&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;p&gt;参考実装は&lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample&quot;&gt;ryota-sakamoto/cert-manager-external-sample&lt;/a&gt;で&lt;a href=&quot;https://github.com/kubernetes-sigs/kubebuilder&quot;&gt;kubebuilder&lt;/a&gt;を使っている&lt;/p&gt;
&lt;p&gt;実装するべき点は3つある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1: external issuerのreconcile&lt;/li&gt;
&lt;li&gt;3, 5: &lt;a href=&quot;https://cert-manager.io/docs/concepts/certificaterequest/&quot;&gt;CertificateRequest&lt;/a&gt;のreconcile&lt;/li&gt;
&lt;li&gt;4: 証明書の取得、発行等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1-external-issuerのreconcile&quot;&gt;1: external issuerのreconcile&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/customissuer_controller.go#L58&quot;&gt;customissuer_controller.go#L58&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;yamlではユーザー名とかパスワードを指定してreconcileすればいいと思う。&lt;br&gt;
(&lt;code&gt;Secret&lt;/code&gt; を使うとかそこはよしなにやる)&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;cert-manager.k8s.sakamo.dev/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;CustomIssuer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;customissuer-sample&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  user&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  password&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;password&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3-5-certificaterequestのreconcile&quot;&gt;3, 5: CertificateRequestのreconcile&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CertificateRequest&lt;/code&gt; をreconcileし下記の点を実装すると目的が達成できる&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;issuerRef&lt;/code&gt; が一致するかどうか &lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L53&quot;&gt;#L53&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CertificateRequest&lt;/code&gt; の &lt;code&gt;Status&lt;/code&gt; の &lt;code&gt;Certificate&lt;/code&gt; が空かどうか &lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L61&quot;&gt;#L61&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;issuerRef&lt;/code&gt; で指定したIssuerのStatus等の確認 &lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L78&quot;&gt;#78&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;証明書の取得、発行等 &lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L85&quot;&gt;#85&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CertificateRequest&lt;/code&gt; の &lt;code&gt;Status&lt;/code&gt; の更新 &lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L91&quot;&gt;#91&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;まず &lt;code&gt;Certificate&lt;/code&gt; に &lt;code&gt;issuerRef&lt;/code&gt; を指定してapplyする。&lt;br&gt;
そうすると &lt;code&gt;CertificateRequest&lt;/code&gt; と &lt;code&gt;Secret&lt;/code&gt; が生成される。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;cert-manager.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Certificate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;example-certificate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  secretName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;example-com-tls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  dnsNames&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;www.example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  duration&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;2160h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  renewBefore&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;720h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  issuerRef&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    group&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;cert-manager.k8s.sakamo.dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;CustomIssuer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;customissuer-sample&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                  READY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   SECRET&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-certificate&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   False&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   example-com-tls&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   9s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificaterequest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                        READY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-certificate-crbmv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;           11s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                        TYPE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                                  DATA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;default-token-lhhdl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;         kubernetes.io/service-account-token&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   3&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      14d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-certificate-g6gn6&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   Opaque&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;                                1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      17s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CertificateRequest&lt;/code&gt; には &lt;code&gt;Certificate&lt;/code&gt; で指定した値やCSRが含まれる。&lt;br&gt;
また、&lt;code&gt;Secret&lt;/code&gt; の名前はannotationsから取得できる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificaterequest/example-certificate-crbmv&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; go-template=&quot;{{ .spec.request }}&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; base64&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --decode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-----BEGIN&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CERTIFICATE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; REQUEST-----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;snip&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;-----END&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CERTIFICATE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; REQUEST-----&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificaterequest/example-certificate-crbmv&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; jsonpath=&quot;{.metadata.annotations.cert-manager\.io\/private-key-secret-name}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-certificate-g6gn6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Secret&lt;/code&gt; には秘密鍵の情報が含まれている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secret/example-certificate-g6gn6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Name:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;         example-certificate-g6gn6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Namespace:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Labels:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       cert-manager.io/next-private-key=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Annotations:&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Type:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  Opaque&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;====&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tls.key:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  1708&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bytes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Status&lt;/code&gt; の更新は &lt;code&gt;cert-manager&lt;/code&gt; にutilがあるのでそれを使うだけでいい。&lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L91&quot;&gt;certificate_request_controller.go#L91&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    cmutil &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;github.com/jetstack/cert-manager/pkg/api/util&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;cmutil.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;SetCertificateRequestCondition&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(cr, certmanager.CertificateRequestConditionReady, metav1.ConditionTrue, certmanager.CertificateRequestReasonIssued, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Certificate issued&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4-証明書の取得発行等&quot;&gt;4: 証明書の取得、発行等&lt;/h2&gt;
&lt;p&gt;ここは要件によって実装は変わるが上記で取得できる値を使ってAPIを叩いたりする。&lt;br&gt;
参考実装では &lt;code&gt;tls.key&lt;/code&gt; を使ってオレオレ証明書を作成している。&lt;a href=&quot;https://github.com/ryota-sakamoto/cert-manager-external-sample/blob/4954b7a1e9ad771351da91e54d1089cbf9328dcc/controllers/certificate_request_controller.go#L117&quot;&gt;certificate_request_controller.go#L117&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;実装後&quot;&gt;実装後&lt;/h2&gt;
&lt;p&gt;ここまで実装して &lt;code&gt;CertificateRequest&lt;/code&gt; から証明書を発行したりすると &lt;code&gt;READY&lt;/code&gt; は &lt;code&gt;TRUE&lt;/code&gt; になり、TLS証明書の &lt;code&gt;Secret&lt;/code&gt; が作成される。&lt;br&gt;
これを &lt;code&gt;Ingress&lt;/code&gt; 等で指定すると使うことができる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificaterequest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                        READY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-certificate-crbmv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   True&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    27m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                  READY&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   SECRET&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;            AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-certificate&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   True&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    example-com-tls&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   27m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secret/example-com-tls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;              TYPE&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                DATA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   AGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;example-com-tls&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   kubernetes.io/tls&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      46s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下記のようにアクセスすると証明書が発行できていることが確認できる。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/certificate.ByIzXo5T_cnizl.webp&quot; alt=&quot;certificate.png&quot; width=&quot;1002&quot; height=&quot;736&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title>英語の勉強を始めた</title><link>https://blog.sakamo.dev/post/study-english/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/study-english/</guid><description>英語の勉強を始めたので何をしているのか記録しておく。</description><pubDate>Mon, 05 Oct 2020 15:22:05 GMT</pubDate><content:encoded>&lt;h2 id=&quot;動機&quot;&gt;動機&lt;/h2&gt;
&lt;p&gt;元々英語を話せるようになりたいとは思っていたが中々手がつかずにいた。&lt;br&gt;
社内でTOEIC IPを受けれる機会があったので受けたところ &lt;em&gt;なるほど&lt;/em&gt; となる点数だったので勉強しようと思った。&lt;br&gt;
年始に英検を取るという目標を掲げていた気がするのでやっと動き始めたという感じである。&lt;/p&gt;
&lt;h2 id=&quot;何をしているか&quot;&gt;何をしているか&lt;/h2&gt;
&lt;h3 id=&quot;duo-30&quot;&gt;DUO 3.0&lt;/h3&gt;
&lt;p&gt;初学者にはおすすめしないと書いてあったりしたが気合いで乗り切るということで買った。&lt;br&gt;
ちなみに知らない単語しか書いてない。&lt;/p&gt;
&lt;h3 id=&quot;youtubeで解説を眺める&quot;&gt;YouTubeで解説を眺める&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCZikuEIssIzv0fdkVEH7Djg&quot;&gt;英語コーチ-イングリッシュおさる&lt;/a&gt; の動画をちょくちょく眺めてる。&lt;br&gt;
わかりやすいと思ってる。たぶん。&lt;/p&gt;
&lt;h3 id=&quot;英語字幕つきの動画を見る&quot;&gt;英語字幕つきの動画を見る&lt;/h3&gt;
&lt;p&gt;Amazon Primeオリジナルだと一部英語字幕がついているので&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;日本語字幕&lt;/li&gt;
&lt;li&gt;英語字幕&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;の順でたまに見ている。イギリス英語の作品は早すぎて全く聞き取れないです。ちなみに単語もわからない。&lt;br&gt;
でも内容わかってると言い回しとかで割と面白さはある。&lt;/p&gt;
&lt;h2 id=&quot;とりあえず&quot;&gt;とりあえず&lt;/h2&gt;
&lt;p&gt;成果が出てきたらまた何か書こうと思う。&lt;/p&gt;</content:encoded></item><item><title>転職して1年経った</title><link>https://blog.sakamo.dev/post/one-yaer-linegt/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/one-yaer-linegt/</guid><description>2019/08/15に &lt;a href=&quot;https://linegt.com/ja/&quot;&gt;LINE Growth Technology株式会社&lt;/a&gt; に転職してから1年が経った。</description><pubDate>Sat, 15 Aug 2020 10:39:55 GMT</pubDate><content:encoded>&lt;h2 id=&quot;最近は何をしているのか&quot;&gt;最近は何をしているのか&lt;/h2&gt;
&lt;p&gt;社内向けツールの開発・運用したり、CI/CDの仕組みを整備したり、Kubernetesを触ったりしている。&lt;/p&gt;
&lt;p&gt;どんな社内向けツールの開発をしてたりするかというと&lt;a href=&quot;https://linegt.com/ja/careers/interview/talk02/&quot;&gt;PMクロストーク&lt;/a&gt;に書いてあるLP作成ツールやマーケティング配信ツールとか他にも色々開発してたりする。(外部に公開してないものをここに書くのは微妙だと思うのでまあ色々という)&lt;/p&gt;
&lt;p&gt;LP作成ツールは去年の&lt;a href=&quot;https://linedevday.linecorp.com/jp/2019/&quot;&gt;LINE DEVLOPER DAY 2019&lt;/a&gt;で初期の開発したメンバーが話している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://linedevday.linecorp.com/jp/2019/sessions/S2-15&quot;&gt;LINEのLP制作を効率化した時のフロント話&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://linedevday.linecorp.com/jp/2019/sessions/S2-16&quot;&gt;LINEのLP制作ツールのバックエンド・アーキテクチャ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;マーケティング配信ツールはGoで書きたかったのでGoで書いた。&lt;br&gt;
自分が関わっていて新規で書くものはGoで書いてるけど、他はJavaとかKotlinで書かれてたりする。&lt;/p&gt;
&lt;p&gt;CI/CDは社内には共通基盤としてDroneがあるのでそれを使っていい感じの仕組みを作ったり、KubernetesだとArgoCD使ったGitOpsとか。&lt;/p&gt;
&lt;h2 id=&quot;前職は&quot;&gt;前職は&lt;/h2&gt;
&lt;p&gt;前職は&lt;a href=&quot;https://www.gmo.jp/&quot;&gt;GMOインターネット株式会社&lt;/a&gt;で&lt;a href=&quot;https://www.conoha.jp/&quot;&gt;ConoHa&lt;/a&gt;のサービス設計をしていた。&lt;br&gt;
どんな事をしていたかというとVPSの機能追加を考えて各所と調整したり、イメージ作ったり、オブジェクトストレージのドキュメントを書いてたりしてた。(not ソフトウェアエンジニア)&lt;/p&gt;
&lt;h2 id=&quot;転職して変わったところ&quot;&gt;転職して変わったところ&lt;/h2&gt;
&lt;p&gt;横断的に色々できるので楽しいし、強いエンジニアが多いので楽しい。&lt;br&gt;
何よりサービスの成長に関わる事ができるのが楽しい。&lt;/p&gt;
&lt;p&gt;社内では色々な勉強会が開かれていて、月1ぐらいで何かしら発表するようになった。&lt;br&gt;
人前に出るのが割と苦手だったが自発的に発表する程度には変わった。(強制ではないので単純に機会の問題だと思うが)&lt;br&gt;
最近だと &lt;code&gt;Nginx Ingress Controller&lt;/code&gt; のソースコードを読んだのでどんな事をしているかみたいな話をした。(他には &lt;code&gt;Terraform&lt;/code&gt; の &lt;code&gt;Custom Provider&lt;/code&gt; の作り方とか)&lt;/p&gt;
&lt;p&gt;裁量労働になったので生活習慣が崩壊した。&lt;br&gt;
最近は5時とかに寝てる。家で仕事してるので実質影響なしみたいなところはあるけど。&lt;/p&gt;
&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;/h2&gt;
&lt;p&gt;エンジニアとしてサービスの成長に関わることに興味があれば&lt;a href=&quot;https://linegt.connpass.com/&quot;&gt;LINE Growth Technology - connpass&lt;/a&gt;からカジュアル面談申し込んでもらうと詳しい話を聞けると思います。&lt;/p&gt;</content:encoded></item><item><title>人生初ピアスの感想</title><link>https://blog.sakamo.dev/post/open-earrings/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/open-earrings/</guid><description>ピアスを開けてもらったので感想</description><pubDate>Sun, 02 Aug 2020 07:18:26 GMT</pubDate><content:encoded>&lt;h1 id=&quot;前置き&quot;&gt;前置き&lt;/h1&gt;
&lt;p&gt;2020-08-01(土)、自宅にて知人にピアスを開けてもらった。&lt;br&gt;
開ける事になった経緯は省略するが、前日の22時頃に突然決まったのでこういうのは勢いが大事だと感じた。&lt;br&gt;
ちなみに開けてもらったのは耳たぶである。&lt;/p&gt;
&lt;p&gt;当日9時頃に集合しピアッサーを買いに行くのだが、薬局には売っていなかったのでドン・キホーテまで買いに行った。&lt;/p&gt;
&lt;h1 id=&quot;感想&quot;&gt;感想&lt;/h1&gt;
&lt;p&gt;開ける直前の恐怖は割と強く今までにない恐怖を感じた。&lt;br&gt;
開けた瞬間の痛みとしては激痛というわけではないが声は出た。あっっって感じ。血は全く出ていなかったらしい。&lt;br&gt;
30分ぐらいは痛みを感じていたが、時間が経つに連れて痛みは感じなくなっていく。&lt;/p&gt;
&lt;p&gt;開けた後の満足感はすごかった。良かった。&lt;/p&gt;
&lt;h1 id=&quot;謝辞&quot;&gt;謝辞&lt;/h1&gt;
&lt;p&gt;開ける位置も大変良く上手に開けてくれた知人には本当に感謝している。&lt;br&gt;
ありがとう。&lt;/p&gt;</content:encoded></item><item><title>Ingress Nginxは何をしてるのか</title><link>https://blog.sakamo.dev/post/ingress-nginx/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/ingress-nginx/</guid><description>&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx&quot;&gt;NGINX Ingress Controller&lt;/a&gt; は何を起動して実装はどうなっているかを読んだので書く</description><pubDate>Sun, 19 Jul 2020 07:34:27 GMT</pubDate><content:encoded>&lt;h1 id=&quot;前置き&quot;&gt;前置き&lt;/h1&gt;
&lt;p&gt;ここで書いている内容は全ての事は書いてないし気になったところだけを順番に見ている。&lt;br&gt;
公開後は随時追記や修正をしていくつもりである。&lt;/p&gt;
&lt;p&gt;間違っている箇所があったりしたら&lt;a href=&quot;https://twitter.com/let_constant&quot;&gt;Twitter(@let_constant)&lt;/a&gt;へDMとかで教えてください。&lt;/p&gt;













&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;日付&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2020-07-19&lt;/td&gt;&lt;td&gt;&lt;code&gt;ingress-nginx-2.7.0&lt;/code&gt; の内容で公開&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&quot;nginx-ingress-controllerとは&quot;&gt;NGINX Ingress Controllerとは&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://nginx.org/&quot;&gt;Nginx&lt;/a&gt;をベースイメージとしてリバースプロキシやLBとして動作するIngress実装である。&lt;br&gt;
L7で動作するのでホスト名やパスでのルーティング、SSLのオフロード等が実現できる。&lt;/p&gt;
&lt;p&gt;他のIngress実装は&lt;a href=&quot;https://github.com/containous/traefik&quot;&gt;Traefik&lt;/a&gt;や&lt;a href=&quot;https://github.com/projectcontour/contour&quot;&gt;Contour&lt;/a&gt;があり、&lt;a href=&quot;https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers&quot;&gt;ここ&lt;/a&gt;にまとめられている。&lt;/p&gt;
&lt;h1 id=&quot;お気持ち&quot;&gt;お気持ち&lt;/h1&gt;
&lt;p&gt;ServiceはClusterIPで公開する限りServiceにIPが振られるのでIngressはそれを見ていると思っていた。&lt;br&gt;
ではそうなると&lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/examples/affinity/cookie/&quot;&gt;Sticky Sessions&lt;/a&gt;はどうやって実現しているのか不思議になった。&lt;br&gt;
&lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/how-it-works/&quot;&gt;How it works&lt;/a&gt;を読むと普通に書いてあるが、Endpointsを使用している。&lt;/p&gt;
&lt;p&gt;これを知った時感動した。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;Nginx IngressがServiceじゃなくてEndpoints見てるって知った時感動したよね&lt;/p&gt;— さかもとりょーた(25) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1265627710270746624?ref_src=twsrc%5Etfw&quot;&gt;May 27, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;ところで &lt;code&gt;Nginx Ingress Controller&lt;/code&gt; のことを &lt;code&gt;nginx-ingress&lt;/code&gt; なのか &lt;code&gt;ingress-nginx&lt;/code&gt; って言えばいいのかいつもわからなくなる。正解を知りたい。&lt;/p&gt;
&lt;h1 id=&quot;全体像&quot;&gt;全体像&lt;/h1&gt;
&lt;p&gt;まずは大まかな全体像の図を貼る。&lt;br&gt;
&lt;code&gt;NodePort&lt;/code&gt; で公開されていたり、&lt;code&gt;Job&lt;/code&gt; により &lt;code&gt;Secret&lt;/code&gt; が生成されていたりする。&lt;/p&gt;
&lt;p&gt;&lt;img  src=&quot;/_astro/all.DBeaQGmG_1vgG6h.webp&quot; alt=&quot;all.png&quot; width=&quot;2411&quot; height=&quot;1221&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;実装の話&quot;&gt;実装の話&lt;/h1&gt;
&lt;p&gt;バージョンは2020-06-21(日)時点で最新の&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/tree/ingress-nginx-2.7.0&quot;&gt;ingress-nginx-2.7.0&lt;/a&gt;&lt;br&gt;
マニフェストは&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/deploy/static/provider/baremetal/deploy.yaml&quot;&gt;baremetal/deploy.yaml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;マニフェストを見るとcontrollerのDeploymentやJobが動いている事がわかる。&lt;br&gt;
Podとして動いているものを順番に見ていく事にする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#ingress-nginx-controller&quot;&gt;ingress-nginx-controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ingress-nginx-admission-create&quot;&gt;ingress-nginx-admission-create&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ingress-nginx-admission-patch&quot;&gt;ingress-nginx-admission-patch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;ingress-nginx-controller-ingress-nginx-controller&quot;&gt;ingress-nginx-controller {#ingress-nginx-controller}&lt;/h1&gt;
&lt;p&gt;イメージとしては下記のような順番で生成されている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;alpine:3.11&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;break-all&quot; href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/images/nginx/rootfs/Dockerfile&quot;&gt;quay.io/kubernetes-ingress-controller/nginx:e3c49c52f4b74fe47ad65d6f3266a02e8b6b622f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/rootfs/Dockerfile&quot;&gt;quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ビルド&quot;&gt;ビルド&lt;/h2&gt;
&lt;p&gt;ビルドは &lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/build/build.sh#L49&quot;&gt;build/build.sh&lt;/a&gt; で行なっていて3つのバイナリを作っている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#controller&quot;&gt;nginx-ingress-controller&lt;/a&gt; はcontroller本体&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#wait-shutdown&quot;&gt;wait-shutdown&lt;/a&gt; は &lt;code&gt;preStop&lt;/code&gt; で叩いている&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#dbg&quot;&gt;dbg&lt;/a&gt; はnginxの状態を検査するデバッグ用のツールである&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -ldflags&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;-s -w &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.RELEASE=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TAG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.COMMIT=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;GIT_COMMIT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.REPO=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;REPO_INFO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;rootfs/bin/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ARCH&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/nginx-ingress-controller&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/cmd/nginx&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -ldflags&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;-s -w &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.RELEASE=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TAG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.COMMIT=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;GIT_COMMIT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.REPO=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;REPO_INFO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;rootfs/bin/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ARCH&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/dbg&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/cmd/dbg&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -ldflags&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;-s -w &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.RELEASE=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;TAG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.COMMIT=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;GIT_COMMIT&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    -X ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/version.REPO=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;REPO_INFO&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;rootfs/bin/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ARCH&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/wait-shutdown&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PKG&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}/cmd/waitshutdown&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;nginxのバイナリは &lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/images/nginx/rootfs/build.sh&quot;&gt;images/nginx/rootfs/build.sh&lt;/a&gt; で行なっていて、モジュール等のバージョンが書いてある。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;controller本体-controller&quot;&gt;controller本体 {#controller}&lt;/h2&gt;
&lt;h3 id=&quot;マニフェスト&quot;&gt;マニフェスト&lt;/h3&gt;
&lt;p&gt;提供されているマニフェストでは下記のような&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/deploy/static/provider/baremetal/deploy.yaml#L340&quot;&gt;引数&lt;/a&gt;で起動している。&lt;br&gt;
全ての引数の詳細は&lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/user-guide/cli-arguments/&quot;&gt;Command line arguments&lt;/a&gt;に書いてある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--election-id&lt;/code&gt; はHPAやreplica数を増やした場合にリーダー選出するためのidである、リーダー選出する実装については&lt;a href=&quot;#leader-election&quot;&gt;ここ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ingress-class&lt;/code&gt; はクラスタ内で複数のIngress Controllerを動かしている際に指定が必要になる、GKEを使ってる場合とかはちゃんと指定する必要がある&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--validating-webhook&lt;/code&gt; は&lt;a href=&quot;#admission-controller&quot;&gt;Admission Controller&lt;/a&gt;を&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/nginx.go#L113&quot;&gt;起動して&lt;/a&gt;シンタックスエラーがないか等を調べる、指定しない場合は起動されない&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/nginx-ingress-controller&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--election-id=ingress-controller-leader&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--ingress-class=nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--configmap=ingress-nginx/ingress-nginx-controller&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--validating-webhook=:8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--validating-webhook-certificate=/usr/local/certificates/cert&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--validating-webhook-key=/usr/local/certificates/key&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;maingo&quot;&gt;main.go&lt;/h3&gt;
&lt;p&gt;フラグのパースやサーバーの起動を&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/cmd/nginx/main.go#L55&quot;&gt;実装&lt;/a&gt;している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kubernetesのバージョンが &lt;code&gt;v1.14.0&lt;/code&gt; &lt;code&gt;v1.18.0&lt;/code&gt; と比べてログを出したり &lt;code&gt;IngressClass&lt;/code&gt; リソースから取得したりする&lt;br&gt;
&lt;code&gt;v1.14.0&lt;/code&gt; 未満では &lt;code&gt;k8s.io/api/extensions/v1beta1&lt;/code&gt; を使うようにログに出る&lt;br&gt;
&lt;code&gt;v1.18.0&lt;/code&gt; からは &lt;code&gt;IngressClass&lt;/code&gt; リソースが&lt;a href=&quot;https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#extended-configuration-with-ingress-classes&quot;&gt;実装&lt;/a&gt;されていて、&lt;code&gt;kubernetes.io/ingress.class&lt;/code&gt; アノテーションは非推奨になった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ヘルスチェック用のサーバー起動&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoやNginxのメトリクスを収集するためのCollectorの起動&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-nginx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -it&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-nginx-controller-7fd7d8df56-dv7s6&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;curl -s localhost:10254/metrics | grep go_gc&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# TYPE go_gc_duration_seconds summary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{quantile=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 3.58e-05&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{quantile=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;0.25&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 9.96e-05&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{quantile=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;0.5&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.0002579&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{quantile=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;0.75&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.0006037&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;{quantile=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.009535&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds_sum&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.0567369&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;go_gc_duration_seconds_count&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 75&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;pprof用のエンドポイントを生やす、デフォルトでは &lt;code&gt;10245&lt;/code&gt; 番のポートで開放されていてここで&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/cmd/nginx/main.go#L311&quot;&gt;実装&lt;/a&gt;されている&lt;/li&gt;
&lt;li&gt;controllerの起動&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;controller.NewNGINXController&lt;/code&gt; にはcontrollerの実装が書かれているので次はここの実装を&lt;a href=&quot;#NewNGINXController&quot;&gt;見る&lt;/a&gt;。&lt;br&gt;
&lt;code&gt;SIGTERM&lt;/code&gt; を投げることで停止されるようになっている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;ngx &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; controller.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewNGINXController&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(conf, mc)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;mux &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; http.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewServeMux&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;registerHealthz&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(nginx.HealthPath, ngx, mux)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;registerMetrics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(reg, mux)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; startHTTPServer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(conf.ListenPorts.Health, mux)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;go&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ngx.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Start&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;handleSigterm&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(ngx, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;code&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	os.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Exit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(code)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;internalingresscontrollernginxgo&quot;&gt;internal/ingress/controller/nginx.go&lt;/h3&gt;
&lt;h4 id=&quot;func-newnginxcontrollerconfiguration-metriccollector-nginxcontroller-newnginxcontroller&quot;&gt;func NewNGINXController(*Configuration, metric.Collector) *NGINXController {#NewNGINXController}&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EventBroadcaster&lt;/code&gt; の作成、&lt;a href=&quot;https://kubernetes.io/blog/2018/01/reporting-errors-using-kubernetes-events/&quot;&gt;ここ&lt;/a&gt;にサンプルがあるがこれを使う事で &lt;code&gt;Events&lt;/code&gt; に書き込む事ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;eventBroadcaster &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; record.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewBroadcaster&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;eventBroadcaster.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;StartLogging&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(klog.Infof)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;eventBroadcaster.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;StartRecordingToSink&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;v1core&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;EventSinkImpl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Interface: config.Client.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;CoreV1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Events&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(config.Namespace),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/resolv.conf&lt;/code&gt; から &lt;code&gt;nameserver&lt;/code&gt; の取得&lt;/li&gt;
&lt;li&gt;Admission Controllerの設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;store.New&lt;/code&gt; でIngressやSecretといった各リソースのイベントが発火された際の処理を&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/store/store.go#L229&quot;&gt;実装&lt;/a&gt;している&lt;br&gt;
イベントの発火後は引数の &lt;code&gt;updateCh&lt;/code&gt; に送信し、&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/nginx.go#L350&quot;&gt;ここ&lt;/a&gt;で受信する。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n.store &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; store.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;New&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.Namespace,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.ConfigMapName,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.TCPConfigMapName,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.UDPConfigMapName,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.DefaultSSLCertificate,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.ResyncPeriod,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.Client,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	n.updateCh,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	pod,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	config.DisableCatchAll)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(*NGINXController).syncIngress&lt;/code&gt; を &lt;code&gt;syncQueue&lt;/code&gt; のcallback関数として指定している&lt;br&gt;
キューにタスクが追加されるたびに &lt;code&gt;syncIngress&lt;/code&gt; が実行される&lt;br&gt;
&lt;code&gt;syncIngress&lt;/code&gt; では実際にEndpointsを取ったりしている、ここは&lt;a href=&quot;#syncIngress&quot;&gt;詳しく&lt;/a&gt;見ていく: &lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/nginx.go#L139&quot;&gt;nginx.go#L139&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n.syncQueue &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; task.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewTaskQueue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n.syncIngress)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/rootfs/etc/nginx/template/nginx.tmpl&quot;&gt;nginx.confのテンプレート&lt;/a&gt;の初期化&lt;br&gt;
コンテナ内では &lt;code&gt;/etc/nginx/template/nginx.tmpl&lt;/code&gt; に配置されるのでConfigMapを使う事で&lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/custom-template/&quot;&gt;任意のnginx.confで動かす&lt;/a&gt;事が可能&lt;/li&gt;
&lt;li&gt;GeoIPファイルの監視の設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;func-nginxcontroller-start-controller-start&quot;&gt;func (*NGINXController) Start() {#controller-start}&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;electionID&lt;/code&gt; を使ったリーダー選出し、Ingressリソースのステータスを更新するPodを決める、リーダー選出は &lt;code&gt;client-go&lt;/code&gt; で&lt;a href=&quot;#leader-election&quot;&gt;実装&lt;/a&gt;されている。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--enable-ssl-passthrough&lt;/code&gt; を指定してcontrollerを起動した場合に、 &lt;code&gt;nginx.ingress.kubernetes.io/ssl-passthrough&lt;/code&gt; アノテーションのついたリソースでSSLパススルーを行うプロキシサーバーの&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/nginx.go#L748&quot;&gt;起動&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Admission Controller&lt;/code&gt; の起動&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Nginx&lt;/code&gt; の起動&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;syncQueue&lt;/code&gt; の起動、&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go#L140&quot;&gt;Exponential Backoff&lt;/a&gt; によるリトライの実装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Nginx&lt;/code&gt; の起動&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;updateCh&lt;/code&gt; から受信したイベントを &lt;code&gt;syncQueue&lt;/code&gt; に流す&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;func-nginxcontroller-stop-error&quot;&gt;func (*NGINXController) Stop() error&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Admission Controller&lt;/code&gt; の停止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Nginx&lt;/code&gt; の停止、&lt;code&gt;Nginx&lt;/code&gt; が停止しているかどうかはプロセスの一覧を取ってnginxという名前がないか見ているだけのシンプルな実装である&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;func-nginxcontroller-syncingressinterface-error-syncingress&quot;&gt;func (*NGINXController) syncIngress(interface{}) error {#syncIngress}&lt;/h4&gt;
&lt;p&gt;キューにタスクが追加されるたびにこの関数が実行される。&lt;br&gt;
実行は&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/task/queue.go#L129&quot;&gt;ここ&lt;/a&gt;でしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実際にここの処理で &lt;code&gt;Endpoints&lt;/code&gt; を取得していることが確認できる&lt;br&gt;
&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/controller.go#L403&quot;&gt;getConfiguration&lt;/a&gt; =&gt; &lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/controller.go#L453&quot;&gt;getBackendServers&lt;/a&gt; =&gt; &lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/controller.go#L708&quot;&gt;createUpstreams&lt;/a&gt; =&gt; &lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/controller.go#L878&quot;&gt;serviceEndpoints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;endp, err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;serviceEndpoints&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(svcKey, path.Backend.ServicePort.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/docs/user-guide/nginx-configuration/annotations.md#service-upstream&quot;&gt;service-upstream&lt;/a&gt; が指定されている場合は &lt;code&gt;Endpoints&lt;/code&gt; ではなく &lt;code&gt;Service&lt;/code&gt; に振られているIPを使う&lt;/li&gt;
&lt;li&gt;テンプレートを評価し、&lt;code&gt;nginx -s reload&lt;/code&gt; を実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;admission-controller-admission-controller&quot;&gt;Admission Controller {#admission-controller}&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Admission Controller&lt;/code&gt; のHadnlerの実装は&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/admission/controller/server.go#L60&quot;&gt;ここ&lt;/a&gt;でしている。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n.cfg.ValidationWebhook &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		n.validationWebhookServer &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;http&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Server&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			Addr:      config.ValidationWebhook,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			Handler:   adm_controler.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewAdmissionControllerServer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;adm_controler&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;IngressAdmission&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{Checker: n}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;			TLSConfig: ssl.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewTLSListener&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n.cfg.ValidationWebhookCertPath, n.cfg.ValidationWebhookKeyPath).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;TLSConfig&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;NGINXController&lt;/code&gt; は &lt;code&gt;CheckIngress&lt;/code&gt; を&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/internal/ingress/controller/controller.go#L201&quot;&gt;実装&lt;/a&gt;していて、&lt;br&gt;
&lt;code&gt;Admission Controller&lt;/code&gt; がリクエストを受け取ると &lt;code&gt;(*IngressAdmission) HandleAdmission(*v1beta1.AdmissionReview)&lt;/code&gt; が叩かれてその中で &lt;code&gt;CheckIngress&lt;/code&gt; が叩かれる。&lt;/p&gt;
&lt;h3 id=&quot;nginxcontroller-checkingressnetworkingingress-error&quot;&gt;(*NGINXController) CheckIngress(*networking.Ingress) error&lt;/h3&gt;
&lt;p&gt;下記のような事を行なっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubernetes.io/ingress.class&lt;/code&gt; アノテーションが起動時に指定した &lt;code&gt;--ingress-class&lt;/code&gt; と一致するかどうか&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;networking.k8s.io/v1beta1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;application-ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  annotations&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    kubernetes.io/ingress.class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;nginx&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  backend&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    serviceName&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;application-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    servicePort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;8080&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;起動時に &lt;code&gt;--watch-namespace&lt;/code&gt; を指定していた場合、指定された &lt;code&gt;Namescape&lt;/code&gt; かどうか&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginx -t&lt;/code&gt; による生成する予定の &lt;code&gt;nginx.conf&lt;/code&gt; のテスト&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;leader-election-leader-election&quot;&gt;Leader Election {#leader-election}&lt;/h2&gt;
&lt;p&gt;Leaderとなった &lt;code&gt;Pod&lt;/code&gt; は &lt;code&gt;Ingress&lt;/code&gt; のステータスを毎秒同期している。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;client-go&lt;/code&gt; で&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go#L197&quot;&gt;実装&lt;/a&gt;されていて、 &lt;code&gt;ConfigMap&lt;/code&gt; を使いロックをしている。&lt;br&gt;
Leaderが落ちたりして &lt;code&gt;renewTime&lt;/code&gt; の更新ができなかった場合は他の &lt;code&gt;Pod&lt;/code&gt; が &lt;code&gt;renewTime&lt;/code&gt; と &lt;code&gt;holderIdentity&lt;/code&gt; を更新しLeaderに昇格する。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-nginx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cm/ingress-controller-leader-nginx&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;apiVersion:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;kind:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ConfigMap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  annotations:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    control-plane.alpha.kubernetes.io/leader:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{&quot;holderIdentity&quot;:&quot;ingress-nginx-controller-75f84dfcd7-f22xq&quot;,&quot;leaseDurationSeconds&quot;:30,&quot;acquireTime&quot;:&quot;2020-06-22T14:38:14Z&quot;,&quot;renewTime&quot;:&quot;2020-07-15T18:22:19Z&quot;,&quot;leaderTransitions&quot;:0}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  creationTimestamp:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;2020-06-22T14:38:14Z&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  managedFields:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apiVersion:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    fieldsType:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; FieldsV1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    fieldsV1:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;      f:metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        f:annotations:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;          .:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          f:control-plane.alpha.kubernetes.io/leader:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    manager:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx-ingress-controller&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    operation:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    time: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;2020-07-15T18:22:19Z&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  name:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-controller-leader-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  namespace:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  resourceVersion:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;295822&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  selfLink:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /api/v1/namespaces/ingress-nginx/configmaps/ingress-controller-leader-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  uid:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 00f21dfe-d5d9-4dc0-becf-e7bbd45be4ff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wait-shutdown-wait-shutdown&quot;&gt;wait-shutdown {#wait-shutdown}&lt;/h2&gt;
&lt;p&gt;シンプルな&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/cmd/waitshutdown/main.go#L29&quot;&gt;実装&lt;/a&gt;だった。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;go&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; exec.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Command&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;bash&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;-c&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pkill -SIGTERM -f nginx-ingress-controller&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; err &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nil&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	klog.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Errorf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;unexpected error terminating ingress controller: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;%v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, err)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	os.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Exit&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// wait for the NGINX process to terminate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;timer &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; time.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;NewTicker&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(time.Second &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; timer.C {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;	if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;nginx.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;IsRunning&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;		timer.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Stop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;		break&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dbg-dbg&quot;&gt;dbg {#dbg}&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/e2e-tests/#debug-cli&quot;&gt;デバッグ用のCLI&lt;/a&gt;である。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /dbg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dbg&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tool&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; quickly&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; inspecting&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nginx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Usage:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  dbg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [command]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Available&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Commands:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  backends&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    Inspect&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dynamically-loaded&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; backends&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  certs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       Inspect&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dynamic&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; SSL&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; certificates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  conf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Dump&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; contents&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /etc/nginx/nginx.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  general&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;     Output&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; general&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dynamic&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; lua&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  help&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;        Help&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; about&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Flags:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  -h,&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --help&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   help&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dbg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Use&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;dbg [command] --help&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; more&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; information&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; about&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; command.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;ingress-nginx-admission-create-ingress-nginx-admission-create&quot;&gt;ingress-nginx-admission-create {#ingress-nginx-admission-create}&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jet/kube-webhook-certgen/tree/v1.2.0&quot;&gt;kube-webhook-certgen&lt;/a&gt;に実装がある。&lt;br&gt;
これは&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/deploy/static/provider/baremetal/deploy.yaml#L522&quot;&gt;何をしているか&lt;/a&gt;というと期限の長い自己証明書を生成してシークレットに設定してくれるやつだ。&lt;/p&gt;
&lt;p&gt;指定されているnamespaceのSecretが存在しなかった場合のみ生成されるようになっている。&lt;br&gt;
ここではAdmission Controllerの証明書を生成しようとしているのがわかる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;create&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;jettech/kube-webhook-certgen:v1.2.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  imagePullPolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;IfNotPresent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;create&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.ingress-nginx.svc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--namespace=ingress-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--secret-name=ingress-nginx-admission&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;100年後で生成されているのが確認できる。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-nginx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; describe&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secret/ingress-nginx-admission&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Name:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;         ingress-nginx-admission&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Namespace:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    ingress-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Labels:&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;       &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Annotations:&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;non&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Type:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  Opaque&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;====&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cert:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  623&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;key:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;   227&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ca:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    485&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; kubectl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ingress-nginx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; secret/ingress-nginx-admission&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; jsonpath=&quot;{.data.ca}&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; base64&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --decode&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; openssl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; x509&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -noout&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -dates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;notBefore&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Jun&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; 22&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 14:32:42&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2020&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GMT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;notAfter&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;May&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; 29&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 14:32:42&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2120&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GMT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;ingress-nginx-admission-patch-ingress-nginx-admission-patch&quot;&gt;ingress-nginx-admission-patch {#ingress-nginx-admission-patch}&lt;/h1&gt;
&lt;p&gt;ではpatchは&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-2.7.0/deploy/static/provider/baremetal/deploy.yaml#L565&quot;&gt;何をしているのか&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;webhook-name&lt;/code&gt; に指定されている名前の &lt;code&gt;ValidatingWebhookConfiguration&lt;/code&gt; を取得し、&lt;br&gt;
実装としては各webhookに対して先程生成した自己証明書と &lt;code&gt;failure-policy&lt;/code&gt; を設定している。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;create&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;jettech/kube-webhook-certgen:v1.2.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  imagePullPolicy&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;IfNotPresent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;create&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.ingress-nginx.svc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--namespace=ingress-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;--secret-name=ingress-nginx-admission&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;何をしているかはわかったがこれはcreateと一緒に済ませる事ができそうな感じがしてるので&lt;br&gt;
これが導入された経緯も探してみたが特に書いてないので &lt;code&gt;jettech/kube-webhook-certgen&lt;/code&gt; についても深追いしてみる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/ingress-nginx/pull/3802&quot;&gt;Add a validating webhook for ingress sanity check #3802&lt;/a&gt;&lt;br&gt;
このPRでAdmission Controllerによる検証が導入された。この時点ではJobは導入されていない。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/helm/charts/pull/17230&quot;&gt;[stable/nginx-ingress] Add Validation webhook for nginx ingress controller #17230&lt;/a&gt;&lt;br&gt;
このPRでhelmチャートに追加された。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;jettechkube-webhook-certgen&quot;&gt;jettech/kube-webhook-certgen&lt;/h1&gt;
&lt;p&gt;結論から書くと設計思想のようなものは見つける事ができなかった。&lt;/p&gt;
&lt;p&gt;helmチャートのPRを見るとわかるが、 &lt;code&gt;Implementation is inspired by the prometheus operator webhooks&lt;/code&gt; と書いていて &lt;a href=&quot;https://github.com/helm/charts/tree/8655b15921983c742bc3e6750ffae6ca03c98b1d/stable/prometheus-operator/templates/prometheus-operator/admission-webhooks/job-patch&quot;&gt;同じ仕組み&lt;/a&gt;で動いている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/helm/charts/pull/14543&quot;&gt;[stable/prometheus-operator] PrometheusRule Admission Webhooks #14543&lt;/a&gt;&lt;br&gt;
このPRでhelmチャートに追加された。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/helm/charts/tree/8655b15921983c742bc3e6750ffae6ca03c98b1d/stable/prometheus-operator#prometheusrules-admission-webhooks&quot;&gt;PrometheusRules Admission Webhooks&lt;/a&gt;&lt;br&gt;
ドキュメントには上で書いていたような事がちゃんと書かれていた。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Review 2019</title><link>https://blog.sakamo.dev/post/review-2019/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/review-2019/</guid><description>2019 年も終わりなので Twitter を見て今年一年を振り返ろうと思う。</description><pubDate>Sun, 29 Dec 2019 14:42:00 GMT</pubDate><content:encoded>&lt;p&gt;今年一番大きかった出来事は転職だ。&lt;/p&gt;
&lt;p&gt;前職の&lt;a href=&quot;https://www.gmo.jp/&quot;&gt;GMOインターネット&lt;/a&gt;ではサービスデザインチームという部署で&lt;a href=&quot;https://www.conoha.jp/&quot;&gt;ConoHa&lt;/a&gt;というプロダクトをビジネスサイドから関わっていた。&lt;br&gt;
OS・アプリケーションのイメージを作ったり、オブジェクトストレージのドキュメントを書いたりしてた。&lt;/p&gt;
&lt;p&gt;現職の&lt;a href=&quot;https://linegt.com/ja/&quot;&gt;LINE Growth Technology&lt;/a&gt;ではGoを書いたり、Kubernetesの検証とかをしている。&lt;/p&gt;
&lt;p&gt;去年の始めにこんなことを言っているが、競プロは少しだけ頑張ってOSSと資格は特に何もやっていない。&lt;br&gt;
来年はOSSにコントリビュートしたいし資格も取りたい。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;OSSか競プロか資格を頑張ります&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1080343335229841408?ref_src=twsrc%5Etfw&quot;&gt;January 2, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;1月&quot;&gt;1月&lt;/h2&gt;
&lt;p&gt;4月にリリースするやつのプロトタイプ的なのを作っていた記憶がある&lt;br&gt;
プライベートではRustを書いていた&lt;/p&gt;
&lt;h2 id=&quot;2月&quot;&gt;2月&lt;/h2&gt;
&lt;p&gt;蟻本をこの時期に読み始めたらしいが覚えていない&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;とうとう蟻本を読み始めることに成功した&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1095721693308284928?ref_src=twsrc%5Etfw&quot;&gt;February 13, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;SRE本を買ったが未だに半分ぐらいしか読んでいない&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;やっていきがある &lt;a href=&quot;https://t.co/DB1KPpRSsD&quot;&gt;pic.twitter.com/DB1KPpRSsD&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1098245191436128256?ref_src=twsrc%5Etfw&quot;&gt;February 20, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;3月&quot;&gt;3月&lt;/h2&gt;
&lt;p&gt;部署移動を切望していた&lt;br&gt;
ちなみに年末年始には伝えていたのに話は全然進んでいなかった&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;もう3月なんですけど僕はシステムに行けますか？&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1102866760347246592?ref_src=twsrc%5Etfw&quot;&gt;March 5, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;h2 id=&quot;4月&quot;&gt;4月&lt;/h2&gt;
&lt;p&gt;仕事では一人で開発してたやつでプレスリリースが出せた&lt;br&gt;
サーバーはRust、フロントはNuxtで書いた&lt;/p&gt;
&lt;blockquote&gt;
【GMOインターネット】気軽に使えるVPS「ConoHa byGMO」日本初、コマンド操作不要で「KUSANAGI」の管理が可能なツール「ConoHa KUSANAGI manager」提供開始  
https://prtimes.jp/main/html/rd/p/000002608.000000136.html
&lt;/blockquote&gt;
&lt;p&gt;令和になった&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;令和&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1112545844308262919?ref_src=twsrc%5Etfw&quot;&gt;April 1, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;お名前が繋がりにくくなっているのを見ていた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;お名前落ちてるじゃん&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1112546097115750401?ref_src=twsrc%5Etfw&quot;&gt;April 1, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;ずっとWindowsだったがMacBook Proを買った&lt;br&gt;
整備済み品で買った&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;MBP買ってしまった&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1112630390626250754?ref_src=twsrc%5Etfw&quot;&gt;April 1, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;p&gt;転職を考え始めた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;転職先探してるのでよろしくお願いします&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1119085808051294215?ref_src=twsrc%5Etfw&quot;&gt;April 19, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;5月&quot;&gt;5月&lt;/h2&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;まあ評価されない会社にいてもしょうがないでしょ&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1128833571953659904?ref_src=twsrc%5Etfw&quot;&gt;May 16, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;h2 id=&quot;6月&quot;&gt;6月&lt;/h2&gt;
&lt;p&gt;内定が出た&lt;br&gt;
退職エントリは書いていない&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;退職エントリ書くつもりなのでよろしくお願いします&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1138447473524072450?ref_src=twsrc%5Etfw&quot;&gt;June 11, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;h2 id=&quot;7月&quot;&gt;7月&lt;/h2&gt;
&lt;p&gt;k3sに感動していた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;DockerからPrivateなDocker Registryを使ったk3sに移したけどとても体験が良い&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1151823509124812800?ref_src=twsrc%5Etfw&quot;&gt;July 18, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;8月&quot;&gt;8月&lt;/h2&gt;
&lt;p&gt;人生で2回目の転職をした&lt;br&gt;
From: &lt;a href=&quot;https://www.gmo.jp/&quot;&gt;GMOインターネット株式会社&lt;/a&gt;&lt;br&gt;
To: &lt;a href=&quot;https://linegt.com/ja/&quot;&gt;LINE Growth Technology株式会社&lt;/a&gt;&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;そういえば転職しました &lt;a href=&quot;https://t.co/sFLUnwzvT9&quot;&gt;pic.twitter.com/sFLUnwzvT9&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1163408589144244225?ref_src=twsrc%5Etfw&quot;&gt;August 19, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;この頃は競プロをしていた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;簡易タスクランナー作ったら捗るようになった &lt;a href=&quot;https://t.co/wY4UXQOkaV&quot;&gt;pic.twitter.com/wY4UXQOkaV&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1163838144774463488?ref_src=twsrc%5Etfw&quot;&gt;August 20, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;h2 id=&quot;9月&quot;&gt;9月&lt;/h2&gt;
&lt;p&gt;チームで使ってるJenkinsfileと戦っていた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;秘伝のJenkinsfile感あるな&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1173928402446778369?ref_src=twsrc%5Etfw&quot;&gt;September 17, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;10月&quot;&gt;10月&lt;/h2&gt;
&lt;p&gt;何もしていない&lt;/p&gt;
&lt;h2 id=&quot;11月&quot;&gt;11月&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/rui314&quot;&gt;Rui Ueyama@rui314&lt;/a&gt;さんの&lt;a href=&quot;https://www.sigbus.info/compilerbook&quot;&gt;Cコンパイラ&lt;/a&gt;をGoで書いていた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;gccでちゃんと-gつけてから、gdb使ったら普通に便利で・・・&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1193553569892327424?ref_src=twsrc%5Etfw&quot;&gt;November 10, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;12月&quot;&gt;12月&lt;/h2&gt;
&lt;p&gt;カオスエンジニアリングとかoperator-sdkとか色々見てた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;und&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://t.co/W1EapXzUzS&quot;&gt;https://t.co/W1EapXzUzS&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1206092072907722752?ref_src=twsrc%5Etfw&quot;&gt;December 15, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;und&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://t.co/WaYCdw1hwU&quot;&gt;https://t.co/WaYCdw1hwU&lt;/a&gt;&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1208429944088322048?ref_src=twsrc%5Etfw&quot;&gt;December 21, 2019&lt;/a&gt;&lt;/blockquote&gt; 
&lt;p&gt;応用の勉強を始めた&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;そろそろ応用取るか&lt;/p&gt;— さかもとりょーた(21) (@let_constant) &lt;a href=&quot;https://twitter.com/let_constant/status/1210191041967476736?ref_src=twsrc%5Etfw&quot;&gt;December 26, 2019&lt;/a&gt;&lt;/blockquote&gt;</content:encoded></item><item><title>Profile</title><link>https://blog.sakamo.dev/post/profile/</link><guid isPermaLink="true">https://blog.sakamo.dev/post/profile/</guid><pubDate>Wed, 22 May 2019 15:54:08 GMT</pubDate><content:encoded>&lt;h1 id=&quot;ryota-sakamoto27&quot;&gt;Ryota Sakamoto(27)&lt;/h1&gt;
&lt;p&gt;I’m a Software Engineer and interested in container technologies(like Kubernetes), automation platform(like CI/CD, testing), SRE, application performance tuning, and so on.&lt;/p&gt;
&lt;h2 id=&quot;jobs&quot;&gt;Jobs&lt;/h2&gt;
&lt;p&gt;2016/03 ~ 2018/03: Software Engineer at &lt;a href=&quot;https://aijus.com/&quot;&gt;Aijus&lt;/a&gt;&lt;br&gt;
2018/04 ~ 2019/08: Service Design at &lt;a href=&quot;https://www.gmo.jp/&quot;&gt;GMO internet&lt;/a&gt;&lt;br&gt;
2019/08 ~ 2021/07: Software Engineer at &lt;a href=&quot;https://linegt.com/&quot;&gt;LINE Growth Technology&lt;/a&gt;&lt;br&gt;
2021/08 ~ Now: Cloud Support Engineer at &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;Amazon Web Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;oss-maintainer&quot;&gt;OSS Maintainer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/argoproj-labs/argocd-notifications&quot;&gt;argoproj-labs/argocd-notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/argoproj/notifications-engine&quot;&gt;argoproj/notifications-engine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other&quot;&gt;Other&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/let_constant&quot;&gt;Twitter&lt;/a&gt; / &lt;a href=&quot;https://github.com/ryota-sakamoto&quot;&gt;GitHub&lt;/a&gt; / &lt;a href=&quot;https://www.linkedin.com/in/ryota-sakamoto/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>