Mert Özen Further With Every Line

Blog

Mert Özen's blog posts on software development, backend, frontend, and DevOps.

Series
19 posts found
What Is Kubernetes and When Don't You Need It? Control Plane, Nodes and Desired State
DevOps PART 01

What Is Kubernetes and When Don't You Need It? Control Plane, Nodes and Desired State

Kubernetes is a container orchestration platform where you declare what you want and it keeps pulling the actual state towards it. We watch a deleted pod come back, map the control plane and node components, measure how long a dead node really takes to recover, look at the three-releases-a-year support calendar and ask when Kubernetes is an unnecessary cost.

8 Nov 2026 12 min 3
A Local Kubernetes Cluster and kubectl: kind, k3d, minikube, Contexts and Namespaces
DevOps PART 02

A Local Kubernetes Cluster and kubectl: kind, k3d, minikube, Contexts and Namespaces

We use kind in this series: a three-node cluster comes up from one YAML file in 20 seconds and local images reach the nodes with kind load. We compare kind, k3d, minikube and Docker Desktop, then look at kubeconfig, contexts and namespaces, commands that silently run in the wrong context, the :latest ErrImagePull trap, server dry runs, drift seen through kubectl diff and kubectl version skew, all with real output.

8 Nov 2026 10 min 2
Kubernetes Pods: Running a .NET Container, Lifecycle, Init Containers and Native Sidecars
DevOps PART 03

Kubernetes Pods: Running a .NET Container, Lifecycle, Init Containers and Native Sidecars

A pod is the unit of execution for containers sharing one network; .NET 8+ images listen on 8080, chiseled images come non-root and shell-less, while the full aspnet image trips runAsNonRoot. With real output we look at pod phases, CrashLoopBackOff's doubling backoff, the limits of a wait-for-db init container, native sidecars (stable in 1.33) and why a sidecar that ignores SIGTERM stretches pod deletion by 30 seconds.

8 Nov 2026 11 min 3
Kubernetes Deployments and ReplicaSets: Labels, Rolling Updates, Rollout History and Undo
DevOps PART 04

Kubernetes Deployments and ReplicaSets: Labels, Rolling Updates, Rollout History and Undo

A Deployment finds its pods through a label selector, creates a ReplicaSet per pod template and drives rolling updates with maxSurge, maxUnavailable and minReadySeconds. We watch a four-replica rollout second by second, then see a missing tag hit progressDeadlineSeconds, the gap rollout undo opens with Git, bundling changes with pause, the change-cause trap and immutable image tags, all with real output.

8 Nov 2026 10 min 2
Kubernetes Services: ClusterIP, NodePort, LoadBalancer, DNS and EndpointSlices
DevOps PART 05

Kubernetes Services: ClusterIP, NodePort, LoadBalancer, DNS and EndpointSlices

A Service puts a stable virtual IP and a DNS name such as api.bookstore.svc.cluster.local in front of changing pod IPs, taking addresses from EndpointSlices and routing from kube-proxy rules. With real output we look at named targetPorts, per-connection load balancing and HttpClient, readiness pulling every pod out of traffic, NodePort vs LoadBalancer vs headless, the 1.36 externalIPs deprecation and empty-endpoint traps.

8 Nov 2026 10 min 3
External Traffic in Kubernetes: Ingress, the ingress-nginx Retirement and Gateway API with HTTPRoute
DevOps PART 06

External Traffic in Kubernetes: Ingress, the ingress-nginx Retirement and Gateway API with HTTPRoute

The Ingress API is frozen and ingress-nginx retired in March 2026; the way forward is the Gateway API, split into GatewayClass, Gateway and HTTPRoute. We install Envoy Gateway on kind, route /api to .NET and everything else to Angular, and look at why PathPrefix doesn't catch /apifoo, route status conditions, TLS and forwarded header notes, and the warnings of an ingress2gateway migration, all with real output.

8 Nov 2026 10 min 2
.NET Configuration with ConfigMaps and Secrets: Environment Variables, Volumes and Picking Up Changes
DevOps PART 07

.NET Configuration with ConfigMaps and Secrets: Environment Variables, Volumes and Picking Up Changes

ConfigMaps and Secrets enter .NET configuration as environment variables (ConnectionStrings__Default) or as files in a volume; env and subPath mounts never update, directory mounts update in 10 to 80 seconds. Measured on kind, .NET 10's default watcher missed the ConfigMap change while the polling watcher caught it. We also cover the provider order trap, triggering rollouts, immutable ConfigMaps, base64 not being encryption and Angular's config.json.

8 Nov 2026 10 min 2
Kubernetes Health Probes: Startup, Liveness, Readiness and ASP.NET Core Health Checks
DevOps PART 08

Kubernetes Health Probes: Startup, Liveness, Readiness and ASP.NET Core Health Checks

A startup probe waits for startup, liveness restarts a stuck process and readiness pulls a pod out of traffic; in ASP.NET Core tagged health checks give each probe its own endpoint. With real output we watch a 40-second warm-up fall into an endless restart loop under liveness, reach zero restarts with a startupProbe, see a database check in liveness cause four restarts per pod in two minutes, and do the math on probe timings.

8 Nov 2026 10 min 3
Resource Requests and Limits: QoS, OOMKilled, CPU Throttling and the .NET GC in Containers
DevOps PART 09

Resource Requests and Limits: QoS, OOMKilled, CPU Throttling and the .NET GC in Containers

A request tells the scheduler how much room to reserve and a limit tells the kernel a ceiling that can't be crossed; exceeding memory means OOMKilled, hitting the CPU limit means throttling. With real output we see a 500m limit drop .NET's ProcessorCount to 1 and turn Server GC off, the heap limit at 75 percent of the limit, managed OutOfMemoryException versus native OOMKilled, the GCHeapHardLimitPercent hex trap, throttling and quotas.

8 Nov 2026 9 min 3
Graceful Shutdown: SIGTERM, terminationGracePeriodSeconds, preStop and .NET HostOptions
DevOps PART 10

Graceful Shutdown: SIGTERM, terminationGracePeriodSeconds, preStop and .NET HostOptions

When a pod is deleted, SIGTERM and removal from endpoints start at the same time with no synchronization; that race caused 23 to 26 errors in an otherwise correct rollout, and a 5-second preStop sleep action brought it to zero. With real output we watch .NET finish requests and BackgroundServices in order on SIGTERM, see how ShutdownTimeout and the grace period cut each other off, and why exec sleep fails in a chiseled image.

8 Nov 2026 8 min 2
Scaling in Kubernetes: HPA, VPA, In-Place Resize, KEDA and PodDisruptionBudgets
DevOps PART 11

Scaling in Kubernetes: HPA, VPA, In-Place Resize, KEDA and PodDisruptionBudgets

HPA computes CPU percent against the container's request, not the node, and without a request it never scales. With real kind output we look at HPA v2 behavior settings, the .NET GC not seeing the new limit after an in-place resize and the GC.RefreshMemoryLimit fix, KEDA scale-to-zero on a RabbitMQ queue, a PodDisruptionBudget that locks a drain, and a topology spread trap.

8 Nov 2026 14 min 4
Storage and Stateful Apps in Kubernetes: Volumes, PersistentVolumeClaims, StatefulSets and the Database Decision
DevOps PART 12

Storage and Stateful Apps in Kubernetes: Volumes, PersistentVolumeClaims, StatefulSets and the Database Decision

If several replicas must write the same files, the answer is object storage, not a PVC; ReadWriteOnce means one node, not one pod. With real output we look at emptyDir sizeLimit eviction, StorageClasses and reclaim policy, PostgreSQL 18 on a StatefulSet (including the new PGDATA path), managed DB versus operator, and the ASP.NET Core Data Protection key ring breaking across replicas.

8 Nov 2026 11 min 2
Blog Map