Skip to content

Commit 5ef78f9

Browse files
committed
Merge branch 'main' of https://github.com/MicrosoftDocs/azure-docs-pr into vwan-connect
2 parents b1399a3 + abfc398 commit 5ef78f9

File tree

63 files changed

+519
-341
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+519
-341
lines changed

articles/api-management/backends.md

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ services: api-management
55
author: dlepow
66
ms.service: azure-api-management
77
ms.topic: concept-article
8-
ms.date: 04/01/2025
8+
ms.date: 05/20/2025
99
ms.author: danlep
1010
ms.custom:
1111
- build-2024
@@ -239,16 +239,63 @@ Use a backend pool for scenarios such as the following:
239239

240240
API Management supports the following load balancing options for backend pools:
241241

242-
* **Round-robin**: By default, requests are distributed evenly across the backends in the pool.
243-
* **Weighted**: Weights are assigned to the backends in the pool, and requests are distributed across the backends based on the relative weight assigned to each backend. Use this option for scenarios such as conducting a blue-green deployment.
244-
* **Priority-based**: Backends are organized in priority groups, and requests are sent to the backends in order of the priority groups. Within a priority group, requests are distributed either evenly across the backends, or (if assigned) according to the relative weight assigned to each backend.
245-
242+
| Load balancing option | Description |
243+
|------------------|-------------|
244+
| **Round-robin** | Requests are distributed evenly across the backends in the pool by default. |
245+
| **Weighted** | Weights are assigned to the backends in the pool, and requests are distributed based on the relative weight of each backend. Useful for scenarios such as blue-green deployments. |
246+
| **Priority-based** | Backends are organized into priority groups. Requests are sent to higher priority groups first; within a group, requests are distributed evenly or according to assigned weights. |
247+
246248
> [!NOTE]
247249
> Backends in lower priority groups will only be used when all backends in higher priority groups are unavailable because circuit breaker rules are tripped.
248250
251+
### Session awareness
252+
253+
With any of the preceding load balancing options, optionally enable **session awareness** (session affinity) to ensure that all requests from a specific user during a session are directed to the same backend in the pool. API Management sets a session ID cookie to maintain session state. This option is useful, for example, in scenarios with backends such as AI chat assistants or other conversational agents to route requests from the same session to the same endpoint.
254+
255+
> [!NOTE]
256+
> Session awareness in load-balanced pools is being released first to the **AI Gateway Early** [update group](configure-service-update-settings.md).
257+
258+
#### Manage cookies for session awareness
259+
260+
When using session awareness, the client must handle cookies appropriately. The client needs to store the `Set-Cookie` header value and send it with subsequent requests to maintain session state.
261+
262+
You can use API Management policies to help set cookies for session awareness. For example, for the case of the Assistants API (a feature of [Azure OpenAI in Azure AI Foundry Models](/azure/ai-services/openai/concepts/models)), the client needs to keep the session ID, extract the thread ID from the body, and keep the pair and send the right cookie for each call. Moreover, the client needs to know when to send a cookie or when not to send a cookie header. These requirements can be handled appropriately by defining the following example policies:
263+
264+
265+
```xml
266+
<policies>
267+
  <inbound>
268+
    <base />
269+
    <set-backend-service backend-id="APIMBackend" />
270+
  </inbound>
271+
  <backend>
272+
    <base />
273+
  </backend>
274+
  <outbound>
275+
    <base />
276+
    <set-variable name="gwSetCookie" value="@{
277+
      var payload = context.Response.Body.As<JObject>();
278+
      var threadId = payload["id"];
279+
      var gwSetCookieHeaderValue = context.Request.Headers.GetValueOrDefault("SetCookie", string.Empty);
280+
      if(!string.IsNullOrEmpty(gwSetCookieHeaderValue))
281+
      {
282+
        gwSetCookieHeaderValue = gwSetCookieHeaderValue + $";Path=/threads/{threadId};";
283+
      }
284+
      return gwSetCookieHeaderValue;
285+
    }" />
286+
    <set-header name="Set-Cookie" exists-action="override">
287+
      <value>Cookie=gwSetCookieHeaderValue</value>
288+
    </set-header>
289+
  </outbound>
290+
  <on-error>
291+
    <base />
292+
  </on-error>
293+
</policies>
294+
```
295+
249296
### Example
250297

