InfoDays: Softwarearchitektur 2025: Microservices lieben Azure Container Apps

remast 8 views 37 slides Oct 28, 2025
Slide 1
Slide 1 of 37
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37

About This Presentation

Azure Container Apps ist meine liebste Laufzeitumgebung für Microservices. Warum? Flexible Skalierung, Service Discovery und zentrales Logging, um all das kümmert sich Azure Container Apps für mich. Ich bringe meine Microservices-Anwendung mit, ganz einfach als Container und schon geht’s los. I...


Slide Content

Microservices lieben
Azure Container Apps
??????

Es war einmal ...

Projekte bei crossnative
Standardisierte Software Projekte#
Fokus auf Anwendungen nicht Infrastruktur#
Launchpad Stack mit Spring, Postgres, ...#
Cloud Umgebung von Außen verfügbar#
Container basiert und k8s nah#
Pay-per-Use#
Azure Container Apps ! ??????

Azure Container Apps
verwaltete Serverless Container Plattform#
flexibel Skalierbar (Zero to Hero)#
"mini" k8s mit 1 Namespace#
basiert auf Azure Kubernetes Plattform#
Kubernetes ohne Server#
KEDA Autoscaling, Replicas und Ingress von
Kubernetes
#

Azure Container Apps
  bei crossnative
nutzen ACA seit 3 Jahren#
erst nur für Test und Entwicklung#
produktiver Betrieb mehrerer Anwendungen#

Freddys BBQ
??????
Basis Setup

Freddys BBQ _ Übersicht

Microservices mit Azure
Container Apps
1. ein gemeinsames Container App Environment
2. eine Container App je Microservice
3. App Insights und Log Analytics gemeinsam

Freddys BBQ _ Infrastruktur

Freddys BBQ _ Infrastruktur

Container App Environment

Freddys Container Apps

Shop Frontend Container App

Demo BBQ bestellen ??????

BBQ Bestellen Ablauf #1

BBQ Bestellen Ablauf #3

BBQ Bestellen Ablauf #4

Infrastruktur mit
Terraform

Container Apps Basis
/* 1. ResourceGroup */
resource "azurerm_resource_group" "freddy" {
name = "rg-freddy-dev-westeu"
location = "West Europe"
}
1
2
3
4
5 6 /* 2. Log Analytics Workspace */7 resource "azurerm_log_analytics_workspace" "app_log_analytics" {8 name = "log-freddy-dev-westeu"9 location = azurerm_resource_group.freddy.location10 resource_group_name = azurerm_resource_group.freddy.name11 sku = "PerGB2018"12 retention_in_days = 3013 }14 15 /* 3. Application Insights */16 resource "azurerm_application_insights" "freddy_appinsights" {17 name = "appi-freddy-dev-westeu"18 location = azurerm_resource_group.freddy.location19 resource_group_name = azurerm_resource_group.freddy.name20 workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id21 application_type = "web"22 }23 24 /* 4. Container App Environment */25 resource "azurerm_container_app_environment" "cae" {26 name = "cae-freddy-dev-westeu"27 location = azurerm_resource_group.freddy.location28 resource_group_name = azurerm_resource_group.freddy.name29 log_analytics_workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id30 }31
/* 2. Log Analytics Workspace */
resource "azurerm_log_analytics_workspace" "app_log_analytics" {
name = "log-freddy-dev-westeu"
location = azurerm_resource_group.freddy.location
resource_group_name = azurerm_resource_group.freddy.name
sku = "PerGB2018"
retention_in_days = 30
}/* 1. ResourceGroup */1 resource "azurerm_resource_group" "freddy" {2 name = "rg-freddy-dev-westeu"3 location = "West Europe"4 }5 6
7
8
9
10
11
12
13
14 15 /* 3. Application Insights */16 resource "azurerm_application_insights" "freddy_appinsights" {17 name = "appi-freddy-dev-westeu"18 location = azurerm_resource_group.freddy.location19 resource_group_name = azurerm_resource_group.freddy.name20 workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id21 application_type = "web"22 }23 24 /* 4. Container App Environment */25 resource "azurerm_container_app_environment" "cae" {26 name = "cae-freddy-dev-westeu"27 location = azurerm_resource_group.freddy.location28 resource_group_name = azurerm_resource_group.freddy.name29 log_analytics_workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id30 }31
/* 3. Application Insights */
resource "azurerm_application_insights" "freddy_appinsights" {
name = "appi-freddy-dev-westeu"
location = azurerm_resource_group.freddy.location
resource_group_name = azurerm_resource_group.freddy.name
workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id
application_type = "web"
}/* 1. ResourceGroup */1 resource "azurerm_resource_group" "freddy" {2 name = "rg-freddy-dev-westeu"3 location = "West Europe"4 }5 6 /* 2. Log Analytics Workspace */7 resource "azurerm_log_analytics_workspace" "app_log_analytics" {8 name = "log-freddy-dev-westeu"9 location = azurerm_resource_group.freddy.location10 resource_group_name = azurerm_resource_group.freddy.name11 sku = "PerGB2018"12 retention_in_days = 3013 }14 15
16
17
18
19
20
21
22
23 24 /* 4. Container App Environment */25 resource "azurerm_container_app_environment" "cae" {26 name = "cae-freddy-dev-westeu"27 location = azurerm_resource_group.freddy.location28 resource_group_name = azurerm_resource_group.freddy.name29 log_analytics_workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id30 }31
/* 4. Container App Environment */
resource "azurerm_container_app_environment" "cae" {
name = "cae-freddy-dev-westeu"
location = azurerm_resource_group.freddy.location
resource_group_name = azurerm_resource_group.freddy.name
log_analytics_workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id
}/* 1. ResourceGroup */1 resource "azurerm_resource_group" "freddy" {2 name = "rg-freddy-dev-westeu"3 location = "West Europe"4 }5 6 /* 2. Log Analytics Workspace */7 resource "azurerm_log_analytics_workspace" "app_log_analytics" {8 name = "log-freddy-dev-westeu"9 location = azurerm_resource_group.freddy.location10 resource_group_name = azurerm_resource_group.freddy.name11 sku = "PerGB2018"12 retention_in_days = 3013 }14 15 /* 3. Application Insights */16 resource "azurerm_application_insights" "freddy_appinsights" {17 name = "appi-freddy-dev-westeu"18 location = azurerm_resource_group.freddy.location19 resource_group_name = azurerm_resource_group.freddy.name20 workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id21 application_type = "web"22 }23 24
25
26
27
28
29
30
31
/* 1. ResourceGroup */
resource "azurerm_resource_group" "freddy" {
name = "rg-freddy-dev-westeu"
location = "West Europe"
}

