Exercice : configurer Azure Policy pour Kubernetes sur un cluster AKS

Effectué

Azure Policy pour Kubernetes permet aux organisations de respecter les exigences de gouvernance et légales, d’implémenter les bonnes pratiques et d’établir des conventions organisationnelles pour les environnements cloud.

Les équipes de développement de votre entreprise adoptent Azure Kubernetes Service (AKS) comme plateforme de développement. Vous réalisez que le meilleur moyen de gérer les coûts est d’appliquer des règles d’entreprise qui définissent les limites des ressources de la charge de travail. Vous souhaitez vous assurer que les développeurs peuvent déployer des charges de travail uniquement dans des limites d’allocation de processeur et de mémoire spécifiques. Le système doit empêcher les charges de travail qui dépassent ces limites.

Dans cet exercice, vous allez activer Azure Policy pour AKS sur votre cluster et ajouter la stratégie Les limites de ressources de processeur et de mémoire des conteneurs de cluster Kubernetes ne doivent pas dépasser les limites spécifiées. Vous vérifiez ensuite si la stratégie refuse la planification de charges de travail qui dépassent les paramètres de ressources de la stratégie.

Activer les fournisseurs de ressources ContainerService et PolicyInsights

  1. Connectez-vous à Azure Cloud Shell à l’aide de votre compte Azure. Sélectionnez la version Bash de Cloud Shell.

  2. Azure Policy pour AKS nécessite que la version de cluster soit 1.14 ou une version ultérieure. Exécutez le script suivant pour valider la version de votre cluster AKS :

    az aks list
    

    Assurez-vous que la version de cluster signalée correspond à 1.14 ou une version ultérieure.

  3. Inscrivez le fournisseur du service Azure Kubernetes Service en exécutant la commande az provider register :

    az provider register --namespace Microsoft.ContainerService
    
  4. Inscrivez le fournisseur Azure Policy en exécutant la commande az provider register :

    az provider register --namespace Microsoft.PolicyInsights
    
  5. Activez l’installation du module complémentaire en exécutant la commande az feature register :

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. Vérifiez que l’inscription a correctement réussi en interrogeant la table répertoriant les fonctionnalités. Pour ce faire, utilisez la commande az feature list. L’inscription de la fonctionnalité peut prendre plusieurs minutes et vous devez vérifier le résultat régulièrement.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    Si la session Cloud Shell expire, vous pouvez suivre le processus d’inscription via le portail Azure à l’aide de la page d’intégration de la préversion.

  7. Exécutez la commande az provider register pour propager la mise à jour après avoir vérifié que la commande d’interrogation de liste de fonctionnalités affiche « Inscrite » :

    az provider register -n Microsoft.ContainerService
    

Activer Azure Policy sur votre cluster

  1. Exécutez la commande az aks enable-addons pour activer le module complémentaire azure-policy pour votre cluster :

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. Vérifiez que le pod azure-policy est installé dans l’espace de noms kube-system et que le pod gatekeeper est installé dans l’espace de noms gatekeeper-system. Pour ce faire, exécutez les commandes kubectl get pods suivantes :

    kubectl get pods -n kube-system
    

    Votre résultat doit être semblable à ce qui suit :

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    Votre résultat doit être semblable à ce qui suit :

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Enfin, vérifiez que le module complémentaire le plus récent est installé en exécutant la commande az aks show. Cette commande récupère les informations de configuration de votre cluster.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    Votre résultat doit être semblable à ce qui suit :

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    Vous êtes maintenant prêt à passer au portail Azure pour configurer la stratégie appelée Les limites des ressources en processeur et en mémoire sur les conteneurs du cluster Kubernetes ne doivent pas dépasser les limites spécifiées.

Attribuer une définition de stratégie intégrée