251-
Use the portal, API Management [REST API](/rest/api/apimanagement/backend), or a Bicep or ARM template to configure a backend pool. In the following example, the backend *myBackendPool* in the API Management instance *myAPIM* is configured with a backend pool. Example backends in the pool are named *backend-1* and *backend-2*. Both backends are in the highest priority group; within the group, *backend-1* has a greater weight than *backend-2* .
298+
Use the portal, API Management [REST API](/rest/api/apimanagement/backend), or a Bicep or ARM template to configure a backend pool. In the following example, the backend *myBackendPool* in the API Management instance *myAPIM* is configured with a backend pool. Example backends in the pool are named *backend-1* and *backend-2*. Both backends are in the highest priority group; within the group, *backend-1* has a greater weight than *backend-2*.
252299

253300

254301
#### [Portal](#tab/portal)
@@ -266,7 +313,9 @@ Use the portal, API Management [REST API](/rest/api/apimanagement/backend), or a
266313

267314
#### [Bicep](#tab/bicep)
268315

269-
Include a snippet similar to the following in your Bicep file for a load-balanced pool. Set the `type` property of the backend entity to `Pool` and specify the backends in the pool:
316+
Include a snippet similar to the following in your Bicep file for a load-balanced pool. Set the `type` property of the backend entity to `Pool` and specify the backends in the pool.
317+
318+
This example includes an optional `sessionAffinity` pool configuration for session awareness. It sets a cookie so that requests from a user session are routed to a specific backend in the pool.
270319

271320
```bicep
272321
resource symbolicname 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
@@ -286,14 +335,23 @@ resource symbolicname 'Microsoft.ApiManagement/service/backends@2023-09-01-previ
286335
priority: 1
287336
weight: 1
288337
}
289-
]
338+
],
339+
      "sessionAffinity": {
340+
        "sessionId": {
341+
          "source": "Cookie",
342+
          "name": "SessionId"
343+
        }
344+
      }
290345
}
291346
}
292347
}
293348
```
294349
#### [ARM](#tab/arm)
295350

296-
Include a JSON snippet similar to the following in your ARM template for a load-balanced pool. Set the `type` property of the backend resource to `Pool` and specify the backends in the pool:
351+
Include a JSON snippet similar to the following in your ARM template for a load-balanced pool. Set the `type` property of the backend resource to `Pool` and specify the backends in the pool.
352+
353+
This example includes an optional `sessionAffinity` pool configuration for session awareness. It sets a cookie so that requests from a user session are routed to a specific backend in the pool.
354+
297355