/* 2. Log Analytics Workspace */
resource "azurerm_log_analytics_workspace" "app_log_analytics" {
name = "log-freddy-dev-westeu"
location = azurerm_resource_group.freddy.location
resource_group_name = azurerm_resource_group.freddy.name
sku = "PerGB2018"
retention_in_days = 30
}

/* 3. Application Insights */
resource "azurerm_application_insights" "freddy_appinsights" {
name = "appi-freddy-dev-westeu"
location = azurerm_resource_group.freddy.location
resource_group_name = azurerm_resource_group.freddy.name
workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id
application_type = "web"
}

/* 4. Container App Environment */
resource "azurerm_container_app_environment" "cae" {
name = "cae-freddy-dev-westeu"
location = azurerm_resource_group.freddy.location
resource_group_name = azurerm_resource_group.freddy.name
log_analytics_workspace_id = azurerm_log_analytics_workspace.app_log_analytics.id
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Container App Order ??????
resource "azurerm_container_app" "order" {
name "order"
container_app_environment_id azurerm_container_app_environment.cae.id
resource_group_name azurerm_resource_group.freddy.name
revision_mode "Single"
}
1
2=
3=
4=
5= 6 template {7 container {8 name "order"9= image "ghcr.io/remast/order-aca:0.1.0"10= cpu 0.511= memory "1Gi"12= env {13 name "DELIVERY_SERVICE_URL"14= value "http://delivery"15= }16 env {17 name "KITCHEN_SERVICE_URL"18= value "http://kitchen"19= }20 }21 min_replicas 022= max_replicas 123= }24 25 ingress {26 target_port 806027= traffic_weight {28 latest_revision true29= percentage 10030= }31 } 32
33
template {
container {
name "order"
image "ghcr.io/remast/order-aca:0.1.0"
cpu 0.5
memory "1Gi"
}
min_replicas 0
max_replicas 1
}resource "azurerm_container_app" "order" {1 name "order"2= container_app_environment_id azurerm_container_app_environment.cae.id3= resource_group_name azurerm_resource_group.freddy.name4= revision_mode "Single"5= 6
7
8
9=
10=
11=
12= env {13 name "DELIVERY_SERVICE_URL"14= value "http://delivery"15= }16 env {17 name "KITCHEN_SERVICE_URL"18= value "http://kitchen"19= }20
21
22=
23=
24 25 ingress {26 target_port 806027= traffic_weight {28 latest_revision true29= percentage 10030= }31 } 32 }33
env {
name "DELIVERY_SERVICE_URL"
value "http://delivery"
}
env {
name "KITCHEN_SERVICE_URL"
value "http://kitchen"
}resource "azurerm_container_app" "order" {1 name "order"2= container_app_environment_id azurerm_container_app_environment.cae.id3= resource_group_name azurerm_resource_group.freddy.name4= revision_mode "Single"5= 6 template {7 container {8 name "order"9= image "ghcr.io/remast/order-aca:0.1.0"10= cpu 0.511= memory "1Gi"12=
13
14=
15=
16
17
18=
19=
20 }21 min_replicas 022= max_replicas 123= }24 25 ingress {26 target_port 806027= traffic_weight {28 latest_revision true29= percentage 10030= }31 } 32 }33
resource "azurerm_container_app" "order" {
name "order"
container_app_environment_id azurerm_container_app_environment.cae.id
resource_group_name azurerm_resource_group.freddy.name
revision_mode "Single"

template {
container {
name "order"
image "ghcr.io/remast/order-aca:0.1.0"
cpu 0.5
memory "1Gi"
env {
name "DELIVERY_SERVICE_URL"
value "http://delivery"
}
env {
name "KITCHEN_SERVICE_URL"
value "http://kitchen"
}
}
min_replicas 0
max_replicas 1
}

ingress {
target_port 8060
traffic_weight {
latest_revision true
percentage 100
}
}
}
1
2=
3=
4=
5=
6
7
8
9=
10=
11=
12=
13
14=
15=
16
17
18=
19=
20
21
22=
23=
24
25
26
27=
28
29=
30=
31
32
33

Container App Shop Frontend ??????
resource "azurerm_container_app" "shop-frontend" {
name "shop-frontend"
container_app_environment_id azurerm_container_app_environment.cae.id
resource_group_name azurerm_resource_group.freddy.name
revision_mode "Single"
template {
container {
name "shop-frontend"
image "ghcr.io/remast/shop-frontend-aca:0.2.0"
cpu 0.25
memory "0.5Gi"
}
min_replicas 0
max_replicas 1
}
}
1
2=
3=
4=
5= 6
7
8
9=
10=
11=
12=
13
14=
15=
16 17 ingress {18 target_port 420019= external_enabled true20= traffic_weight {21 latest_revision true22= percentage 10023= }24 }25 26
27 28 output "shop_frontend_fqdn" {29 value azurerm_container_app.shop-frontend.latest_revision_fqdn30= }31
ingress {
target_port 4200
traffic_weight {
latest_revision true
percentage 100
}
}resource "azurerm_container_app" "shop-frontend" {1 name "shop-frontend"2= container_app_environment_id azurerm_container_app_environment.cae.id3= resource_group_name azurerm_resource_group.freddy.name4= revision_mode "Single"5= 6 template {7 container {8 name "shop-frontend"9= image "ghcr.io/remast/shop-frontend-aca:0.2.0"10= cpu 0.2511= memory "0.5Gi"12= }13 min_replicas 014= max_replicas 115= }16 17
18
19= external_enabled true20=
21
22=
23=
24
25 26 }27 28 output "shop_frontend_fqdn" {29 value azurerm_container_app.shop-frontend.latest_revision_fqdn30= }31
external_enabled true
output "shop_frontend_fqdn" {
value azurerm_container_app.shop-frontend.latest_revision_fqdn
}resource "azurerm_container_app" "shop-frontend" {1 name "shop-frontend"2= container_app_environment_id azurerm_container_app_environment.cae.id3= resource_group_name azurerm_resource_group.freddy.name4= revision_mode "Single"5= 6 template {7 container {8 name "shop-frontend"9= image "ghcr.io/remast/shop-frontend-aca:0.2.0"10= cpu 0.2511= memory "0.5Gi"12= }13 min_replicas 014= max_replicas 115= }16 17 ingress {18 target_port 420019=
20= traffic_weight {21 latest_revision true22= percentage 10023= }24 }25 26 }27 28
29
30=
31
resource "azurerm_container_app" "shop-frontend" {
name "shop-frontend"
container_app_environment_id azurerm_container_app_environment.cae.id
resource_group_name azurerm_resource_group.freddy.name
revision_mode "Single"

template {
container {
name "shop-frontend"
image "ghcr.io/remast/shop-frontend-aca:0.2.0"
cpu 0.25
memory "0.5Gi"
}
min_replicas 0
max_replicas 1
}

ingress {
target_port 4200
external_enabled true
traffic_weight {
latest_revision true
percentage 100
}
}

}

output "shop_frontend_fqdn" {
value azurerm_container_app.shop-frontend.latest_revision_fqdn
}
1
2=
3=
4=
5=
6
7
8
9=
10=
11=
12=
13
14=
15=
16
17
18
19=
20=
21
22=
23=
24
25
26
27
28
29
30=
31

Terraform ausführen
>_ terraform apply1 2 azurerm_resource_group.freddy: Refreshing state...3 azurerm_container_app_environment.cae: Refreshing state...4 azurerm_container_app.delivery: Refreshing state...5 azurerm_container_app.kitchen: Refreshing state...6 azurerm_container_app.shop-frontend: Refreshing state...7 azurerm_container_app.order: Refreshing state...8 9 Terraform will perform the following actions:10 11 # azurerm_container_app.order will be updated in-place12 ~ resource "azurerm_container_app" "order" {13 ~ template {14 ~ container {15 ~ memory = "0.5Gi" -> "1Gi"16 }17 }18 }19 20 Plan: 0 to add, 1 to change, 0 to destroy.21 22 azurerm_container_app.order: Modifying...23 azurerm_container_app.order: Modifications complete after 17s24 Apply complete! Resources: 0 added, 1 changed, 0 destroyed.25 26 Outputs:27 shop_frontend_fqdn = "shop-frontend-03.victorious-3fb.westeurope.azurecontainerapps.io" 28
azurerm_resource_group.freddy: Refreshing state...
azurerm_container_app_environment.cae: Refreshing state...
azurerm_container_app.delivery: Refreshing state...
azurerm_container_app.kitchen: Refreshing state...
azurerm_container_app.shop-frontend: Refreshing state...
azurerm_container_app.order: Refreshing state...

Terraform will perform the following actions:

# azurerm_container_app.order will be updated in-place
~ resource "azurerm_container_app" "order" {
~ template {
~ container {
~ memory = "0.5Gi" -> "1Gi"
}
}
}

Plan: 0 to add, 1 to change, 0 to destroy.

azurerm_container_app.order: Modifying...
azurerm_container_app.order: Modifications complete after 17s
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

Outputs:
shop_frontend_fqdn = "shop-frontend-03.victorious-3fb.westeurope.azurecontainerapps.io" >_ terraform apply1 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
>_ terraform apply

azurerm_resource_group.freddy: Refreshing state...
azurerm_container_app_environment.cae: Refreshing state...
azurerm_container_app.delivery: Refreshing state...
azurerm_container_app.kitchen: Refreshing state...
azurerm_container_app.shop-frontend: Refreshing state...
azurerm_container_app.order: Refreshing state...

Terraform will perform the following actions:

# azurerm_container_app.order will be updated in-place
~ resource "azurerm_container_app" "order" {
~ template {
~ container {
~ memory = "0.5Gi" -> "1Gi"
}
}
}

Plan: 0 to add, 1 to change, 0 to destroy.

azurerm_container_app.order: Modifying...
azurerm_container_app.order: Modifications complete after 17s
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

Outputs:
shop_frontend_fqdn = "shop-frontend-03.victorious-3fb.westeurope.azurecontainerapps.io"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

Freddys BBQ
in Produktion
??????

In Produktion
Blue/Green Deployments mit Revisionen ??????#
Metriken (CPU, Speicher) und Logs ⏱️#

Blue/Green Deployments ??????
Revisionen werden immer Blue/Green deployt
Traffic Splitting zwischen Revisionen möglich
#
#

Metriken und Logs ⏱️
Metriken
Application Insights für Metriken
Metriken aller Apps zentral verfügbar
Standard Metriken für CPU, Speicher, Replica
#
#
#
Logs
Logs aller Apps zentral verfügbar
Anwendungs Logs in ContainerAppConsoleLogs_CL
Infrastruktur Logs in ContainerAppSystemLogs_CL
#
#
#

Anwendungs Logs ⏱️

Infrastruktur Logs ⏱️

Was ACA noch kann

Was ACA noch kann
Probes für Health und Startup ??????‍⚕️#
Passwörter aus Secrets ??????#
Workload Profile ??????‍♂️#
Container App Jobs
(einmalig, CRON-Schedule, Event getrieben)
#
Init Container#
Skalieren mit KEDA#
Authentifizierung#
SSL Zertifikate und mTLS#
Dapr Integration#

Microserves lieben Azure
Container Apps
Freddys Basis Setup
1. Freddys Container Apps
BBQ Architektur
ACA Infrastruktur
2. Terraform Infrastruktur
ACA Setup
Ausführen und Ändern
#
#
#
#
ACA in Produktion
Blue/Green Deployments mit
Revisionen ??????
Metriken (CPU, Speicher) und
Logs ⏱️
#
#

3 Gründe für
Azure Container Apps
?????? Schnell
☯️ Einfach
?????? Mächtig

Jan Stamer
[email protected]

?????? Mehr auf LinkedIn Learning

Microservices lieben
Azure Container Apps