You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: Migrate cloud deployment example from Kind to Minikube
Replaces Kind with Minikube due to stability issues, especially with Podman.
Adds support for both Docker and Podman container runtimes.
Changes:
- Migrate from Kind to Minikube with NodePort (port 30080)
- Podman: Use tarball + minikube image load (no registry needed)
- Docker: Use Minikube registry addon with port-forwarding
- Linux + Podman: Rootless mode with containerd runtime
- Linux + Podman: Check broker pod directly (entity operator compatibility issues)
- Linux + Podman: Poll Kafka broker until topic exists before deploying agents
- Mac/Linux + Podman: Background service tunnel for NodePort access
- Dynamic image references and imagePullPolicy based on container tool
Tested on:
- macOS with Podman ✓
- Linux (Fedora) with Podman ✓
- Linux (GitHub Actions) with Docker ✓
@@ -60,7 +60,7 @@ Note that the aim of this example is just to demonstrate how to set up a2a-java
60
60
61
61
## Prerequisites
62
62
63
-
-**Kind**(Kubernetes IN Docker) v0.20+
63
+
-**Minikube**v1.30+
64
64
-**kubectl** (v1.27+)
65
65
-**Maven** (3.8+)
66
66
-**Java** 17+
@@ -70,15 +70,15 @@ Note that the aim of this example is just to demonstrate how to set up a2a-java
70
70
71
71
### 1. Install Prerequisites
72
72
73
-
**Install Kind:**
74
-
See https://kind.sigs.k8s.io/docs/user/quick-start/ for installation instructions.
73
+
**Install Minikube:**
74
+
See https://minikube.sigs.k8s.io/docs/start/ for installation instructions.
75
75
76
76
**Install kubectl:**
77
77
See https://kubernetes.io/docs/tasks/tools/ for installation instructions.
78
78
79
79
### 2. Deploy the Stack
80
80
81
-
The deployment script will automatically create the Kind cluster and deploy all components:
81
+
The deployment script will automatically create the Minikube cluster and deploy all components:
82
82
83
83
```bash
84
84
cd scripts
@@ -88,20 +88,21 @@ cd scripts
88
88
**If using Podman instead of Docker:**
89
89
```bash
90
90
./deploy.sh --container-tool podman
91
+
# OR set environment variable:
92
+
export CONTAINER_TOOL=podman
93
+
./deploy.sh
91
94
```
92
95
93
-
Note that using Kind with Podman on Linux may have some occasional issues due to Kind's experimental support for Podman. In our testing, a reboot normally solves this.
96
+
**Note**: Minikube with Podman requires the Podman driver. The script will configure this automatically.
94
97
95
98
The script will:
96
-
-Create Kind cluster with local registry support (if not already exists)
97
-
-Set up local container registry (localhost:5001)
99
+
-Start Minikube cluster (if not already running)
100
+
-Enable the registry addon
98
101
- Install Strimzi Kafka operator
99
102
- Deploy PostgreSQL
100
103
- Deploy Kafka cluster (using KRaft mode)
101
104
- Build and deploy the A2A agent (2 pods)
102
105
103
-
**Note:** You don't need to manually create the Kind cluster - the script handles everything.
104
-
105
106
### 3. Verify Deployment
106
107
107
108
```bash
@@ -121,13 +122,20 @@ Expected output:
121
122
122
123
#### Understanding the NodePort Setup
123
124
124
-
The agent service uses **NodePort** with Kind **extraPortMappings** to expose the service:
125
+
The agent service uses **NodePort** for external access with reliable load balancing:
126
+
127
+
- Kubernetes Service exposes **NodePort 30080** → **pod port 8080** (configured in `k8s/05-agent-deployment.yaml`)
128
+
- Minikube makes NodePort accessible via `minikube service` command
129
+
- Result: Access the agent at the URL provided by `minikube service a2a-agent-service -n a2a-demo --url`
125
130
126
-
- Kind maps **host port 8080** → **node port 30080** (configured in `kind-config.yaml`)
127
-
- Kubernetes Service maps **NodePort 30080** → **pod port 8080** (configured in `k8s/05-agent-deployment.yaml`)
128
-
- Result: Access the agent at **http://localhost:8080** from your host machine
131
+
**Why NodePort instead of LoadBalancer?**
132
+
- ✅ Works without `minikube tunnel` (which can have networking issues, especially in CI)
133
+
- ✅ Provides reliable round-robin load balancing across multiple pods
134
+
- ✅ Simpler setup for local development
135
+
- ✅ Consistent behavior across different host operating systems (macOS, Linux, Windows)
136
+
- ✅ Works reliably in CI environments like GitHub Actions
129
137
130
-
This approach provides the same round-robin load balancing as a real LoadBalancer but works consistently across all platforms (macOS, Linux, Windows, and CI environments like GitHub Actions).
138
+
**Note**: The test client creates fresh HTTP connections for each request to ensure proper load distribution across both pods.
0 commit comments