Pour configurer la nouvelle stratégie Azure, utilisez le service Stratégie dans le portail Azure.

  1. Connectez-vous au portail Azure.

  2. Recherchez le service Stratégie dans le portail Azure. Pour cela, dans la barre de recherche en haut du portail Azure, recherchez et sélectionnez Stratégie.

  3. Sélectionnez le service Stratégie dans la liste des services, comme illustré ici :

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    Le tableau de bord Stratégie s’ouvre en affichant une vue d’ensemble de toutes vos stratégies attribuées, de l’état des ressources, et de la façon dont les stratégies les affectent. Si vous n’avez attribué aucune stratégie, le tableau de bord est vide.

  4. Dans le menu de gauche, sous Création, sélectionnez Attributions :

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. Rappelez-vous de notre description précédente que vous disposez de deux options pour créer une attribution de stratégie : vous attribuez une initiative ou une stratégie. Dans la barre de menus du haut, sélectionnez Assigner une stratégie :

    Screenshot that shows the new policy assignment option.

    Le volet Assigner une stratégie apparaît.

  6. Sous l’onglet Informations de base, entrez les valeurs suivantes pour chaque paramètre afin de créer votre stratégie.

    Paramètre Valeur
    Étendue
    Étendue Sélectionnez le bouton représentant des points de suspension. Le volet Étendue apparaît. Sous Abonnement, sélectionnez l’abonnement qui contient votre groupe de ressources. Pour Groupe de ressources, sélectionnez rg-akscostsaving, puis le bouton Sélectionner.
    Exclusions Laissez ce champ vide.
    Concepts de base
    Définition de stratégie Sélectionnez le bouton représentant des points de suspension. Le volet Définitions disponibles apparaît. Dans la zone Rechercher, filtrez la sélection en entrant Processeur. Sous l’onglet Définitions de stratégie, sélectionnez Les limites de ressources de processeur et de mémoire des conteneurs de cluster Kubernetes ne doivent pas dépasser les limites spécifiées, puis Ajouter.
    Nom de l’attribution Acceptez les valeurs par défaut.
    Description Laissez ce champ vide.
    Application des stratégies Vérifiez que cette option est définie sur Activé.
    Attribué par Acceptez les valeurs par défaut.

    Voici un exemple de l’onglet De base complété :

    Screenshot that shows the information captured in the Basics tab.

  7. Sélectionnez l’onglet Paramètres pour spécifier les paramètres de la stratégie.

  8. Définissez les valeurs suivantes pour chacun des paramètres :

    Paramètre Valeur
    Nombre maximal d’unités de processeur autorisées Définissez la valeur sur 200. La stratégie met en correspondance cette valeur avec la valeur de la demande de ressource de charge de travail et la valeur de limite de charge de travail, comme spécifié dans le fichier manifeste de la charge de travail.
    Nombre maximal d’octets de mémoire autorisés Définissez la valeur sur 256Mi. La stratégie met en correspondance cette valeur avec la valeur de la demande de ressource de charge de travail et la valeur de limite de charge de travail, comme spécifié dans le fichier manifeste de la charge de travail.

    Voici un exemple de l’onglet Paramètres complété :

    Screenshot that shows the information captured in the Parameters tab.

  9. Sélectionnez l’onglet Correction. Sous cet onglet, vous sélectionnez la manière dont la nouvelle stratégie affecte les ressources existantes. Par défaut, la nouvelle stratégie ne vérifie que les ressources nouvellement créées. Conservez la configuration standard par défaut.

    Voici un exemple de l’onglet Correction complété :

    Screenshot that shows the information captured in the Remediation tab.

  10. Sélectionnez l’onglet Vérifier + créer. Passez en revue les valeurs que vous avez choisies, puis sélectionnez Créer.

Important

Si vous utilisez un cluster AKS existant, l’application de l’attribution de stratégie peut prendre environ 15 minutes.

Demandes de ressources de test

La dernière étape consiste à tester la nouvelle stratégie. Déployez votre charge de travail de test avec des demandes de ressources et des limites qui enfreignent la nouvelle stratégie. Si tout se passe correctement, le serveur retourne une erreur indiquant qu’elle est refusée par la stratégie.

  1. Ouvrez Azure Cloud Shell et sélectionnez la version Bash de Cloud Shell.

  2. Créez un fichier manifeste pour le déploiement Kubernetes à l’aide de l’éditeur intégré. Appelez le fichier test-policy.yaml :

    code test-policy.yaml
    

    Conseil

    Cloud Shell comprend un éditeur de fichier intégré. L’éditeur Cloud Shell prend en charge des fonctionnalités comme la mise en surbrillance du langage, la palette de commandes et un explorateur de fichiers. Pour créer et modifier des fichiers simples, démarrez l’éditeur en exécutant code . dans le terminal Cloud Shell. Cette action ouvre l’éditeur avec votre répertoire de travail actif défini dans le terminal. Pour ouvrir directement votre fichier manifeste à des fins d’édition rapide, exécutez code test-policy.yaml. Cette commande ouvre l’éditeur sans l’explorateur de fichiers.

  3. Collez le texte suivant dans le fichier :

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Appuyez sur Ctrl+S pour enregistrer le fichier, puis sur Ctrl+Q pour fermer l’éditeur.

  5. Exécutez la commande kubectl apply pour appliquer la configuration et déployer l’application dans l’espace de noms costsavings :

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    La sortie doit ressembler à ce qui suit :

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    Notez la manière dont le webhook d’admission, validation.gatekeeper.sh, a refusé la demande de planification du pod.

  6. Ouvrez le fichier manifeste et corrigez la demande de ressource :

    code test-policy.yaml
    

    Remplacez le texte par le texte suivant :

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Appuyez sur Ctrl+S pour enregistrer le fichier, puis sur Ctrl+Q pour fermer l’éditeur.

  8. Exécutez la commande kubectl apply pour appliquer la configuration et déployer l’application dans l’espace de noms costsavings :

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Vous obtenez la sortie suivante :

    pod/nginx created
    
  9. Obtenez les pods des pods créés dans votre espace de noms costsavings.

    kubectl get pods --namespace costsavings
    

    Au bout de quelques secondes, les pods passent à l’état Running.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Appuyez sur Ctrl+C pour arrêter l’observation une fois que vous voyez les pods en cours d’exécution.