Share via


Titkos kulcsok lekérése az Azure Arc-kompatibilis Kubernetes-fürtökbe az Azure Key Vault Titkos kódok szolgáltató bővítményével

Az Azure Key Vault titkos kulcstároló-szolgáltatójának CSI-illesztőprogramja lehetővé teszi az Azure Key Vault titkos kulcstárként való integrálását egy Kubernetes-fürttel egy CSI-köteten keresztül. Az Azure Arc-kompatibilis Kubernetes-fürtök esetében az Azure Key Vault titkos kulcsszolgáltató bővítményét is telepítheti a titkos kódok lekéréséhez.

Az Azure Key Vault titkos kódok szolgáltatói bővítményének képességei a következők:

  • Titkos kulcsok/kulcsok/tanúsítványok csatlakoztatása podhoz a CSI beágyazott kötet használatával
  • Támogatja a pod hordozhatóságát a SecretProviderClass CRD-vel
  • Linux- és Windows-tárolók támogatása
  • Támogatja a Kubernetes Titkos kulcsokkal való szinkronizálást
  • Támogatja a titkos kódok automatikus elforgatását
  • A bővítményösszetevők a rendelkezésre állási zónákban vannak üzembe helyezve, így zónaredundánssá válnak

Előfeltételek

  • Az Azure Archoz már csatlakoztatott, támogatott Kubernetes-disztribúcióval rendelkező fürt. Ebben a forgatókönyvben jelenleg a következő Kubernetes-disztribúciók támogatottak:
    • Fürt API Azure
    • Azure Kubernetes Service- (AKS-) fürtök az Azure Stack HCI-n
    • Az Azure Arc által engedélyezett AKS
    • Google Kubernetes Engine
    • OpenShift Kubernetes-disztribúció
    • Canonical Kubernetes Distribution
    • Rugalmas Kubernetes-szolgáltatás
    • Tanzu Kubernetes Grid
    • Azure Red Hat OpenShift
  • Győződjön meg arról, hogy megfelelt a fürtbővítmények általános előfeltételeinek. Az Azure CLI-bővítmény 0.4.0-s vagy újabb verzióját kell használnia k8s-extension .

Az Azure Key Vault titkos kulcsszolgáltatói bővítményének telepítése Arc-kompatibilis Kubernetes-fürtön

Az Azure Key Vault titkos kódszolgáltató bővítményét az Azure Portalon, az Azure CLI használatával vagy arm-sablon üzembe helyezésével telepítheti a csatlakoztatott fürtre.

A bővítménynek csak egy példánya telepíthető minden Azure Arc-kompatibilis Kubernetes-fürtön.

Tipp.

Ha a fürt egy kimenő proxykiszolgáló mögött található, a bővítmény telepítése előtt győződjön meg arról, hogy a proxykonfigurációs beállítással csatlakozik az Azure Archoz.

Azure Portalra

  1. Az Azure Portalon lépjen a Kubernetes – Azure Arc webhelyre, és válassza ki a fürtöt.

  2. Válassza a Bővítmények lehetőséget (a Gépház alatt), majd a + Hozzáadás lehetőséget.

    Screenshot showing the Extensions page for an Arc-enabled Kubernetes cluster in the Azure portal.

  3. Az elérhető bővítmények listájában válassza az Azure Key Vault titkos kulcsszolgáltatóját a bővítmény legújabb verziójának üzembe helyezéséhez.

    Screenshot of the Azure Key Vault Secrets Provider extension in the Azure portal.

  4. Kövesse az utasításokat a bővítmény üzembe helyezéséhez. Szükség esetén testre szabhatja a telepítést a Konfiguráció lap alapértelmezett beállításainak módosításával.

Azure CLI

  1. A környezeti változók beállítása:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Telepítse a Titkos kulcstár CSI-illesztőprogramot és az Azure Key Vault titkos kulcsszolgáltatói bővítményét az alábbi parancs futtatásával:

    az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider
    

