Använda tillägget Azure Key Vault Secrets Provider för att hämta hemligheter till Azure Arc-aktiverade Kubernetes-kluster
Azure Key Vault-providern för Secrets Store CSI-drivrutinen möjliggör integrering av Azure Key Vault som ett hemlighetslager med ett Kubernetes-kluster via en CSI-volym. För Azure Arc-aktiverade Kubernetes-kluster kan du installera tillägget Azure Key Vault Secrets Provider för att hämta hemligheter.
Funktionerna i azure Key Vault Secrets Provider-tillägget är:
- Monterar hemligheter/nycklar/certifikat till podden med hjälp av en CSI-infogad volym
- Stöder poddportabilitet med SecretProviderClass CRD
- Stöder Linux- och Windows-containrar
- Stöder synkronisering med Kubernetes-hemligheter
- Stöder automatisk rotation av hemligheter
- Tilläggskomponenter distribueras till tillgänglighetszoner, vilket gör dem zonredundanta
Dricks
Om offlineåtkomst krävs, eller om du behöver hemligheter synkroniserade med Kubernetes-hemlighetslagret, använder du secret store-tillägget för hantering av hemligheter i dina Arc-aktiverade Kubernetes-kluster.
Förutsättningar
- Ett kluster med en Kubernetes-distribution som stöds och som är ansluten till Azure Arc. Följande Kubernetes-distributioner stöds för närvarande för det här scenariot:
- Kluster-API Azure
- Azure Kubernetes Service-kluster (AKS) i Azure Stack HCI
- AKS aktiverat av Azure Arc
- Google Kubernetes Engine
- OpenShift Kubernetes-distribution
- Kanonisk Kubernetes-distribution
- Elastic Kubernetes Service
- Tanzu Kubernetes Grid
- Azure Red Hat OpenShift
- Utgående anslutning till följande slutpunkter:
linuxgeneva-microsoft.azurecr.io
upstreamarc.azurecr.io
*.blob.core.windows.net
- Se till att du uppfyller de allmänna kraven för klustertillägg. Du måste använda version 0.4.0 eller senare av
k8s-extension
Azure CLI-tillägget.
Installera Azure Key Vault Secrets Provider-tillägget i ett Arc-aktiverat Kubernetes-kluster
Du kan installera tillägget Azure Key Vault Secrets Provider i ditt anslutna kluster i Azure Portal, med hjälp av Azure CLI eller genom att distribuera en ARM-mall.
Endast en instans av tillägget kan distribueras på varje Azure Arc-aktiverat Kubernetes-kluster.
Dricks
Om klustret finns bakom en utgående proxyserver kontrollerar du att du ansluter det till Azure Arc med hjälp av konfigurationsalternativet proxy innan du installerar tillägget.
Azure Portal
I Azure Portal går du till Kubernetes – Azure Arc och väljer ditt kluster.
Välj Tillägg (under Inställningar) och välj sedan + Lägg till.
I listan över tillgängliga tillägg väljer du Azure Key Vault Secrets Provider för att distribuera den senaste versionen av tillägget.
Följ anvisningarna för att distribuera tillägget. Om det behövs anpassar du installationen genom att ändra standardalternativen på fliken Konfiguration .
Azure CLI
Ange miljövariablerna:
export CLUSTER_NAME=<arc-cluster-name> export RESOURCE_GROUP=<resource-group-name>
Installera CSI-drivrutinen för Secrets Store och Azure Key Vault Secrets Provider-tillägget genom att köra följande kommando:
az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider
Du bör se utdata som liknar det här exemplet. Det kan ta flera minuter innan helm-diagrammet för hemlighetsprovidern distribueras till klustret.
{
"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"
}
ARM-mall
Skapa en .json fil med följande format. Se till att uppdatera <värdet för klusternamn> för att referera till klustret.
{ "$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'))]" } ] }
Ange nu miljövariablerna med hjälp av följande Azure CLI-kommando:
export TEMPLATE_FILE_NAME=<template-file-path> export DEPLOYMENT_NAME=<desired-deployment-name>
Kör slutligen det här Azure CLI-kommandot för att installera Azure Key Vault Secrets Provider-tillägget:
az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME
Nu bör du kunna visa de hemliga providerresurserna och använda tillägget i klustret.
Verifiera tilläggsinstallationen
Om du vill bekräfta att azure Key Vault Secrets Provider-tillägget har installerats kör du följande kommando.
az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider
Du bör se utdata som liknar det här exemplet.
{
"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"
}
Skapa eller välj ett Azure Key Vault
Ange sedan det Azure Key Vault som ska användas med ditt anslutna kluster. Om du inte redan har ett skapar du ett nytt Key Vault med hjälp av följande kommandon. Tänk på att namnet på ditt nyckelvalv måste vara globalt unikt.
Ange följande miljövariabler:
export AKV_RESOURCE_GROUP=<resource-group-name>
export AZUREKEYVAULT_NAME=<AKV-name>
export AZUREKEYVAULT_LOCATION=<AKV-location>
Kör sedan följande kommando:
az keyvault create -n $AZUREKEYVAULT_NAME -g $AKV_RESOURCE_GROUP -l $AZUREKEYVAULT_LOCATION
Azure Key Vault kan lagra nycklar, hemligheter och certifikat. I det här exemplet kan du ange en oformaterad texthemlighet som anropas DemoSecret
med hjälp av följande kommando:
az keyvault secret set --vault-name $AZUREKEYVAULT_NAME -n DemoSecret --value MyExampleSecret
Innan du går vidare till nästa avsnitt bör du notera följande egenskaper:
- Namnet på det hemliga objektet i Key Vault
- Objekttyp (hemlighet, nyckel eller certifikat)
- Namnet på din Key Vault-resurs
- Azure-klientorganisations-ID:t för den prenumeration som Key Vault tillhör
Ange identitet för åtkomst till Azure Key Vault
För närvarande kan CSI-drivrutinen för Secrets Store i Arc-aktiverade kluster nås via ett huvudnamn för tjänsten. Följ de här stegen för att ange en identitet som kan komma åt ditt Key Vault.
Följ stegen för att skapa ett huvudnamn för tjänsten i Azure. Anteckna klient-ID och klienthemlighet som genererades i det här steget.
Se sedan till att Azure Key Vault har GET-behörighet till det skapade tjänstens huvudnamn.
Använd klient-ID och klienthemlighet från det första steget för att skapa en Kubernetes-hemlighet i det anslutna klustret:
kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
Märk den skapade hemligheten:
kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
Skapa en
SecretProviderClass
med följande YAML och fyll i dina värden för nyckelvalvets namn, klient-ID och objekt som ska hämtas från din AKV-instans:# 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
För användning med nationella moln ändrar du
cloudName
tillAzureUSGovernmentCloud
för Azure Government eller tillAzureChinaCloud
för Microsoft Azure som drivs av 21Vianet.Tillämpa SecretProviderClass på klustret:
kubectl apply -f secretproviderclass.yaml
Skapa en podd med följande YAML och fyll i namnet på din identitet:
# 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
Tillämpa podden på klustret:
kubectl apply -f pod.yaml
Verifiera hemligheterna
När podden har startats är det monterade innehållet på den volymsökväg som anges i din distributions-YAML tillgängligt.
## 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
Ytterligare konfigurationsalternativ
Azure Key Vault Secrets Provider-tillägget stöder Helm-diagramkonfigurationer.
Följande konfigurationsinställningar används ofta med Azure Key Vault Secrets Provider-tillägget:
Konfigurationsinställning | Standardvärde | beskrivning |
---|---|---|
enableSecretRotation | falskt | Boolesk typ. Om true uppdaterar med jämna mellanrum poddmonteringen och Kubernetes Secret med det senaste innehållet från det externa hemlighetsarkivet |
rotationPollInterval | 2 m | Om enableSecretRotation är true anger den här inställningen varaktigheten för hemlig rotationsmätningsintervall. Den här varaktigheten kan justeras baserat på hur ofta det monterade innehållet för alla poddar och Kubernetes-hemligheter måste synkroniseras om till det senaste. |
syncSecret.enabled | falskt | Booleska indata. I vissa fall kanske du vill skapa en Kubernetes-hemlighet för att spegla det monterade innehållet. Om true tillåter SecretProviderClass tillåter fältet secretObjects att definiera önskat tillstånd för de synkroniserade Kubernetes Secret-objekten. |
De här inställningarna kan anges när tillägget installeras med hjälp az k8s-extension create
av kommandot :
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
Du kan också ändra de här inställningarna efter installationen med hjälp az k8s-extension update
av kommandot :
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
Du kan använda andra konfigurationsinställningar efter behov för distributionen. Om du till exempel vill ändra kubelet-rotkatalogen när du skapar ett kluster ändrar du az k8s-extension create
kommandot:
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
Avinstallera azure Key Vault Secrets Provider-tillägget
Om du vill avinstallera tillägget kör du följande kommando:
az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider
Kommentar
Om du avinstallerar tillägget tas inte de anpassade resursdefinitionerna (CRD) bort som skapades när tillägget installerades.
Kontrollera att tilläggsinstansen har tagits bort genom att köra följande kommando:
az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Om tillägget har tagits bort visas inte azure Key Vault Secrets Provider-tillägget i utdata. Om du inte har några andra tillägg installerade i klustret visas en tom matris.
Om du inte längre behöver den måste du ta bort Kubernetes-hemligheten som är associerad med tjänstens huvudnamn genom att köra följande kommando:
kubectl delete secret secrets-store-creds
Avstämning och felsökning
Azure Key Vault Secrets Provider-tillägget är självåterställning. Om någon försöker ändra eller ta bort en tilläggskomponent som distribuerades när tillägget installerades stämmas komponenten av till dess ursprungliga tillstånd. De enda undantagen gäller anpassade resursdefinitioner (CRD). Om CRD:er tas bort kommer de inte att stämmas av. Om du vill återställa borttagna CRD:er använder du az k8s-extension create
kommandot igen med det befintliga tilläggets instansnamn.
Mer information om hur du löser vanliga problem finns i felsökningsguiderna för öppen källkod för Azure Key Vault-providern för Secrets Store CSI-drivrutinen och CSI-drivrutinen för Secrets Store.
Nästa steg
- Vill du prova saker? Kom igång snabbt med en Azure Arc Jumpstart-scenario med kluster-API.
- Läs mer om Azure Key Vault.