Published on

Azure AKS Enterprise Platform: Skalierbare Anwendungen für Konzerne

Authors

Warum Azure AKS für Enterprise-Umgebungen?

Azure Kubernetes Service (AKS) ist die führende Managed Kubernetes-Plattform für Enterprise-Umgebungen. Im Gegensatz zu On-Premise Kubernetes bietet AKS:

  • Managed Control Plane - Microsoft übernimmt die Kubernetes-Verwaltung
  • Enterprise-Grade Security - Azure AD Integration, RBAC, Network Policies
  • Automatische Skalierung - Cluster und Pod Auto-Scaling
  • Multi-Region Deployment - Globale Verfügbarkeit
  • Cost Optimization - Spot Instances, Reserved Instances
  • Compliance - ISO 27001, SOC 2, DSGVO-konform

Enterprise AKS Architektur

# Enterprise AKS Architecture
azure-aks-enterprise:
  infrastructure:
    aks-clusters:
      - production-cluster:
          region: 'West Europe'
          node-count: 10-50
          vm-size: 'Standard_D8s_v3'
          os-disk-size: 128GB
      - staging-cluster:
          region: 'West Europe'
          node-count: 5-20
          vm-size: 'Standard_D4s_v3'
          os-disk-size: 64GB
      - development-cluster:
          region: 'West Europe'
          node-count: 3-10
          vm-size: 'Standard_D2s_v3'
          os-disk-size: 32GB

  networking:
    vnet: Custom VNet mit Subnetzen
    network-policy: Azure Network Policy
    load-balancer: Azure Load Balancer
    ingress: NGINX Ingress Controller

  security:
    identity: Azure AD + Azure RBAC
    secrets: Azure Key Vault
    compliance: Azure Policy

  monitoring:
    logging: Azure Monitor + Log Analytics
    metrics: Azure Monitor + Prometheus
    alerting: Azure Monitor Alerts

Phase 1: AKS Cluster Setup

1.1 Azure CLI & Tools Setup

# Azure CLI installieren
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# Azure CLI login
az login

# AKS CLI Tools installieren
az aks install-cli

# Subscription setzen
az account set --subscription "your-subscription-id"

1.2 Resource Group & VNet Setup

# Resource Group erstellen
az group create \
  --name "rg-aks-enterprise" \
  --location "West Europe"

# VNet erstellen
az network vnet create \
  --resource-group "rg-aks-enterprise" \
  --name "vnet-aks" \
  --address-prefix "10.0.0.0/16" \
  --subnet-name "subnet-aks" \
  --subnet-prefix "10.0.1.0/24"

# Subnet für Application Gateway (optional)
az network vnet subnet create \
  --resource-group "rg-aks-enterprise" \
  --vnet-name "vnet-aks" \
  --name "subnet-appgw" \
  --address-prefix "10.0.2.0/24"

1.3 AKS Cluster erstellen

# Production AKS Cluster
az aks create \
  --resource-group "rg-aks-enterprise" \
  --name "aks-production" \
  --node-count 3 \
  --node-vm-size "Standard_D8s_v3" \
  --network-plugin "azure" \
  --network-policy "azure" \
  --vnet-subnet-id "/subscriptions/.../subnets/subnet-aks" \
  --enable-managed-identity \
  --enable-aad \
  --enable-azure-rbac \
  --enable-cluster-autoscaler \
  --min-count 3 \
  --max-count 50 \
  --enable-addons monitoring \
  --workspace-resource-id "/subscriptions/.../workspaces/loganalytics-workspace" \
  --generate-ssh-keys

# Staging AKS Cluster
az aks create \
  --resource-group "rg-aks-enterprise" \
  --name "aks-staging" \
  --node-count 2 \
  --node-vm-size "Standard_D4s_v3" \
  --network-plugin "azure" \
  --network-policy "azure" \
  --vnet-subnet-id "/subscriptions/.../subnets/subnet-aks" \
  --enable-managed-identity \
  --enable-aad \
  --enable-azure-rbac \
  --enable-cluster-autoscaler \
  --min-count 2 \
  --max-count 20 \
  --enable-addons monitoring \
  --workspace-resource-id "/subscriptions/.../workspaces/loganalytics-workspace"

Phase 2: Enterprise Security Setup

