Utiliser l’extension Fournisseur de secrets Azure Key Vault pour extraire des secrets dans des clusters Kubernetes activés pour Azure Arc
Le fournisseur Azure Key Vault pour le pilote CSI du magasin de secrets permet d’intégrer Azure Key Vault comme magasin de secrets à un cluster Kubernetes via un volume CSI. Pour les clusters Kubernetes activés pour Azure Arc, vous pouvez installer l’extension Fournisseur de secrets Azure Key Vault pour extraire des secrets.
Les capacités de l’extension Fournisseur de secrets Azure Key Vault sont :
- Monte des secrets/clés/certificats dans un pod à l’aide d’un volume CSI inlined
- Prend en charge la portabilité de pod avec SecretProviderClass CRD
- Prend en charge les conteneurs Linux et Windows
- Prend en charge la synchronisation des secrets Kubernetes
- Prend en charge la rotation automatique des secrets
- Les composants de l’extension sont déployés dans des zones de disponibilité, ce qui les rend redondants interzone
Conseil
Si l’accès hors connexion est nécessaire ou s’il vous faut des secrets synchronisés dans le magasin de secrets Kubernetes, utilisez l’extension du Magasin des secrets pour gérer des secrets dans vos clusters Kubernetes dotés d’Arc.
Prérequis
- Un cluster avec une distribution Kubernetes prise en charge qui est connectée à Azure Arc. Les distributions Kubernetes suivantes sont actuellement prises en charge pour ce scénario :
- Cluster API Azure
- Clusters Azure Kubernetes Service (AKS) sur Azure Stack HCI
- AKS activé par Azure Arc
- Google Kubernetes Engine
- OpenShift Kubernetes Distribution
- Canonical Kubernetes Distribution
- Elastic Kubernetes Service
- Tanzu Kubernetes Grid
- Azure Red Hat OpenShift
- Connectivité sortante vers les points de terminaison suivants :
linuxgeneva-microsoft.azurecr.io
upstreamarc.azurecr.io
*.blob.core.windows.net
- Assurez-vous de respecter tous les prérequis généraux pour les extensions de cluster. Vous devez utiliser la version 0.4.0 ou ultérieure de l’extension Azure CLI
k8s-extension
.
Installer l’extension Fournisseur de secrets Azure Key Vault sur un cluster Kubernetes activé pour Arc
Vous pouvez installer l’extension Fournisseur de secrets Azure Key Vault dans votre cluster connecté depuis le Portail Azure, en utilisant Azure CLI ou en déployant un modèle ARM.
Une seule instance de l’extension peut être déployée sur chaque cluster Kubernetes activé pour Azure Arc.
Conseil
Si le cluster se trouve derrière un serveur proxy sortant, connectez-le à Azure Arc au moyen de l’option de configuration du proxy avant d’installer l’extension.
Portail Azure
Dans le portail Azure, accédez à Kubernetes - Azure Arc, puis sélectionnez votre cluster.
Sélectionnez Extensions (sous Paramètres), puis sélectionnez + Ajouter.
Dans la liste des extensions disponibles, sélectionnez Fournisseur de secrets Azure Key Vault pour déployer la dernière version de l’extension.
Suivez les invites pour installer l’extension. Si nécessaire, personnalisez l’installation en modifiant les options par défaut dans l’onglet Configuration.
Azure CLI
Définissez les variables d’environnement :
export CLUSTER_NAME=<arc-cluster-name> export RESOURCE_GROUP=<resource-group-name>
Installez le pilote CSI du magasin de secrets et l’extension Fournisseur de secrets Azure Key Vault en exécutant la commande suivante :
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider
La sortie doit ressembler à cet exemple. Plusieurs minutes peuvent s’écouler avant que le chart Helm du fournisseur de secrets soit déployé sur le cluster.
{
"aksAssignedIdentity": null,
"autoUpgradeMinorVersion": true,
"configurationProtectedSettings": {},
"configurationSettings": {},
"customLocationSettings": null,
"errorInfo": null,
"extensionType": "microsoft.azurekeyvaultsecretsprovider",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
"identity": {
"principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantId": null,
"type": "SystemAssigned"
},
"location": null,
"name": "akvsecretsprovider",
"packageUri": null,
"provisioningState": "Succeeded",
"releaseTrain": "Stable",
"resourceGroup": "$RESOURCE_GROUP",
"scope": {
"cluster": {
"releaseNamespace": "kube-system"
},
"namespace": null
},
"statuses": [],
"systemData": {
"createdAt": "2022-05-12T18:35:56.552889+00:00",
"createdBy": null,
"createdByType": null,
"lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
"lastModifiedBy": null,
"lastModifiedByType": null
},
"type": "Microsoft.KubernetesConfiguration/extensions",
"version": "1.1.3"
}
Modèle ARM
Créez un fichier .json en utilisant le format suivant. Veillez à mettre à jour la valeur <cluster-name> pour référencer votre cluster.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "ConnectedClusterName": { "defaultValue": "<cluster-name>", "type": "String", "metadata": { "description": "The Connected Cluster name." } }, "ExtensionInstanceName": { "defaultValue": "akvsecretsprovider", "type": "String", "metadata": { "description": "The extension instance name." } }, "ExtensionVersion": { "defaultValue": "", "type": "String", "metadata": { "description": "The version of the extension type." } }, "ExtensionType": { "defaultValue": "Microsoft.AzureKeyVaultSecretsProvider", "type": "String", "metadata": { "description": "The extension type." } }, "ReleaseTrain": { "defaultValue": "stable", "type": "String", "metadata": { "description": "The release train." } } }, "functions": [], "resources": [ { "type": "Microsoft.KubernetesConfiguration/extensions", "apiVersion": "2021-09-01", "name": "[parameters('ExtensionInstanceName')]", "identity": { "type": "SystemAssigned" }, "properties": { "extensionType": "[parameters('ExtensionType')]", "releaseTrain": "[parameters('ReleaseTrain')]", "version": "[parameters('ExtensionVersion')]" }, "scope": "[concat('Microsoft.Kubernetes/connectedClusters/', parameters('ConnectedClusterName'))]" } ] }
Définissez maintenant les variables d’environnement en utilisant la commande Azure CLI suivante :
export TEMPLATE_FILE_NAME=<template-file-path> export DEPLOYMENT_NAME=<desired-deployment-name>
Enfin, exécutez cette commande Azure CLI pour installer l’extension Fournisseur de secrets Azure Key Vault :
az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME
Normalement, vous devez maintenant voir les ressources du fournisseur de secrets et pouvoir utiliser l’extension dans votre cluster.
Valider l’installation de l’extension
Pour vérifier la réussite de l’installation de l’extension Fournisseur de secrets Azure Key Vault, exécutez la commande suivante.
az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider
La sortie doit ressembler à cet exemple.
{
"aksAssignedIdentity": null,
"autoUpgradeMinorVersion": true,
"configurationProtectedSettings": {},
"configurationSettings": {},
"customLocationSettings": null,
"errorInfo": null,
"extensionType": "microsoft.azurekeyvaultsecretsprovider",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
"identity": {
"principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantId": null,
"type": "SystemAssigned"
},
"location": null,
"name": "akvsecretsprovider",
"packageUri": null,
"provisioningState": "Succeeded",
"releaseTrain": "Stable",
"resourceGroup": "$RESOURCE_GROUP",
"scope": {
"cluster": {
"releaseNamespace": "kube-system"
},
"namespace": null
},
"statuses": [],
"systemData": {
"createdAt": "2022-05-12T18:35:56.552889+00:00",
"createdBy": null,
"createdByType": null,
"lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
"lastModifiedBy": null,
"lastModifiedByType": null
},
"type": "Microsoft.KubernetesConfiguration/extensions",
"version": "1.1.3"
}
Créer ou sélectionner un coffre de clés Azure
Ensuite, spécifiez le coffre de clés Azure à utiliser avec votre cluster connecté. Si vous n’en avez pas déjà un, créez un coffre de clés en utilisant les commandes suivantes. Gardez à l’esprit que le nom de votre coffre de clés doit être en gros unique.
Définissez les variables d’environnement suivantes :
export AKV_RESOURCE_GROUP=<resource-group-name>
export AZUREKEYVAULT_NAME=<AKV-name>
export AZUREKEYVAULT_LOCATION=<AKV-location>
Exécutez ensuite la commande suivante :
az keyvault create -n $AZUREKEYVAULT_NAME -g $AKV_RESOURCE_GROUP -l $AZUREKEYVAULT_LOCATION
Azure Key Vault peut stocker des clés, des secrets et des certificats. Pour cet exemple, vous pouvez définir un secret en texte brut appelé DemoSecret
en utilisant la commande suivante :
az keyvault secret set --vault-name $AZUREKEYVAULT_NAME -n DemoSecret --value MyExampleSecret
Avant de passer à la section suivante, prenez note des propriétés suivantes :
- Nom de l’objet secret dans Key Vault
- Type d’objet (secret, clé ou certificat)
- Nom de votre ressource Key Vault
- ID de locataire Azure pour l’abonnement auquel appartient le coffre de clés
Fournir l’identité pour accéder Azure Key Vault
Actuellement, le pilote CSI du magasin de secrets sur les clusters activés pour Arc est accessible via un principal de service. Suivez ces étapes pour fournir une identité pouvant accéder à votre coffre de clés.
Suivez les étapes pour créer un principal de service dans Azure. Notez l’ID client et la clé secrète client générés au cours de cette étape.
Ensuite, assurez-vous qu’Azure Key Vault a l’autorisation GET au principal du service créé.
Utilisez l’ID client et la clé secrète client de la première étape pour créer un secret Kubernetes sur le cluster connecté :
kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
Étiquetez le secret créé :
kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
Créez une
SecretProviderClass
avec le YAML suivant, en renseignant vos valeurs pour le nom du coffre de clés, l’ID de locataire et les objets à récupérer à partir de votre instance AKV :# This is a SecretProviderClass example using service principal to access Keyvault apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: akvprovider-demo spec: provider: azure parameters: usePodIdentity: "false" keyvaultName: <key-vault-name> cloudName: # Defaults to AzurePublicCloud objects: | array: - | objectName: DemoSecret objectType: secret # object types: secret, key or cert objectVersion: "" # [OPTIONAL] object versions, default to latest if empty tenantId: <tenant-Id> # The tenant ID of the Azure Key Vault instance
Pour une utilisation avec des clouds nationaux, remplacez
cloudName
parAzureUSGovernmentCloud
pour Azure Government ouAzureChinaCloud
pour Microsoft Azure géré par 21Vianet.Appliquez la SecretProviderClass à votre cluster :
kubectl apply -f secretproviderclass.yaml
Créez un pod avec le YAML suivant, en renseignant le nom de votre identité :
# This is a sample pod definition for using SecretProviderClass and service principal to access Keyvault kind: Pod apiVersion: v1 metadata: name: busybox-secrets-store-inline spec: containers: - name: busybox image: k8s.gcr.io/e2e-test-images/busybox:1.29 command: - "/bin/sleep" - "10000" 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: "akvprovider-demo" nodePublishSecretRef: name: secrets-store-creds
Appliquez le pod à votre cluster :
kubectl apply -f pod.yaml
Valider les secrets
Une fois le pod démarré, le contenu monté au niveau du chemin d’accès du volume spécifié dans le YAML de votre déploiement est disponible.
## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
## print a test secret 'DemoSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/DemoSecret
Options de configuration supplémentaires
L’extension Fournisseur de secrets d’Azure Key Vault prend en charge les configurations de graphique Helm.
Les paramètres de configuration suivants sont régulièrement employés avec l’extension Fournisseur de secrets d’Azure Key Vault :
Paramètre de configuration | Default | Description |
---|---|---|
enableSecretRotation | false | Type booléen. Si true , met à jour périodiquement le montage du pod et le secret Kubernetes avec le contenu le plus récent du magasin de secrets externes |
rotationPollInterval | 2 m | Si enableSecretRotation est true , ce paramètre spécifie la durée de l’intervalle d’interrogation de rotation des secrets. Cette durée peut être ajustée en fonction de la fréquence à laquelle le contenu monté pour tous les pods et secrets Kubernetes doit être resynchronisé avec la dernière version. |
syncSecret.enabled | false | Entrée booléenne. Dans certains cas, vous voulez créer un secret Kubernetes pour mettre en miroir le contenu monté. Si true , SecretProviderClass autorise le champ secretObjects à définir l’état souhaité des objets secrets Kubernetes synchronisés. |
Ces paramètres peuvent être spécifiés quand l’extension est installée en utilisant la commande az k8s-extension create
:
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true
Vous pouvez aussi modifier ces paramètres après l’installation en utilisant la commande az k8s-extension update
:
az k8s-extension update --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true
Vous pouvez utiliser d’autres paramètres de configuration si nécessaire pour votre déploiement. Par exemple, pour modifier le répertoire racine kubelet, lors de la création d’un cluster, modifiez la commande az k8s-extension create
:
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings linux.kubeletRootDir=/path/to/kubelet secrets-store-csi-driver.linux.kubeletRootDir=/path/to/kubelet
Désinstaller l’extension Fournisseur de secrets Azure Key Vault
Pour installer l’extension, exécutez la commande suivante :
az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider
Notes
La désinstallation de l’extension ne supprime pas les définitions de ressources personnalisées (CRD) qui ont été créées lors de l’installation de l’extension.
Pour vérifier que l’instance de l’extension a été supprimée, exécutez la commande suivante :
az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Si l’extension a été supprimée avec succès, vous ne verrez pas l’extension Fournisseur de secrets Azure Key Vault répertoriée dans la sortie. Si vous n’avez pas d’autres extensions installées sur votre cluster, vous verrez un tableau vide.
Si vous n’en avez plus besoin, assurez-vous à supprimer le secret Kubernetes associé au principal de service en exécutant la commande suivante :
kubectl delete secret secrets-store-creds
Restauration à l’état d’origine et résolution des problèmes
L’extension Fournisseur de secrets Azure Key Vault est auto-réparatrice. Si quelqu’un tente de modifier ou de supprimer un composant d’extension déployé lors de l’installation de l’extension, ce composant est replacé à son état d’origine. Les seules exceptions concernent les définitions de ressources personnalisées (CRD). Si des définitions de ressources personnalisées sont supprimées, elles ne seront pas replacées à leur état d’origine. Pour restaurer les définitions de ressources personnalisées supprimées, réutilisez la commande az k8s-extension create
avec le nom de l’instance d’extension existante.
Pour plus d’informations sur la résolution des problèmes courants, consultez les guides de résolution des problèmes open source pour le fournisseur Azure Key Vault pour le pilote CSI du magasin de secrets et pour le pilote CSI du magasin de secrets.
Étapes suivantes
- Vous voulez essayer ? Commencez rapidement avec un scénario Azure Arc JumpStart à l’aide de l’API de Cluster.
- En savoir plus sur Azure Key Vault.