Dela via


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

Förutsättningar

  • Ett kluster med en Kubernetes-distribution som stöds och som redan har anslutits 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-portalen, 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

  1. I Azure-portalen går du till Kubernetes – Azure Arc och väljer ditt kluster.

  2. Välj Tillägg (under Inställningar) och välj sedan + Lägg till.

    Skärmbild som visar fönstret Tillägg för ett Arc-aktiverat Kubernetes-kluster i Azure-portalen.

  3. 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.

    Skärmbild som visar tillägget Azure Key Vault Secrets Provider i Azure-portalen.

  4. 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

  1. Ange miljövariablerna:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. 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

  1. 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'))]"
            }
        ]
    }
    
  2. 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>
    
  3. 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.

  1. 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.

  2. Se sedan till att Azure Key Vault har GET-behörighet till det skapade tjänstens huvudnamn.

  3. 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>"
    
  4. Märk den skapade hemligheten:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. 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 till AzureUSGovernmentCloud för Azure Government eller till AzureChinaCloud för Microsoft Azure som drivs av 21Vianet.

  6. Tillämpa SecretProviderClass på klustret:

    kubectl apply -f secretproviderclass.yaml
    
  7. 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
    
  8. 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 trueuppdaterar med jämna mellanrum poddmonteringen och Kubernetes Secret med det senaste innehållet från det externa hemlighetsarkivet
rotationPollInterval 2 m Om enableSecretRotation är trueanger 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 truetillå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