2.1 Azure AD Integration

# azure-ad-rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: azure-ad-cluster-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: Group
    name: 'azure-ad-group-id' # Azure AD Group ID
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer-role
  namespace: default
rules:
  - apiGroups: ['']
    resources: ['pods', 'services', 'configmaps']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']
  - apiGroups: ['apps']
    resources: ['deployments', 'replicasets']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']

2.2 Azure Key Vault Integration

# key-vault-csi-driver.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname
  namespace: default
spec:
  provider: azure
  parameters:
    usePodIdentity: 'false'
    useVMManagedIdentity: 'true'
    userAssignedIdentityID: 'managed-identity-client-id'
    keyvaultName: 'your-key-vault-name'
    objects: |
      array:
        - |
          objectName: "database-password"
          objectType: "secret"
          objectVersion: ""
        - |
          objectName: "api-key"
          objectType: "secret"
          objectVersion: ""
  secretObjects:
    - data:
        - key: password
          objectName: database-password
        - key: api-key
          objectName: api-key
      secretName: app-secrets
      type: Opaque
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-with-secrets
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app-with-secrets
  template:
    metadata:
      labels:
        app: app-with-secrets
    spec:
      containers:
        - name: app
          image: your-app:latest
          volumeMounts:
            - name: secrets-store-inline
              mountPath: '/mnt/secrets-store'
              readOnly: true
      volumes:
        - name: secrets-store-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: 'azure-kvname'

Phase 3: Monitoring & Observability

3.1 Azure Monitor Integration

# azure-monitor-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: azure-monitor-config
  namespace: monitoring
data:
  prometheus-config.yaml: |
    global:
      scrape_interval: 30s
      evaluation_interval: 30s

    scrape_configs:
    - job_name: 'kubernetes-pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: kubernetes_pod_name

3.2 Grafana Dashboards für AKS

# aks-grafana-dashboard.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: aks-cluster-dashboard
  namespace: monitoring
  labels:
    grafana_dashboard: '1'
data:
  aks-cluster-dashboard.json: |
    {
      "dashboard": {
        "id": null,
        "title": "AKS Cluster Overview",
        "tags": ["azure", "aks", "kubernetes"],
        "panels": [
          {
            "id": 1,
            "title": "Node CPU Usage",
            "type": "graph",
            "targets": [
              {
                "expr": "100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
                "legendFormat": "{{instance}}"
              }
            ]
          },
          {
            "id": 2,
            "title": "Node Memory Usage",
            "type": "graph",
            "targets": [
              {
                "expr": "(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100",
                "legendFormat": "{{instance}}"
              }
            ]
          },
          {
            "id": 3,
            "title": "Pod Status by Namespace",
            "type": "piechart",
            "targets": [
              {
                "expr": "sum(kube_pod_status_phase) by (phase, namespace)",
                "legendFormat": "{{namespace}} - {{phase}}"
              }
            ]
          },
          {
            "id": 4,
            "title": "Azure Load Balancer Health",
            "type": "stat",
            "targets": [
              {
                "expr": "azure_loadbalancer_health_probe_status",
                "legendFormat": "{{probe_name}}"
              }
            ]
          }
        ]
      }
    }

Phase 4: Microservices Migration

4.1 Monolith zu Microservices Migration

# migration-strategy.yaml
migration-phases:
  phase-1-strangler-fig:
    description: 'Strangler Fig Pattern - Schrittweise Migration'
    steps:
      - 'API Gateway vor Monolith platzieren'
      - 'Neue Features als Microservices entwickeln'
      - 'Alte Features schrittweise migrieren'
      - 'Traffic graduell umleiten'

  phase-2-database-migration:
    description: 'Database Migration Strategy'
    steps:
      - 'Shared Database Pattern'
      - 'Database per Service Pattern'
      - 'Event Sourcing für Datenkonsistenz'

  phase-3-deployment-strategy:
    description: 'Blue-Green Deployment'
    steps:
      - 'Neue Version parallel deployen'
      - 'Traffic schrittweise umleiten'
      - 'Alte Version nach Validierung entfernen'

4.2 Service Mesh mit Istio

