Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
A/B Testing with Ingress in Kubernetes
📖 Scenario: You are working as a DevOps engineer for a web application team. They want to test two versions of their website to see which one users prefer. This is called A/B testing. You will use Kubernetes Ingress to route 50% of the traffic to version A and 50% to version B.
🎯 Goal: Set up a Kubernetes Ingress resource that splits incoming traffic evenly between two backend services named version-a and version-b. This will enable A/B testing by sending half of the users to each version.
📋 What You'll Learn
Create an Ingress resource named ab-testing-ingress
Use the nginx Ingress controller annotations for traffic splitting
Route traffic to two services: version-a and version-b
Split traffic evenly: 50% to version-a and 50% to version-b
Use the host example.com and path /
💡 Why This Matters
🌍 Real World
A/B testing helps teams improve websites by comparing two versions with real users. Kubernetes Ingress can route traffic to different versions easily.
💼 Career
DevOps engineers often configure Ingress controllers for traffic management, load balancing, and testing new application versions safely.
Progress0 / 4 steps
1
Create the basic Ingress resource
Create a Kubernetes Ingress resource named ab-testing-ingress with host example.com and path / that routes all traffic to the service version-a on port 80. Use the networking.k8s.io/v1 API version.
Kubernetes
Hint
Define an Ingress with one rule for host example.com and path /. Set the backend service to version-a on port 80.
2
Add annotation for traffic splitting
Add the annotation nginx.ingress.kubernetes.io/canary with value "true" to the Ingress metadata to enable canary traffic splitting.
Kubernetes
Hint
Add the annotation under metadata with key nginx.ingress.kubernetes.io/canary and value "true".
3
Add the canary backend with weight
Add a second path entry under spec.rules[0].http.paths with the same path / and pathTypePrefix. Set the backend service name to version-b and port number to 80. Add the annotations nginx.ingress.kubernetes.io/canary-weight with value 50 to split traffic evenly.
Kubernetes
Hint
Add a second path with the same / path and backend service version-b. Add the annotation nginx.ingress.kubernetes.io/canary-weight: "50" to split traffic evenly.
4
Display the final Ingress YAML
Print the complete Ingress YAML configuration to verify the A/B testing setup.
Kubernetes
Hint
Use print statements to output the full Ingress YAML exactly as configured.
Practice
(1/5)
1. What is the main purpose of using A/B testing with Kubernetes Ingress?
easy
A. To monitor CPU usage of pods
B. To increase the number of pods automatically
C. To split user traffic between different versions of an application
D. To backup Kubernetes cluster data
Solution
Step 1: Understand A/B testing concept in Kubernetes
A/B testing with Ingress is used to route traffic between different app versions to test new features safely.
Step 2: Identify the purpose of Ingress in traffic management
Ingress controls how external traffic reaches services, enabling traffic splitting for A/B testing.
Final Answer:
To split user traffic between different versions of an application -> Option C
Quick Check:
A/B testing = traffic split [OK]
Hint: A/B testing means splitting traffic between app versions [OK]
Common Mistakes:
Confusing A/B testing with scaling pods
Thinking Ingress is for monitoring only
Assuming Ingress handles backups
2. Which annotation is commonly used in Kubernetes Ingress to split traffic by percentage for A/B testing?
easy
A. nginx.ingress.kubernetes.io/canary-weight
B. nginx.ingress.kubernetes.io/rewrite-target
C. nginx.ingress.kubernetes.io/ssl-redirect
D. nginx.ingress.kubernetes.io/proxy-body-size
Solution
Step 1: Identify annotations for traffic splitting
The annotation 'nginx.ingress.kubernetes.io/canary-weight' is used to specify the percentage of traffic sent to the canary version.
Step 2: Differentiate from other annotations
Other annotations like rewrite-target or ssl-redirect serve different purposes unrelated to traffic splitting.
Final Answer:
nginx.ingress.kubernetes.io/canary-weight -> Option A
Quick Check:
Canary weight = traffic percentage [OK]
Hint: Look for 'canary-weight' to split traffic by percent [OK]
Common Mistakes:
Using rewrite-target for traffic splitting
Confusing SSL redirect with traffic control
Ignoring canary annotations
3. Given this Ingress snippet for A/B testing, what percentage of traffic goes to the canary service?
The spec only has one backend for stable-service; no path defined for canary-service.
Step 2: Understand traffic routing requirements
For canary traffic to work, a separate path with canary annotations and backend service must be defined.
Final Answer:
Missing canary backend path in spec -> Option A
Quick Check:
Canary needs separate backend path [OK]
Hint: Ensure canary backend path exists in Ingress spec [OK]
Common Mistakes:
Assuming canary-weight alone routes traffic
Ignoring missing canary backend path
Blaming host or port without checking paths
5. You want to route 20% of users with header X-User-Type: beta to the canary service and the rest to stable. Which Ingress annotation setup achieves this?
hard
A. Use nginx.ingress.kubernetes.io/canary-by-cookie: "beta"
B. Use nginx.ingress.kubernetes.io/canary-weight: "20" only
C. Use nginx.ingress.kubernetes.io/canary: "false"
D. Use nginx.ingress.kubernetes.io/canary-by-header: "X-User-Type" and nginx.ingress.kubernetes.io/canary-by-header-value: "beta"
Solution
Step 1: Identify header-based routing annotations
To route traffic based on header, use 'canary-by-header' and 'canary-by-header-value' annotations.
Step 2: Understand difference from weight-based routing
Weight-based routing splits traffic by percentage regardless of headers; header-based routing targets specific users.
Final Answer:
Use nginx.ingress.kubernetes.io/canary-by-header: "X-User-Type" and nginx.ingress.kubernetes.io/canary-by-header-value: "beta" -> Option D