Cilium BGP Control Plane の話題など: Neco Weekly (2023-09-15号)

2023/09/22に公開

Neco Weekly (2023-09-15号)

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

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

👀 Notable Articles

Cilium BGP Control Plane 使ってみました

https://terassyi.net/posts/2023/09/04/try-cilium-bgp-cp.html

Cilium は MetalLB というソフトウェアを利用して BGP によるロードバランサー機能を提供しているのですが、今後は GoBGP を利用した BGP Control Plane という仕組みに置き換わる予定です。
この記事では、BGP Control Plane を利用して Kubernetes クラスターの外部から Pod にアクセスできるようにする方法を紹介しています。
また、 Containerlab というコンテナベースのネットワーク検証環境を YAML で宣言的に構築できるツールの使い方も紹介しています。

controller-runtime Deep Dive

サイボウズのサマーインターンを実施している中で Kubernetes のカスタムコントローラーに関していくつか質問があったので、Q&A 方式で紹介したいと思います。

Q. Reconcile の中でリソースを更新する場合は、Informer のキャッシュが上書きされないように DeepCopy する必要があるのではないでしょうか?
A. client-go を生で利用している場合はコピーしなければならないケースもありますが、controller-runtime ではキャッシュから読み取る際に DeepCopy しているのでコピーは不要です。なお、コピーするかどうかはオプションで無効化することも可能です。
https://github.com/kubernetes-sigs/controller-runtime/blob/1449c365465511e047333f9bc504e47cb0fae1ae/pkg/cache/internal/cache_reader.go#L83-L89

Q. controller-runtimeClientUpdate を利用して status サブリソースを更新することはできません。一方で status 以外のサブリソースは更新できるのですが、これはなぜでしょうか?
A. API Convention には、誤って status を更新してしまわないように spec の更新時には status は無視しなければならないと記述されています。
https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
また、Kubernetes のコードとしても、status を無視するような実装になっています。
https://github.com/kubernetes/kubernetes/blob/294bde0079a0d56099cf8b8cf558e3ae7230de12/pkg/registry/apps/deployment/strategy.go#L66-L74
https://github.com/kubernetes/kubernetes/blob/a0873d37c58757ac6c2a339af1e4f8d601cdef20/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go#L96-L106

Q. Reconcilerequeue: true を返した場合、Reconcile が呼び出されるバックオフの時間はどうなるのでしょうか?
A. バックオフ時間は指数関数的に増加します。初期値は5msで最大1000秒まで。

Q. Pod リソースの .spec.nodeName は Immutable なのに、kube-scheduler はどうやってその値を書き換えているのでしょうか?
A. .spec.nodeNamepods/binding というサブリソースになっています。サブリソースとして更新することでその値を書き換えることができます。

Kubernetesソースコードリーディング入門

https://speakerdeck.com/bells17/kubernetessosukotoriteinkuru-men

Kubernetes のソースコードを読むにあたって必要な知識を紹介しているスライドです。
弊チームの OSS や、つくって学ぶ Kubebuilder も紹介してくれています。

23新卒エンジニアがチーム開発研修で学んだこと

https://blog.cybozu.io/entry/2023/09/15/080000

サイボウズの新卒エンジニア向け研修の成果報告ブログです。
わずか2週間の研修の中で MOCOTopoLVM を利用したインフラを構築していて驚きです。

Go1.22で登場するかも!?開発中の新機能イテレータを使ってみる!

https://zenn.dev/team_soda/articles/0b57bba3a3665f

Go 1.22 で導入予定のイテレータについて、その仕様を詳しく紹介している記事です。
他の言語のイテレータと比べると仕様がやや複雑になっているように感じました。

Goのzero識別子追加プロポーザルと導入される仕様について

https://tomato3713.hatenablog.com/entry/go-proposal-61374-zero

Go に追加される予定の zero 識別子について紹介している記事です。
Generics を書くときにたまにほしくなりますよね。

Kubernetes Deployment の rollout status の罠

https://blog.cybozu.io/entry/2023/09/08/080000

Deployment のローリングアップデート時に、古い方の Pod にリクエストが転送されてしまう問題について紹介している記事です。

🛠️ Tools, Frameworks, Libraries

Introducing Grafana Beyla: open source ebpf auto-instrumentation for application observability

https://grafana.com/blog/2023/09/13/grafana-beyla-open-source-ebpf-auto-instrumentation/

eBPF を使って、HTTP や gRPC のリクエストのトレース情報を自動的に収集してくれるツールです。
Grafana は、オブザーバビリティ関連のツールを次々とリリースしていて驚きです。

Kubebuilder v3.12.0

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

Kubebuilder v3.12.0 がリリースされました。
今回は、Google Summer Code Program 2023 の開発成果である re-scaffold 機能がアルファ版として公開されています。
これにより自作したカスタムコントローラーのアップグレードが簡単になることが期待されます。

あとがき

最近 Platform Engineering がとても気になっています。
きちんと勉強してチーム運営に取り込んでいきたいと思っています。

サイボウズ Necoチーム 😺

Discussion