# istio-service-mesh.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: monolith-vs
spec:
  hosts:
    - 'api.company.com'
  gateways:
    - company-gateway
  http:
    - match:
        - uri:
            prefix: '/api/v1'
      route:
        - destination:
            host: monolith-service
            port:
              number: 8080
          weight: 70
        - destination:
            host: microservice-v1
            port:
              number: 8080
          weight: 30
    - match:
        - uri:
            prefix: '/api/v2'
      route:
        - destination:
            host: microservice-v2
            port:
              number: 8080
          weight: 100
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: monolith-destination
spec:
  host: monolith-service
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http1MaxPendingRequests: 1024
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 30s

Phase 5: Multi-Cloud Management mit Crossplane

5.1 Crossplane Setup für AKS

# crossplane-aks-provider.yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-azure
spec:
  package: crossplane/provider-azure:v0.19.0
---
apiVersion: azure.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: azure-provider-config
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: azure-secret
      key: credentials
---
apiVersion: containerservice.azure.crossplane.io/v1beta1
kind: AKSCluster
metadata:
  name: aks-crossplane
spec:
  forProvider:
    location: 'West Europe'
    resourceGroupName: 'rg-aks-enterprise'
    kubernetesVersion: '1.28.0'
    dnsPrefix: 'aks-crossplane'
    defaultNodePool:
      name: 'default'
      count: 3
      vmSize: 'Standard_D8s_v3'
      osDiskSizeGB: 128
      enableAutoScaling: true
      minCount: 3
      maxCount: 50
    networkProfile:
      networkPlugin: 'azure'
      networkPolicy: 'azure'
      serviceCidr: '10.0.0.0/16'
      dnsServiceIP: '10.0.0.10'
      dockerBridgeCidr: '172.17.0.1/16'
  providerConfigRef:
    name: azure-provider-config

5.2 Multi-Cloud Resource Management

# multi-cloud-resources.yaml
apiVersion: database.example.org/v1alpha1
kind: PostgreSQLInstance
metadata:
  name: production-db
spec:
  forProvider:
    region: 'West Europe'
    version: '13'
    size: 'Standard_D8s_v3'
    storageGB: 100
    backupRetentionDays: 30
  providerConfigRef:
    name: azure-provider-config
---
apiVersion: cache.example.org/v1alpha1
kind: RedisInstance
metadata:
  name: production-cache
spec:
  forProvider:
    region: 'West Europe'
    size: 'Standard_C4'
    sku: 'Standard'
    capacity: 2
  providerConfigRef:
    name: azure-provider-config
---
apiVersion: storage.example.org/v1alpha1
kind: BlobStorage
metadata:
  name: app-storage
spec:
  forProvider:
    region: 'West Europe'
    accountTier: 'Standard'
    accountReplicationType: 'GRS'
    accessTier: 'Hot'
  providerConfigRef:
    name: azure-provider-config

Phase 6: Developer Platform (IDP)

6.1 Internal Developer Platform Setup

# idp-platform.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: idp-config
  namespace: platform
data:
  platform-config.yaml: |
    apiVersion: platform.company.com/v1
    kind: PlatformConfig
    spec:
      environments:
        - name: development
          cluster: "aks-development"
          namespace: "dev"
          resourceQuota:
            cpu: "4"
            memory: "8Gi"
        - name: staging
          cluster: "aks-staging"
          namespace: "staging"
          resourceQuota:
            cpu: "8"
            memory: "16Gi"
        - name: production
          cluster: "aks-production"
          namespace: "prod"
          resourceQuota:
            cpu: "16"
            memory: "32Gi"
      
      services:
        - name: "web-api"
          type: "REST API"
          language: "Node.js"
          framework: "Express"
          database: "PostgreSQL"
          cache: "Redis"
          monitoring: "Prometheus"
          logging: "ELK Stack"
      
      templates:
        - name: "microservice-template"
          source: "https://github.com/company/microservice-template"
          variables:
            - name: "SERVICE_NAME"
            - name: "DATABASE_NAME"
            - name: "API_VERSION"

6.2 Self-Service Portal

# self-service-portal.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: idp-portal
  namespace: platform