A példához hasonló kimenetnek kell megjelennie. Eltarthat néhány percig, amíg a titkos kulcsszolgáltató Helm-diagramja üzembe lesz helyezve a fürtön.

{
  "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-sablon

  1. Hozzon létre egy .json fájlt a következő formátumban. Ügyeljen arra, hogy frissítse a <fürtnév> értékét, hogy a fürtre hivatkozzon.

    {
        "$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. Most állítsa be a környezeti változókat az alábbi Azure CLI-paranccsal:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Végül futtassa ezt az Azure CLI-parancsot az Azure Key Vault titkos kulcsszolgáltató bővítményének telepítéséhez:

    az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME
    

Most már megtekintheti a titkos kódszolgáltató erőforrásait, és használhatja a bővítményt a fürtben.

A bővítmény telepítésének ellenőrzése

Az Azure Key Vault Titkos kulcstár-szolgáltató bővítmény sikeres telepítésének megerősítéséhez futtassa a következő parancsot.

az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider

A példához hasonló kimenetnek kell megjelennie.

{
  "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"
}

Azure Key Vault létrehozása vagy kiválasztása

Ezután adja meg a csatlakoztatott fürthöz használni kívánt Azure Key Vaultot. Ha még nincs ilyenje, hozzon létre egy új Key Vaultot az alábbi parancsokkal. Ne feledje, hogy a kulcstartó nevének globálisan egyedinek kell lennie.

Állítsa be a következő környezeti változókat:

export AKV_RESOURCE_GROUP=<resource-group-name>
export AZUREKEYVAULT_NAME=<AKV-name>
export AZUREKEYVAULT_LOCATION=<AKV-location>

Ezután futtassa a következő parancsot:

az keyvault create -n $AZUREKEYVAULT_NAME -g $AKV_RESOURCE_GROUP -l $AZUREKEYVAULT_LOCATION

Az Azure Key Vault képes kulcsokat, titkos kulcsokat és tanúsítványokat tárolni. Ebben a példában a következő paranccsal állíthat be egyszerű szöveges titkos kódokat DemoSecret :

az keyvault secret set --vault-name $AZUREKEYVAULT_NAME -n DemoSecret --value MyExampleSecret

Mielőtt továbblép a következő szakaszra, jegyezze fel a következő tulajdonságokat:

  • A Key Vault titkos objektumának neve
  • Objektum típusa (titkos kód, kulcs vagy tanúsítvány)
  • A Key Vault-erőforrás neve
  • Annak az előfizetésnek az Azure-bérlőazonosítója, amelyhez a Key Vault tartozik

Identitás biztosítása az Azure Key Vault eléréséhez

Jelenleg az Arc-kompatibilis fürtök Titkos kulcstár CSI-illesztőprogramja egy szolgáltatásnéven keresztül érhető el. Az alábbi lépéseket követve adjon meg egy identitást, amely hozzáfér a Key Vaulthoz.

  1. Kövesse az azure-beli szolgáltatásnév létrehozásához szükséges lépéseket. Jegyezze fel az ebben a lépésben létrehozott ügyfél-azonosítót és ügyféltitkot.

  2. Ezután győződjön meg arról, hogy az Azure Key Vault rendelkezik GET engedéllyel a létrehozott szolgáltatásnévhez.

  3. Az első lépésben az ügyfélazonosítót és az ügyfélkulcsot használva hozzon létre egy Kubernetes-titkos kulcsot a csatlakoztatott fürtön:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. A létrehozott titkos kód címkézése:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. Hozzon létre egy SecretProviderClass következő YAML-t, és töltse ki a kulcstartó nevét, a bérlőazonosítót és az AKV-példányból lekérendő objektumokat:

    # 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
    

    A nemzeti felhőkkel való használathoz váltson cloudName az AzureUSGovernmentCloud Azure Governmentre vagy a 21Vianet által üzemeltetett Microsoft Azure-ra AzureChinaCloud .

  6. A SecretProviderClass alkalmazása a fürtre:

    kubectl apply -f secretproviderclass.yaml
    
  7. Hozzon létre egy podot az alábbi YAML-lel, és adja meg az identitás nevét:

    # 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. A pod alkalmazása a fürtre:

    kubectl apply -f pod.yaml
    

A titkos kódok ellenőrzése

A pod elindítása után a csatlakoztatott tartalom az üzembe helyezési YAML-ben megadott kötetútvonalon érhető el.

## 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

További konfigurációs beállítások

Az Azure Key Vault titkos kulcsszolgáltató bővítménye támogatja a Helm-diagramkonfigurációkat.

Az Azure Key Vault titkos kulcsszolgáltató bővítménye gyakran használja az alábbi konfigurációs beállításokat:

Konfigurációs beállítás Alapértelmezett Leírás
enableSecretRotation false Logikai típus. Ha true, rendszeresen frissíti a pod csatlakoztatását és a Kubernetes Secretet a külső titkos kódok tárolójának legújabb tartalmával
rotationPollInterval 2 m Ha enableSecretRotation igen true, ez a beállítás határozza meg a titkos kulcs rotálásának lekérdezési időközét. Ez az időtartam attól függően módosítható, hogy milyen gyakran kell újraszinkronizálni az összes pod és Kubernetes titkos kulcs csatlakoztatott tartalmát a legújabbra.
syncSecret.enabled false Logikai bemenet. Bizonyos esetekben érdemes lehet létrehozni egy Kubernetes-titkos kulcsot a csatlakoztatott tartalom tükrözéséhez. Ha true, SecretProviderClass a secretObjects mező lehetővé teszi a szinkronizált Kubernetes Titkos objektumok kívánt állapotának meghatározását.

Ezek a beállítások a bővítmény telepítésekor az k8s-extension create a következő paranccsal adhatók meg:

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

Ezeket a beállításokat a telepítés után a következő paranccsal is módosíthatja 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

Az üzembe helyezéshez szükség szerint más konfigurációs beállításokat is használhat. Ha például módosítani szeretné a kubelet gyökérkönyvtárát fürt létrehozásakor, módosítsa a az k8s-extension create következő parancsot:

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

Az Azure Key Vault titkos kulcstár-szolgáltatói bővítményének eltávolítása

A bővítmény eltávolításához futtassa a következő parancsot:

az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider

Feljegyzés

A bővítmény eltávolítása nem törli a bővítmény telepítésekor létrehozott egyéni erőforrás-definíciókat (CRD-ket).

A bővítménypéldány törlésének ellenőrzéséhez futtassa a következő parancsot:

az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Ha a bővítményt sikeresen eltávolították, a kimenetben nem jelenik meg az Azure Key Vault titkos kulcsszolgáltató bővítménye. Ha nincs más bővítmény telepítve a fürtön, egy üres tömb jelenik meg.

Ha már nincs rá szüksége, törölje a szolgáltatásnévhez társított Kubernetes-titkos kódot az alábbi parancs futtatásával:

kubectl delete secret secrets-store-creds

Egyeztetés és hibaelhárítás

Az Azure Key Vault titkos kódok szolgáltatójának bővítménye öngyógyító. Ha valaki megpróbál módosítani vagy törölni egy bővítményösszetevőt, amely a bővítmény telepítésekor lett üzembe helyezve, a rendszer egyezteti az összetevőt az eredeti állapotával. Az egyetlen kivétel az egyéni erőforrás-definíciók (CRD-k) esetében van. Ha a CRD-k törlődnek, azok nem lesznek egyeztetve. A törölt CRD-k visszaállításához használja újra a az k8s-extension create parancsot a meglévő bővítménypéldány nevével.

A gyakori problémák megoldásával kapcsolatos további információkért tekintse meg az nyílt forráskód Azure Key Vault-szolgáltató hibaelhárítási útmutatóit a Secrets Store CSI-illesztőprogramhoz és a Titkos kulcstár CSI-illesztőprogramhoz.

Következő lépések