🤝

Neco Weekly (2022-08-05号)

2022/08/05に公開

Neco Weekly (2022-08-05号)

サイボウズ Neco チームでは、 Neco Weekly という「最近気になる Cloud Native 関連のネタを共有する会」を社内で開催しています。
本記事は共有会の中で紹介したネタをまとめたものです。

今回は第3回目の記事となります。

✨ New Features

Kubebuilder v3.6.0

https://github.com/kubernetes-sigs/kubebuilder/releases/tag/v3.6.0

Kubebuilder v3.6.0 がリリースされました。
今回は新しいプラグインが追加されています。

grafana プラグインを利用すると、カスタムコントローラーから収集したメトリクスを表示するための Grafana ダッシュボードが生成できるようです。

deploy.image プラグインを利用すると、「カスタムコントローラーの環境変数にコンテナイメージ名を指定し、
Deployment や StatefulSet などを生成する際に指定されたコンテナイメージを利用する」ためのコードが生成されるようです。

Kubebuilder は今後こういった形のプラグインがどんどん増えていくのかもしれませんね。

KEP-2091: Add support for AdminNetworkPolicy resources

https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/2091-admin-network-policy/README.md

AdminNetworkPolicy というリソースに関する KEP (Kubernetes Enhancement Proposal: Kubernetesの新機能提案)です。

これまでの NetworkPolicy リソースでは、マルチテナント環境において適切なポリシーを設定することが難しいという問題があります。
例えば、以下のようなポリシーを実現することは簡単ではないでしょう。

  • クラスタ管理者として絶対に守ってもらいたいポリシーを定義する。クラスタの利用ユーザーはポリシーの上書きはできない。
  • クラスタ管理者としてデフォルトのポリシーを定義する。クラスタの利用ユーザーは必要に応じてポリシーを上書きできる。
  • 1 つのテナントが複数の namespace を利用している場合、テナント間のネットワークを分離するためのポリシーを定義する。

これらの問題をどのように解決すればいいのでしょうか?
例えば Calico の NetworkPolicy には Order というフィールドがあり、
ポリシーごとの優先順位を指定することができます。
そして Admission Webhook を利用してテナントユーザーが書き換え可能な Order を制限すれば、ポリシーの上書きが可能かどうかを制御することができるでしょう。

一方 Cilium の NetworkPolicy には、優先順を設定するような仕組みはありません。
そこで Neco チームでは Tenet という OSS を開発し、この問題を解決していました。

この KEP は AdminNetworkPolicy という新しいリソースを導入し、上記のような問題点を解決しようという提案です。
Priority で優先順位を制御できたり、 Pass という Action を指定することでテナントユーザーがポリシーを書き換え可能にしたり、
NamespaceSelector により複数の Namespace にマッチするポリシーを書くことができたりするようです。
必要な機能がしっかりと盛り込まれていて、導入されるのが非常に待ち遠しいですね。

なお、Calico にはすでに対応のための Issue が立てられていました。

📘 Books

Go言語による分散サービス

https://www.oreilly.co.jp/books/9784873119977/

gRPC, サービスディスカバリ、分散合意などをコードを元に解説しながら分散システムを実装するという内容の書籍です

サービスディスカバリには Serf を利用し、分散合意のためには Raft をライブラリとして利用しているので、難易度はそれほど高くないと思います。
非常に丁寧にコードを解説しているので、分散システムを学ぶための入門書としてとてもよさそうです。

Necoチームでは、Serf を利用してノードの死活監視をおこなったり、etcd を利用して分散システムを開発したりしているので、チーム必読の書籍とも言えそうです。

コードは以下のリポジトリで公開されています。

本書は基本的には文字とコードのみで解説していて、図はほとんど出てきません。
また Serf や Raft の説明もそこまで詳しく書かれているわけではありません。
理論をしっかりと学びたい場合は「データ指向アプリケーションデザイン」なども併せて読むのがおすすめです。

また、少し古いですが以下の記事も併せて読むと理解が深まると思います。

🤝 Events

KubeCon + CloudNativeCon North America 2022

https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/program/schedule/

10 月に開催される KubeCon NA のスケジュールが公開されていたので、個人的に気になるセッションをピックアップしてみました。

面白そうなセッションが盛りだくさんで楽しみですね!

👀 Notable Articles

eBPF, sidecars, and the future of the service mesh

https://buoyant.io/blog/ebpf-sidecars-and-the-future-of-the-service-mesh

2022-07-22号 でも軽く触れましたが、サービスメッシュを実現する際に、
サイドカーとしてアプリケーションごとにプロキシを立てるのか、ホストごとにプロキシを立てるのか、プロキシなしなのか、
どの方式が良いのかを解説している記事です。

この記事ではサイドカー方式がよいという結論ですが、eBPF の技術的な制限や、Linkerd v1 の反省に基づいて解説しているので、非常に説得力の高い内容となっています。

🛠️ Tools, Frameworks, Libraries

Goodbye Sealed Secrets, hello SOPS

https://itnext.io/goodbye-sealed-secrets-hello-sops-3ee6a92662bb

SealedSecret にはいくつか問題があるので、代わりに SOPS はどうかと紹介している記事です。
SOPS には以下のような特徴があるそうです。

  • リソース全体を暗号化するのではなく指定したフィールドの値のみを暗号化できる
  • 1 バイナリとして動くので、カスタムコントローラーをデプロイする必要がない

1 バイナリとして動くので、Argo CD のような CD ツールでデプロイする際には一工夫必要になりそうですね。

Metacontroller

https://metacontroller.github.io/metacontroller/intro.html

先に紹介した「Go言語による分散サービス」の中で登場したので調べてみました。
これは、カスタムリソースと簡単なスクリプトを書くだけでカスタムコントローラーがデプロイできてしまうというものです。
スクリプトは、Jsonnet, Go, Java などの言語で書けるようです。

自分たちでカスタムコントローラーを実装するのに比べると制約は多そうですが、ちょっとしたコントローラーを手軽に作りたいときには便利かも知れませんね。

Why and How to Use containerd From Command Line

https://iximiuz.com/en/posts/containerd-command-line-clients/

containerd のコマンドラインツールの選択肢として ctr, nerctl, crictl がありますが、それらの比較をしている記事です。

  • ctr: containerd の API をそのまま叩いてる。ユーザーフレンドリーではないがデバッグや学習用とで役立つ。
  • nerdctl: Docker 互換を目指している。stargz や ipfs などの containerd の新機能が利用できる。
  • crictl: CRI API に対応したツール。

あとがき

NecoWeekly を始めて一番よかったことは、これまで後で読もうと思って溜め込んでいた記事をちゃんと読むようになったことです。

サイボウズ Necoチーム 😺

Discussion