Kubernetes upgrades are rarely difficult because of the version number itself.
The difficult part is everything running around the cluster.
A production .NET application may depend on Kubernetes Deployments, Services, Ingress controllers, ConfigMaps, Secrets, persistent storage, autoscaling, admission policies, container runtimes, observability agents, and third-party operators. An upgrade can therefore affect much more than the Kubernetes API server.
This matters now for teams running Kubernetes 1.34.
The Kubernetes project currently lists 1.34 as actively supported, with the 1.34.9 patch release dated June 9, 2026. Kubernetes 1.34 enters maintenance mode on August 27, 2026, followed by end of life on October 27, 2026. The currently supported release lines also include Kubernetes 1.35 and 1.36.
That creates a practical upgrade window for platform teams.
For .NET developers, the important question is not simply "How do I upgrade Kubernetes?"
It is:
How do I verify that my .NET workloads, manifests, controllers, networking, storage, and deployment pipeline will continue working after the cluster upgrade?
What Maintenance Mode Means for Kubernetes 1.34
Kubernetes maintains the three most recent minor releases. The current supported lines are 1.34, 1.35, and 1.36.
For Kubernetes 1.34, the timeline is:
| Milestone | Date |
|---|---|
| Kubernetes 1.34 release | August 27, 2025 |
| Latest listed patch | 1.34.9 |
| Maintenance mode | August 27, 2026 |
| End of life | October 27, 2026 |
During maintenance mode, the release branch receives a narrower class of fixes. Kubernetes documentation describes maintenance mode as the final two months of the support period, when critical security and dependency-related fixes can still be produced before the branch reaches EOL.
The practical implication is straightforward:
Do not plan a major production upgrade after October 27, 2026 if you can avoid it.
Which Kubernetes Version Should You Upgrade To?
Kubernetes 1.36 is currently the newest supported minor release, while 1.35 is also supported. The official release schedule lists 1.36 with an EOL date of June 28, 2027 and 1.35 with an EOL date of February 28, 2027.
Therefore, a team currently running 1.34 should evaluate both its platform compatibility and its organization's upgrade policy before selecting the destination version.
A simple decision matrix is:
| Current | Candidate | Consideration |
|---|---|---|
| 1.34 | 1.35 | Smaller version jump |
| 1.34 | 1.36 | Longer supported lifecycle |
| 1.34 | Managed provider-supported version | Check provider's upgrade policy |
The newest supported version is not automatically the correct choice for every organization.
The right target depends on:
Cloud provider support
CNI compatibility
CSI/storage drivers
Ingress controller
Operators
Admission webhooks
Monitoring agents
Deployment tooling
Internal platform standards
Why .NET Applications Need Specific Testing
A .NET application itself is usually not tightly coupled to the Kubernetes API server.
For example, this container:
FROM mcr.microsoft.com/dotnet/aspnet:10.0
WORKDIR /app
COPY ./publish .
ENTRYPOINT ["dotnet", "Orders.Api.dll"]
can continue running without modification after a Kubernetes upgrade.
The risk is generally around the Kubernetes resources and infrastructure surrounding the container.
For example:
.NET Application
|
v
Deployment
|
+--> Service
|
+--> ConfigMap
|
+--> Secret
|
+--> Ingress
|
+--> HPA
|
+--> PersistentVolume
|
+--> Service Account
|
+--> NetworkPolicy
Each layer should be included in the upgrade test.
Step 1: Inventory the Current Cluster
Before changing anything, record what is actually running.
Start with:
kubectl version
Then:
kubectl get nodes -o wide
Check namespaces:
kubectl get namespaces
List workloads:
kubectl get deployments,statefulsets,daemonsets -A
Check services:
kubectl get services -A
Check ingress resources:
kubectl get ingress -A
For .NET applications, also identify:
Container image
.NET runtime version
Deployment replicas
Resource requests
Resource limits
Probes
ConfigMaps
Secrets
Service accounts
HPA configuration
Persistent storage
Network policies
This inventory becomes your upgrade checklist.
Step 2: Check Deprecated APIs
One of the most important upgrade tasks is finding deprecated Kubernetes APIs.
Kubernetes provides a deprecation policy and migration guidance for APIs that are eventually removed. The project recommends using client warnings, metrics, and audit information to locate deprecated API usage.
Start by inspecting your manifests:
kubectl api-resources
Then search your source repositories for old API versions:
grep -R "apiVersion:" ./k8s
For example, review manifests containing:
apiVersion: extensions/v1beta1
or other deprecated versions.
The exact deprecated APIs depend on the Kubernetes version path you are upgrading across, so do not assume that every old-looking API is necessarily removed in your target version.
The important rule is:
Check the Kubernetes deprecation guide for your destination version instead of relying on memory.
Step 3: Test Manifests Before the Upgrade
Your deployment YAML should be validated before it reaches the production cluster.
For example:
apiVersion: apps/v1
kind: Deployment
metadata:
name: orders-api
spec:
replicas: 3
selector:
matchLabels:
app: orders-api
template:
metadata:
labels:
app: orders-api
spec:
containers:
- name: orders-api
image: example/orders-api:1.8.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "1"
memory: "512Mi"
For a .NET application, resource configuration deserves particular attention.
A Kubernetes upgrade can change scheduling conditions, node availability, or resource distribution. The application may be perfectly compatible with the new Kubernetes version but still behave differently if the workload is scheduled differently.
Step 4: Verify .NET Health Probes
ASP.NET Core applications commonly expose health endpoints.
For example:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
var app = builder.Build();
app.MapHealthChecks("/health");
app.Run();
Then configure Kubernetes:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
During the upgrade, watch whether probes continue behaving as expected.
A temporary increase in startup latency can cause a poorly configured probe to restart a healthy .NET application repeatedly.
Step 5: Review Resource Requests and Limits
A common deployment configuration is:
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "1"
memory: "512Mi"
These values should be based on observed workload behavior rather than copied blindly between applications.
For a .NET API, monitor:
CPU utilization
Working set
Garbage collection
Request latency
Pod restarts
OOM kills
CPU throttling
Before and after the upgrade, compare the same workload.
Do not interpret a different CPU profile automatically as a Kubernetes regression. Node images, runtime versions, container runtime behavior, and workload placement can also influence the result.
Step 6: Verify Autoscaling
If your .NET service uses an HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: orders-api
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: orders-api
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Check:
kubectl get hpa -A
Then:
kubectl describe hpa orders-api
During testing, verify:
Traffic
|
v
CPU / Metrics
|
v
HPA
|
v
Replica Count
The objective is not simply confirming that the HPA object exists.
Confirm that it still reacts correctly to load.
Step 7: Check Ingress and Networking
A .NET API can be healthy inside the cluster while external traffic is broken.
Test the complete path:
Internet
|
v
Load Balancer
|
v
Ingress
|
v
Service
|
v
.NET Pods
Check:
kubectl get ingress -A
kubectl get svc -A
kubectl get endpointslices -A
EndpointSlices are particularly important when applications or custom controllers interact directly with endpoint information. Kubernetes has been moving away from the older Endpoints API toward EndpointSlices.
Do not assume that an ingress controller, CNI plugin, or cloud load balancer is automatically compatible simply because the Kubernetes API server upgraded successfully.
Check the vendor's supported Kubernetes versions.
Step 8: Check Storage
If your .NET application uses persistent storage, identify:
kubectl get storageclass
kubectl get pv
kubectl get pvc -A
Then verify:
CSI driver version
StorageClass behavior
Volume attachment
Mount operations
Read/write behavior
Pod rescheduling
Stateful workloads
For example:
.NET Worker
|
v
PersistentVolumeClaim
|
v
CSI Driver
|
v
Cloud / Storage Backend
The Kubernetes upgrade is only one component of this chain.
Step 9: Check Admission Webhooks and Operators
This is an area that is easy to overlook.
Many production clusters use:
Join the conversation! Your thoughts help the community grow.