Let's Build a CNI Plugin! From Linux Networking to CNI

This blog post is a collection of my personal notes on networking. For a long time, I had to jump between different notebooks to connect concepts; from core networking theory, to Linux internals, all the way up to Kubernetes and CNI. This post is my attempt to combine all those notes into a single, logical document. We’ll follow a step-by-step path. We’ll start with fundamental network concepts, then see how those are implemented in Linux, which is the foundation for most modern virtual networking. Finally, we’ll see how Kubernetes builds on top of it all. ...

November 9, 2025 · 70 min · Burak Sekili

Kubernetes Client-Side Indexing

Kubernetes Client-Side Indexing This post is part of Kubernetes controller development. Check out the first part on Diving into controller-runtime | Manager if you are interested in controller-runtime. When working with Kubernetes Operators, read requests (get and list) to the Kubernetes API server are handled by an in-memory cache that is maintained by client-go to reduce the load on your API server. This cache can be enhanced with indexes to retrieve resources more efficiently. ...

October 27, 2024 · 15 min · Burak Sekili

Concurrency Notes in Go

Concurrency Channels Unbuffered channel If channel is unbuffered 1 ch := make(chan struct{}) sending a data to channel will block the goroutine as the channel is nil. 1 2 3 4 5 6 7 package main func main() { ch := make(chan struct{}) ch <- struct{}{} } Output of this program is: 1 2 3 4 5 6 7 $ go run main.go fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.main() /Users/buraksekili/projects/concur/main.go:35 +0x30 exit status 2 As reading from non-nil channel blocks goroutine and since there is no other goroutine reading from this channel exists, the program panics. ...

January 24, 2024 · 3 min · Burak Sekili