spec:
  replicas: 2
  selector:
    matchLabels:
      app: idp-portal
  template:
    metadata:
      labels:
        app: idp-portal
    spec:
      containers:
        - name: portal
          image: company/idp-portal:latest
          env:
            - name: AZURE_CLIENT_ID
              valueFrom:
                secretKeyRef:
                  name: azure-credentials
                  key: client-id
            - name: AZURE_CLIENT_SECRET
              valueFrom:
                secretKeyRef:
                  name: azure-credentials
                  key: client-secret
            - name: AZURE_TENANT_ID
              valueFrom:
                secretKeyRef:
                  name: azure-credentials
                  key: tenant-id
          ports:
            - containerPort: 8080
          resources:
            requests:
              memory: '256Mi'
              cpu: '250m'
            limits:
              memory: '512Mi'
              cpu: '500m'
---
apiVersion: v1
kind: Service
metadata:
  name: idp-portal-service
  namespace: platform
spec:
  selector:
    app: idp-portal
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP

Cost Optimization

7.1 AKS Cost Management

# cost-optimization.yaml
cost-strategies:
  node-pool-optimization:
    - 'Spot Instances für Development/Staging'
    - 'Reserved Instances für Production'
    - 'Auto-Scaling basierend auf Workload'

  resource-optimization:
    - 'Resource Requests/Limits optimieren'
    - 'Pod Disruption Budgets verwenden'
    - 'Horizontal Pod Autoscaler konfigurieren'

  storage-optimization:
    - 'Managed Disks mit Premium Tier'
    - 'Azure Files für Shared Storage'
    - 'Azure Blob Storage für Backups'

7.2 Resource Quotas & Limits

# resource-quotas.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: production-quota
  namespace: production
spec:
  hard:
    requests.cpu: '16'
    requests.memory: 32Gi
    limits.cpu: '32'
    limits.memory: 64Gi
    persistentvolumeclaims: '20'
    services.loadbalancers: '10'
    services.nodeports: '20'
---
apiVersion: v1
kind: LimitRange
metadata:
  name: production-limits
  namespace: production
spec:
  limits:
    - default:
        cpu: 1000m
        memory: 2Gi
      defaultRequest:
        cpu: 500m
        memory: 1Gi
      type: Container

Troubleshooting

Common AKS Issues

1. Node Pool Scaling Issues

# Node Pool Status prüfen
az aks show --resource-group rg-aks-enterprise --name aks-production --query agentPoolProfiles

# Node Pool manuell skalieren
az aks scale --resource-group rg-aks-enterprise --name aks-production --node-count 5

# Auto-Scaling Status prüfen
az aks show --resource-group rg-aks-enterprise --name aks-production --query agentPoolProfiles[0].enableAutoScaling

2. Network Connectivity Issues

# VNet Integration prüfen
az aks show --resource-group rg-aks-enterprise --name aks-production --query networkProfile

# Network Policies prüfen
kubectl get networkpolicies --all-namespaces

# Service Endpoints prüfen
az network vnet subnet show --resource-group rg-aks-enterprise --vnet-name vnet-aks --name subnet-aks --query serviceEndpoints

3. Azure AD Integration Issues

# Azure AD Integration Status
az aks show --resource-group rg-aks-enterprise --name aks-production --query aadProfile

# RBAC Status prüfen
az aks show --resource-group rg-aks-enterprise --name aks-production --query enableAzureRbac

# Cluster Admin Credentials abrufen
az aks get-credentials --resource-group rg-aks-enterprise --name aks-production --admin

Fazit

Azure AKS als Enterprise-Plattform bietet enorme Vorteile:

  • Managed Kubernetes - Microsoft übernimmt die Control Plane
  • Enterprise Security - Azure AD, RBAC, Network Policies
  • Multi-Cloud Ready - Crossplane für Multi-Cloud Management
  • Developer Experience - Self-Service Platform (IDP)
  • Cost Optimization - Spot Instances, Auto-Scaling
  • Compliance - Enterprise-Grade Compliance

Nächste Schritte:

  1. AKS Cluster nach diesem Guide aufsetzen
  2. Azure AD Integration konfigurieren
  3. Monitoring und Observability implementieren
  4. Microservices Migration planen
  5. Developer Platform (IDP) aufbauen

Mit diesem Setup haben Sie eine enterprise-ready AKS-Plattform, die den Anforderungen von Konzernen entspricht und skalierbare Anwendungen ermöglicht.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen