Neco Weekly (2022-09-01号)
Neco Weekly (2022-09-01号)
サイボウズ Neco チームでは、 Neco Weekly という「最近気になる Cloud Native 関連のネタを共有する会」を社内で開催しています。
本記事は共有会の中で紹介したネタをまとめたものです。
今回は第6回目の記事となります。
📚 先週号の補足
cgroup v2 の memory.high の挙動について
先週号 で QoS Memory の話をした際に、cgroup v2 の memory.high
の挙動がよく分からないねという話になったのですが、社内の人に参考となるコードを教えてもらいました。
このコードでは、確保したメモリが memory.high
を超えた量に応じて、タスクスケジューラが割り当てる CPU 時間にペナルティを課しているようです。
これにより、メモリを確保し続けるタスクがスケジュールされる時間を減らし、メモリ回収速度とのバランスを取り、メモリ使用量が memory.high
以下に収まることを期待しているようです。
なお、Linux のメモリ管理機能に関しては、以下のページを読んでおくとよさそうです。
PodSecurity Admission
先週号 で、Neco チームでは PodSecurityPolicy の代替として公式の PodSecurity Admission を利用せず、自作のものを利用しているという話をしました。
公式の PodSecurity Admission はプロファイルのカスタマイズが難しいため自作のものを使っているのですが、公式ブログでも以下のように説明されていました。
For more sophisticated use cases, you might need a third-party solution that can be easily combined with Pod Security Admission.
複雑なポリシーを扱うユースケースでは、サードパーティーツールと組み合わせたり、自作ツールを作ったりするのは正しい方針だと言えそうです。
👀 Notable PRs
Ignore non-semantic changes to objects
Kubernetes で Server-Side Apply 方式でリソースを更新する際に、意味的には差分がない場合でもリソースが更新されてしまい、無駄に Reconciliation がトリガーされてしまうという問題があったのですが、それが修正されたようです。
Neco チームではこの問題を回避するために、以下の記事で紹介しているように、クライアントサイドで意味的な変更があるかどうかをチェックしていました。
クライアントサイドでの差分チェック処理が不要になれば、コードもシンプルになるのでありがたいですね。
👀 Notable Articles
Kubernetes Version 1.25: An Overview
Aqua 社による Kubernetes 1.25 に関する記事です。
この記事の中で、Neco チームメンバーの書いた Five Things to Prepare for Cgroup v2 with Kubernetes というブログ記事が紹介されていました。
このように公開した英語ブログが海外のエンジニアに読んでもらえるととても嬉しいですね。
10 Things I wish I’d known before building a Kubernetes CRD controller
Kubernetes のコントローラーを開発する前に知っておきたかった10のことという記事なんですが、カスタムリソースにメタデータを埋め込む際の注意点や、Dynamic Client の使い方など少し珍しいネタが紹介されていて面白かったです。
なお、Dynamic Client の使い方に関しては以下の記事が分かりやすいのでおすすめです。
ちなみに、Neco チームによる Kubernetes Operator 開発で得た知見は以下のスライドにまとまっているので、よろしければ参考にしてみてください。
satlinuxtube
つくって学ぶKubebuilderを題材として、Kubernetes の基本的な話からカスタムコントローラーのつくり方まで解説している動画です。
文章だけでは理解しにくい場合も、動画で解説してくれると理解の助けになりますね。
Argo CRDs and Kustomize: The Problem of Patching Lists
Kustomize でカスタムリソースの Strategic Merge Patch をおこなう際に、リストがうまくマージできないという問題があります。
これは、Kustomize が対象のカスタムリソースのスキーマを持っていないために発生する問題です。(リストの要素のどのフィールドをキーにしてマージすればいいのか判断できないため)
そこでこの記事では、openapi-gen というツールを使って CRD から go のファイルを生成し、そこから OpenAPI 形式のスキーマを出力し、それを Kustomize に渡すことで正しくマージする方法を紹介しています。
なかなか手間のかかる方法なので、この記事の中で紹介されているように Kubernetes や Kustomize 側で対応してほしいですね。
🛠️ Tools
container-tag-exists
コンテナレジストリに指定したタグのイメージが存在するかどうかチェックしてくれるツールです。
Neco チームでは、CI でコンテナイメージをビルドする際にタグのチェックをおこなうことがよくあるので、こういうツールがあると助かります。
あとがき
今週はサマーインターンの課題の中で、Kubernetes の Server-Side Apply と Client-Side Apply が混じったときの挙動に悩まされました。
はやく kubectl や Argo CD などがデフォルトで Server-Side Apply を利用してくれるようになるといいなあ。
Discussion