Skip to content

Commit a009b88

Browse files
committed
feat: Add verified run details and findings to README for AKS deployment proof of concept
1 parent 0beb3ef commit a009b88

1 file changed

Lines changed: 73 additions & 0 deletions

File tree

README.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,76 @@ The workflow handles all cleanup automatically via Job 3 (`teardown-runner`). Fo
178178
* [Azure Private AKS Clusters](https://learn.microsoft.com/en-us/azure/aks/private-clusters)
179179
* [Use Managed Identity with AKS](https://learn.microsoft.com/en-us/azure/aks/use-managed-identity)
180180
* [Conditional Access for Workload Identities](https://learn.microsoft.com/en-us/entra/identity/conditional-access/workload-identity)
181+
182+
## Verified Run — April 2, 2026
183+
184+
> **Workflow run**: [#23919580744](https://github.com/devopsabcs-engineering/aks-private-deployment/actions/runs/23919580744)
185+
> **Result**: All 3 jobs succeeded. PoC objectives confirmed.
186+
187+
### Job execution
188+
189+
| Job | Runner | Duration | Result |
190+
|-----|--------|----------|--------|
191+
| `setup-runner` | `ubuntu-latest` | 7 min | Success |
192+
| `deploy-and-log` | `self-hosted` (in-VNet) | 40 min (incl. 30 min wait) | Success |
193+
| `teardown-runner` | `ubuntu-latest` | 18 sec | Success |
194+
195+
### Finding 1: Managed Identity bypasses Conditional Access
196+
197+
The Azure Activity Log confirms the `az aks create` ARM write operation originated from IP `20.104.78.99` — the runner VM's own public IP. Authentication happened via IMDS (`169.254.169.254`), not through `login.microsoftonline.com`. No Conditional Access evaluation was triggered.
198+
199+
```text
200+
Activity Log excerpt:
201+
Microsoft.ContainerService/managedClusters/write Accepted ClientIp: 20.104.78.99
202+
Microsoft.ContainerService/managedClusters/write Started ClientIp: 20.104.78.99
203+
```
204+
205+
The `resolvePrivateLinkServiceId` action shows IP `52.136.23.11`. This is the AKS Resource Provider acting internally — expected behavior, not the customer's identity.
206+
207+
### Finding 2: Private cluster is truly private
208+
209+
```text
210+
enablePrivateCluster : true
211+
privateFqdn : aks-poc-23-rg-aks-poc-23919-...-hzi38m4i.b888736e-...privatelink.canadacentral.azmk8s.io
212+
API Server Endpoint : https://...privatelink.canadacentral.azmk8s.io:443
213+
Private FQDN resolves: 10.224.0.4 (private IP within the VNet)
214+
```
215+
216+
The AKS API server is accessible only via private endpoint. No public API access is possible.
217+
218+
### Finding 3: Runner VM in same VNet reaches private API server
219+
220+
The runner VM at `10.224.1.4` (subnet-runner) successfully connected to the AKS API server at `10.224.0.4` (subnet-aks) via the private endpoint:
221+
222+
```text
223+
Runner VM : 10.224.1.4 (subnet-runner / 10.224.1.0/24)
224+
AKS Node : 10.224.0.5 (subnet-aks / 10.224.0.0/24)
225+
API Server : 10.224.0.4 (private endpoint)
226+
```
227+
228+
`kubectl` validated the cluster end-to-end:
229+
230+
```text
231+
kubectl cluster-info → Kubernetes control plane running at ...privatelink.canadacentral.azmk8s.io:443
232+
kubectl get nodes → 1 node, Ready, v1.34.4
233+
kubectl get pods -n kube-system → 15 pods, all Running
234+
kubectl get namespaces → default, kube-node-lease, kube-public, kube-system
235+
nslookup private FQDN → 10.224.0.4 ✓
236+
```
237+
238+
### Finding 4: Artifacts uploaded
239+
240+
Six log files were uploaded as workflow artifacts (`aks-poc-logs-23919580744`):
241+
242+
| Log file | Content |
243+
|----------|---------|
244+
| `runner-network.log` | Runner VM public/private IP, hostname, subnet |
245+
| `aks-create.log` | Full `az aks create` output (9 KB) |
246+
| `aks-cluster-info.log` | Cluster properties (version, FQDN, network config) |
247+
| `kubectl-validation.log` | All kubectl output including DNS resolution |
248+
| `ip-activity-log.log` | Azure Activity Log ARM operation caller IPs |
249+
| `ip-signin-log.log` | Entra sign-in query (expected 403 without P1/P2) |
250+
251+
### Conclusion
252+
253+
The PoC confirms that managed identity is the correct solution for deploying private AKS clusters in environments with Conditional Access location policies. The self-hosted runner VM, placed inside the same VNet as the AKS cluster, can both deploy and manage the private cluster without triggering any CA evaluation.

0 commit comments

Comments
 (0)