298356
```json
299357
{
@@ -315,7 +373,13 @@ Include a JSON snippet similar to the following in your ARM template for a load-
315373
"priority": "1",
316374
          "weight": "1"
317375
}
318-
]
376+
],
377+
      "sessionAffinity": {
378+
        "sessionId": {
379+
          "source": "Cookie",
380+
          "name": "SessionId"
381+
        }
382+
      }
319383
}
320384
}
321385
}

articles/backup/aks-backup-faq.yml

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ sections:
2929
3030
- The storage account must be of `Standard general-purpose v2` type.
3131
- The blob container must be created in the storage account before installing the AKS Backup Extension.
32-
- The blob container should preferably be empty before installation or atleast shouldn't haven't nonbackup related data in it, as the extension will create its own folder structure within the container to store backup data and metadata.
32+
- The blob container should preferably be empty before installation or at least shouldn't have nonbackup related data in it, as the extension will create its own folder structure within the container to store backup data and metadata.
3333
- In case the AKS cluster is within a Private Network, the storage account must be accessible from the AKS cluster. This can be achieved by using a Private Endpoint for the storage account or by configuring the necessary network rules to allow access from the AKS cluster to the storage account.
3434
3535
- question: |
@@ -235,8 +235,24 @@ sections:
235235

236236
1. Microsoft.Storage/storageAccounts/blobServices/containers/blobs/*
237237

238+
- question: |
239+
Will snapshots for all Persistent Volumes (PVs) in a backup configuration be taken at the exact same time, or is there a delay?
240+
answer: |
241+
Azure Backup for AKS does not currently support taking snapshots of all PVs at the exact same millisecond. While the snapshot operations are initiated in parallel, there may be slight delays between individual PV snapshots due to infrastructure and API timing. To help achieve consistency across multiple PVs, Azure Backup supports application-consistent backups using hooks. Hooks allow users to pause application writes before snapshotting and resume them afterward. This approach improves consistency and mimics crash consistency, though it may not be equivalent to true simultaneous snapshots or coordinated database-level consistency.
242+
243+
- question: |
244+
What happens if I select the "Skip" option for Kubernetes resources including PVCs during an AKS restore?
245+
answer: |
246+
Selecting "Skip" means the restore process will not attempt to recreate any Kubernetes resources. If matching resources already exist in the target cluster, they will be reused as-is. If they do not exist, Azure Backup will attempt to dynamically recreate them. In case of PVs, ensure that compatible StorageClass definitions and permissions exist in the target environment.
247+
248+
- question: |
249+
Why is my restored cluster trying to mount PVCs from the original source cluster?
250+
answer: |
251+
This typically happens when the restored cluster references Persistent Volumes (PVs) that still point to the original source resource group. AKS separates cluster resources into two resource groups: one for the control plane and another for infrastructure (like disks). If the PVC-to-PV mapping wasn’t correctly updated during restore, the restored workloads may attempt to attach source PVs, resulting in errors. Ensure that the restore process correctly remaps PVCs to new or existing PVs in the target cluster's resource group.
252+
253+
238254
additionalContent: |
239255
240256
## Next steps
241257
242-
- [Azure Backup for AKS support matrix](azure-kubernetes-service-cluster-backup-support-matrix.md)
258+
- [Azure Backup for AKS support matrix](azure-kubernetes-service-cluster-backup-support-matrix.md)

articles/backup/azure-elastic-storage-area-network-backup-overview.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: About Azure Elastic storage area network protection (preview)
2+
title: About Azure Elastic storage area network backup (preview)
33
description: Learn how the Azure Elastic storage area network (Azure Elastic SAN) backup works.
44
ms.topic: overview
55
ms.date: 05/21/2025
@@ -8,7 +8,7 @@ ms.author: jsuri
88
ms.custom: engagement-fy24
99
---
1010

11-
# About Azure Elastic SAN protection (preview)
11+
# About Azure Elastic SAN backup (preview)
1212

1313
[Azure Backup](backup-overview.md) allows Azure Elastic storage area network (Azure Elastic SAN) volume protection (preview) through the [Backup vault](backup-vault-overview.md) to ensure seamless backup and restoration.
1414

articles/backup/azure-kubernetes-service-backup-troubleshoot.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,46 @@ Example log message:
163163
In this case, there is a Network/Calico policy or NSG that didn't allow dataprotection-microsoft pods to communicate with the API server.
164164
You should allow the dataprotection-microsoft namespace, and then reinstall the extension.
165165

166+
### Scenario 5
167+
168+
Extension Agent Failing to Communicate with Data Plane Endpoints leading to backup extension pods to not be deployed.
169+
170+
**Error message**:
171+
The extension agent in your AKS cluster is failing to connect to Azure Kubernetes Configuration service data plane endpoints `*.dp.kubernetesconfiguration.azure.com` in your region. This failure is indicated by reviewing the logs of the `extension-agent` pod. You will likely see repeated 403 errors for requests to data plane endpoints
172+
173+
```
174+
Error code: 403
175+
Message: This traffic is not authorized
176+
```
177+
This typically means that the traffic from the extension agent is being blocked or lacks the necessary authorization to reach the Azure service. This extension agent is requisite to install and run the backup extension in the AKS cluster.
178+
179+
**Cause**
180+
This error occurs due to a conflict in private DNS resolution when both Azure Arc-enabled Kubernetes and an AKS managed cluster share the same virtual network (VNet) or private DNS server:
181+
182+
The shared VNet (or private DNS zone) contains a preexisting private endpoint for Azure Arc-enabled Kubernetes.
183+
184+
As a result, the data plane endpoint used by the AKS extension agent (e.g., *.dp.kubernetesconfiguration.azure.com) resolves to a private IP address (e.g., 10.x.x.x) instead of the intended public IP.
185+
186+
This misrouting causes the AKS extension agent to send traffic to an unintended private endpoint, leading to 403 Unauthorized errors. You can verify the resolved IP address of the data plane endpoint from within your AKS cluster using the following command:
187+
188+
```
189+
kubectl exec -it -n kube-system extension-agent-<podGuid> --nslookup <region>.dp.kubernetesconfiguration.azure.com
190+
```
191+
192+
Replace `region` with your specific Azure region (e.g., eastus, westeurope).
193+
194+
**Resolution**
195+
To resolve this issue, consider the following approaches:
196+
197+
- **Use Separate VNets:** In case you are using both Azure Arc-enabled Kubernetes and AKS clusters, then deploy them in separate virtual networks to avoid DNS resolution conflicts caused by shared private endpoints.
198+
199+
- **Configure CoreDNS Override:** Override the CoreDNS settings in your AKS cluster to explicitly resolve the extension data plane endpoint to its public IP address. Refer to Scenario 3 in the documentation for detailed steps on configuring a CoreDNS override for the extension.
200+
201+
- **Verify Public IP Resolution:** Identify the correct public IP address of the extension data plane endpoint by using the nslookup command. Replace the region with your AKS cluster’s region:
202+
203+
```
204+
nslookup eastus2euap.dp.kubernetesconfiguration.azure.com
205+
```
166206

167207
## Backup Extension post installation related errors
168208

@@ -332,6 +372,51 @@ These error codes appear due to issues based on the Backup extension installed i
332372

333373
**Recommended action**: In case if you are configuring a new backup instance, use a resource group without a delete or read lock. If the backup instance already configured then remove the lock from the snapshot resource group.
334374

375+
### KubernetesBackupGenericWarning
376+
377+
**Cause**: This error code indicates that a Kubernetes resource could not be backed up or restored, typically due to validation or dependency issues within the cluster.
378+
379+
One commonly observed scenario is a failure during the restoration of Ingress resources due to issues with validating webhooks. A required service (e.g., fabp-ingress-nginx-controller-admission) is missing, preventing the webhook validate.nginx.ingress.kubernetes.io from executing properly. The validating webhook configuration exists but references a non-existent or misconfigured service. DNS resolution issues are preventing the webhook from reaching the intended endpoint. The cluster uses custom admission webhooks that were not backed up or recreated before the restore. The webhook configuration is obsolete or unnecessary for the restored cluster state.
380+
381+
**Recommended action**:
382+
383+
- Verify if the missing service fabp-ingress-nginx-controller-admission exists using:
384+
385+
```json
386+
kubectl get svc -n ingress-basic
387+
```
388+
389+
- If the service is missing, check deployment configurations and recreate it if necessary.
390+
391+
- Investigate potential DNS resolution issues by running:
392+
393+
```JSON
394+
kubectl get endpoints -n ingress-basic
395+
396+
nslookup fabp-ingress-nginx-controller-admission.ingress-basic.svc.cluster.local
397+
```
398+
399+
- If the webhook validation is unnecessary, consider removing it using:
400+
401+
```json
402+
kubectl delete validatingwebhookconfiguration
403+
```
404+
405+
- List all webhook configurations with:
406+
407+
```json
408+
kubectl get validatingwebhookconfigurations
409+
```
410+
411+
- If the issue is resolved, manually restore the ingress by applying its YAML backup:
412+
413+
```json
414+
kubectl apply -f
415+
```
416+
417+
>[!Note]
418+
>This warning can arise from multiple causes. If the above steps do not resolve your issue, consult the Kubernetes controller logs and webhook configuration for more specific error messages.
419+
335420
## Vaulted backup based errors
336421

337422
These error codes can appear while you enable AKS backup to store backups in a vault standard datastore.

articles/backup/azure-kubernetes-service-cluster-backup-concept.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ To enable backup for an AKS cluster, see the following prerequisites: .
7272

7373
- The Backup Extension during installation fetches Container Images stored in Microsoft Container Registry (MCR). If you enable a firewall on the AKS cluster, the extension installation process might fail due to access issues on the Registry. Learn [how to allow MCR access from the firewall](/azure/container-registry/container-registry-firewall-access-rules#configure-client-firewall-rules-for-mcr).
7474

75-
- In case you have the cluster in a Private Virtual Network and Firewall, apply the following FQDN/application rules: `*.microsoft.com`, `mcr.microsoft.com`, `data.mcr.microsoft.com`, `crl.microsoft.com`, `mscrl.microsoft.com`, `oneocsp.microsoft.com` , `*.azure.com`, `management.azure.com`, `gcs.prod.monitoring.core.windows.net`, `*.prod.warm.ingest.monitor.core.windows.net`, `*.blob.core.windows.net`, `*.azmk8s.io`, `ocsp.digicert.com`, `cacerts.digicert.com`, `crl3.digicert.com`, `crl4.digicert.com`, `ocsp.digicert.cn`, `cacerts.digicert.cn`, `cacerts.geotrust.com`, `cdp.geotrust.com`, `status.geotrust.com`, `ocsp.msocsp.com`, `*.azurecr.io`, `docker.io`, `*.dp.kubernetesconfiguration.azure.com`. Learn [how to apply FQDN rules](../firewall/dns-settings.md).
75+
- During the installation of the backup extension in Azure Kubernetes Service (AKS), communication with several Fully Qualified Domain Names (FQDNs) is required to support essential operations. In addition to Azure Backup and Storage Accounts, AKS must also access external endpoints to download container images for running backup pods and to emit service logs to Microsoft Defender for Endpoint via MDM. Therefore, if your cluster is deployed in a private virtual network with firewall restrictions, ensure the following FQDNs or application rules are allowed:`*.microsoft.com`, `mcr.microsoft.com`, `data.mcr.microsoft.com`, `crl.microsoft.com`, `mscrl.microsoft.com`, `oneocsp.microsoft.com` , `*.azure.com`, `management.azure.com`, `gcs.prod.monitoring.core.windows.net`, `*.prod.warm.ingest.monitor.core.windows.net`, `*.blob.core.windows.net`, `*.azmk8s.io`, `ocsp.digicert.com`, `cacerts.digicert.com`, `crl3.digicert.com`, `crl4.digicert.com`, `ocsp.digicert.cn`, `cacerts.digicert.cn`, `cacerts.geotrust.com`, `cdp.geotrust.com`, `status.geotrust.com`, `ocsp.msocsp.com`, `*.azurecr.io`, `docker.io`, `*.dp.kubernetesconfiguration.azure.com`. Learn [how to apply FQDN rules](../firewall/dns-settings.md).
7676

7777
- If you have any previous installation of *Velero* in the AKS cluster, you need to delete it before installing Backup Extension.
7878

0 commit comments

Comments
 (0)