Argo CDパフォーマンス、読みやすいGoの書き方、Landlockの紹介記事など: Neco Weekly (2023-02-17号)
Neco Weekly (2023-02-17号)
サイボウズ Neco チームでは、 Neco Weekly という「最近気になる Kubernetes や Cloud Native 関連のネタを共有する会」を社内で開催しています。
本記事は共有会の中で紹介したネタをまとめたものです。
今回は第23回目の記事となります。
👀 Notable Articles
Sync 10,000 Argo CD Applications in One Shot
Argo CD において大量の Application を同期する際のパフォーマンスに関する記事です。
CPU がボトルネックになりやすく特に Kustomize が CPU をたくさん使うとか、resync の期間が短いと問題になることがあるとか、数千から1万の Application を同期すると数十分の遅れが発生するなど、とても興味深い内容になっています。
Pull request merge queue (public beta)
GitHub の Merge queue の仕組みが Public Beta になりました。
これは、CI をパスした PR を Merge queue に積んでおけば、順番に main ブランチとマージしてテストした後、main ブランチに取り込んでくれるというものです。
Merge queue の説明は、Merge queues: An intro for mobile engineers という記事が図もあり分かりやすかったです。
Neco チームでは、Kubernetes クラスタ上で動くアプリケーションのマニフェストをモノレポで管理しているのですが、テストの時間が長いうえに複数人が同時に PR を作ることも多いため、main ブランチにマージするために長時間待たされることがよくあります。
Merge queue を使えばそれらの問題を少し緩和できそうなので、ぜひ取り入れてみたいですね。
Last Week in Kubernetes Development
Kubernetes 1.27 に取り込まれる予定の新機能です。
- #114280: Implement kubectl debug profiles: general, baseline, and restricted
-
kubectl debug
では、strace や gdb など強い権限が必要なツールを動かすことがよくありますが、これまではセキュリティポリシーに引っかかって実行できないことがありました。この機能が入ると、Ephemeral Container に対してセキュリティプロファイルを指定できるようになるようです。
-
- #114987: Add applyconfiguration generator to code-generator script
- カスタムコントローラーの実装で Server-Side Apply をおこなう際に、ApplyConfiguration という型を使うことがあるのですが、これまでは標準リソースのものしか用意されていませんでした。この PR では、カスタムリソース用の ApplyConfiguration 型を生成するためのツールが提供されるようです。
どちらも待ち望んでいた機能なのでうれしいですね。
Linuxの新しいsandbox機構「Landlock」
Linux に新しく導入された sandbox 機構である「Landlock」の紹介記事です。
Linux の sandbox 機構としては、apparmor や seccomp など似たような技術はたくさんありますが、Landlock は以下のような特徴があるそうです。
- apparmor はプロファイルの設定に特権が必要になる。seccomp や Landlock はアプリケーション開発者が利用することを意図しており特権が不要になっている。
- seccomp はシステムコール単位でアクセス制御をおこなう。一方 Landlock はファイルシステム単位できめ細やかな制御がおこなえる。
- Landlock は軽量でパフォーマンスが良い。
なお、Landlock はもともと eBPF を使って開発されていましたが、2020年から eBPF を使うのをやめたそうです。
eBPF は非常に強力なため攻撃者に利用された際の影響が大きく、非特権ユーザーが利用する Landlock には向いていないというのが理由のようです。
また containerd や runc に Landlock を導入する Issue も立っていますが、2021年から動きはありませんね…。
- https://github.com/containerd/containerd/issues/6056
- https://github.com/opencontainers/runc/issues/2859
Goの新しい構造化ロガーを体験しよう
slog という Go の新しいロガーパッケージの話。
ロガーライブラリは、Kubernetes では klog, controller-runtime では zap を使うことが多く、どちらも logr.Logger
interface でロガーを差し替えることができるようになっています。
いろいろとロガーを使い分けるのも面倒なので、標準ライブラリで良いものが提供されるようになってくれるとうれしいですね。
How debugging Go programs with Delve and eBPF is faster
Go でよく利用されている Delve というデバッグツールでは、dlv trace
コマンドをつかうと、Go プログラム内でどの関数がどんな引数で呼び出されどんな戻り値を返したかを解析することができます。
この記事では、 dlv trace
で利用している ptrace はオーバーヘッドが大きいため、代わりに eBPF を利用することでパフォーマンスの向上をおこなったということが書かれています。
記事内のベンチマークでは、これまで 2.3s かかっていた処理が、683μs に改善されたとのこと。驚異的な性能改善ですね。
🛠️ Tools, Frameworks, Libraries
Cilium v1.13
Cilium 1.13 がリリースされました。今回も新機能が満載です。
我々が今回のリリースで特に気になるのは「IPAM for LoadBalancer Services and BGP Services Advertisement」です。
現在、Cilium は BGP の経路広告のために MetalLB を利用しているのですが、将来的にはこれを廃止して GoBGP に置き換える計画があります。
この置き換えに向けて、MetalLB がなくても LoadBalancer Service の IP アドレスを割り当て、経路広告できるような機能を実装しています。
Neco チームでは MetalLB を使って経路広告しているので、このあたりの実装がどう進んでいくのか注目しています。
また、今回のリリースでも Neco チームのメンバーからの以下の PR が取り込まれています。引き続き Cilium へのコントリビューションは力を入れていきたいと考えています。
- daemon: Fix BPF host routing can't be enabled if the devices are wildcard (Backport PR #23232, Upstream PR #23009, @ysksuzuki)
gofumpt
gofmt よりも厳しい Go のフォーマットツールです。
主に空行を取り除くようなルールが多いみたいですね。以下のように import を整えてくれるのはうれしいかも。
import (
"foo.com/bar"
"io"
"io/ioutil"
)
import (
"io"
"io/ioutil"
"foo.com/bar"
)
KubeScript
TypeScript で Kubernetes のマニフェストが書けるツールです。
jsonnet のような専用ツールを利用するのではなく、汎用言語を利用することで、既存のライブラリが使えたりコード補完やヘルプの表示が充実していたりメリットが多そうです。
sieve
sieve という Kubernetes コントローラーのテストツールです。
コントローラーがクラッシュしたり、古いキャッシュからリソースを読み込んだり、処理をスキップしたようなケースを擬似的に発生させて、Reconciliation 処理に問題がないか自動的にテストしてくれるツールとのこと。
カスタムコントローラーを実装しているとこういった問題には直面することが多いので、このテストツールはとても役立ちそうです。
Bugs found by Sieve を見ると、実際のコントローラー実装に対していくつも不具合を見つけているようです。
実際に動かすのは大変そう なので、今後使い勝手がよくなることを期待したいですね。
🤝 Events
Recipes for reducing cognitive load
わかりやすい Go のコードを書くための Tips についての講演です。
「ネストを浅くする」、「package に util や common などの名前をつけるのを避ける」「引数に boolean を渡すときに理解しやすいようにわかりやすい名前の定数を用意する」などの手法が紹介されていました。
「Reading like a newspaper」というのもおもしろいですね。
以下のような Function Overloading の手法は、Kubernetes や controller-runtime の実装でもよく見かけるパターンです。
func CreateService(name string, options ...func(*Service)) Service {
res := Service{} // something more meaningful
for _, o := range options {
o(&res)
}
}
「30分でわかるデータ指向アプリケーションデザイン」
データ指向アプリケーションデザインの解説をしている発表です。
データ指向アプリケーションデザインが発売されてから5年たっているので、この発表では書籍で扱っていない新しい話題や発展的な話題も紹介していました。
列指向データフォーマットの例として Apache Parquet が挙げられていましたが、これって Grafana Tempo 2.0 のバックエンドにも採用されたやつだ!みたいな気づきがあったりしてとても面白かったです。
Kubernetes 101 for Network Professionals
ネットワークエンジニア向けの Kubernetes 入門スライドです。
前半は一般的な Kubernetes や CNI の解説で、後半は各 CNI のベンチマークの結果や SRv6 のユースケースが紹介されています。
このスライドの中で紹介されている
Benchmark results of Kubernetes network plugins (CNI) over 10Gbit/s network (Updated: August 2020) という記事は、やや古い内容ではありますが興味深いですね。
Cilium の RAM 消費がやや多いが大規模クラスタに導入するケースでは気になるほどではないとか、暗号化の性能は Calico が優れているが、Cilium は Pod 間だけでなくノード間の通信も暗号化できるというメリットがあるとか。
Best Practices for Operators Monitoring and Observability in Operator SDK
Kubernetes の Operator のオブザーバビリティに関するベストプラクティスを紹介している講演。
メトリクスの名前やラベルの付け方から、アラートの優先度の決め方など、Operator に限らず適用できそうなプラクティスが紹介されています。
📘 Books
Kubernetes Secrets Management
Kubernetes における Secret 管理に関する書籍。これだけで1冊の本になってしまうんですね。
Neco チームでは Secret の管理に SealedSecrets を使っているのですが、Vault を使った仕組みに乗り換えたいなと検討しているところです。
この本はぜひ読んでおきたい。
Go言語プログラミングエッセンス
Go 言語のさまざまなエッセンスを紹介している書籍。気になります。
あとがき
今週の Neco Weekly は興味深いネタが多くて、記事をまとめるのに苦労しました😓
Discussion