Sdílet prostřednictvím


Použití rozšíření zprostředkovatele tajných kódů služby Azure Key Vault k načtení tajných kódů do clusterů Kubernetes s podporou Azure Arc

Zprostředkovatel služby Azure Key Vault pro ovladač CSI úložiště tajných kódů umožňuje integraci služby Azure Key Vault jako úložiště tajných kódů s clusterem Kubernetes prostřednictvím svazku CSI. Pro clustery Kubernetes s podporou Služby Azure Arc můžete nainstalovat rozšíření zprostředkovatele tajných kódů služby Azure Key Vault a načíst tajné kódy.

Mezi možnosti rozšíření zprostředkovatele tajných kódů služby Azure Key Vault patří:

  • Připojí tajné kódy, klíče nebo certifikáty k podu pomocí vloženého svazku CSI.
  • Podporuje přenositelnost podů pomocí Třídy SecretProviderClass CRD.
  • Podporuje kontejnery Linuxu a Windows.
  • Podporuje synchronizaci s tajnými kódy Kubernetes.
  • Podporuje automatickou obměnu tajných kódů.
  • Komponenty rozšíření se nasazují do zón dostupnosti, takže jsou zónově redundantní.

Požadavky

  • Cluster s podporovanou distribucí Kubernetes, která už je připojená ke službě Azure Arc. Pro tento scénář se v současné době podporují následující distribuce Kubernetes:
    • Rozhraní API clusteru Azure
    • Clustery Azure Kubernetes Service (AKS) v Azure Stack HCI
    • Služba AKS povolená službou Azure Arc
    • Google Kubernetes Engine
    • Distribuce OpenShift Kubernetes
    • Canonical Kubernetes Distribution
    • Elastic Kubernetes Service
    • Tanzu Kubernetes Grid
    • Azure Red Hat OpenShift
  • Odchozí připojení k následujícím koncovým bodům:
    • linuxgeneva-microsoft.azurecr.io
    • upstreamarc.azurecr.io
    • *.blob.core.windows.net
  • Ujistěte se, že jste splnili obecné požadavky pro rozšíření clusteru. Musíte použít verzi 0.4.0 nebo novější rozšíření k8s-extension Azure CLI.

Instalace rozšíření zprostředkovatele tajných kódů služby Azure Key Vault v clusteru Kubernetes s podporou Arc

Rozšíření zprostředkovatele tajných kódů služby Azure Key Vault můžete nainstalovat na připojený cluster na webu Azure Portal, pomocí Azure CLI nebo nasazením šablony ARM.

V každém clusteru Kubernetes s podporou Azure Arc je možné nasadit pouze jednu instanci rozšíření.

Tip

Pokud je cluster za odchozím proxy serverem, před instalací rozšíření se ujistěte, že ho připojíte ke službě Azure Arc pomocí možnosti konfigurace proxy serveru.

portál Azure

  1. Na webu Azure Portal přejděte na Kubernetes – Azure Arc a vyberte cluster.

  2. Vyberte Rozšíření (v části Nastavení) a pak vyberte + Přidat.

    Snímek obrazovky s podoknem Rozšíření pro cluster Kubernetes s podporou arc na webu Azure Portal

  3. V seznamu dostupných rozšíření vyberte zprostředkovatele tajných kódů služby Azure Key Vault a nasaďte nejnovější verzi rozšíření.

    Snímek obrazovky znázorňující rozšíření zprostředkovatele tajných kódů služby Azure Key Vault na webu Azure Portal

  4. Postupujte podle pokynů k nasazení rozšíření. V případě potřeby upravte instalaci změnou výchozích možností na kartě Konfigurace .

Azure CLI

  1. Nastavte proměnné prostředí:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Spuštěním následujícího příkazu nainstalujte ovladač CSI úložiště tajných kódů a rozšíření zprostředkovatele tajných kódů služby Azure Key Vault:

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

Měl by se zobrazit výstup podobný tomuto příkladu. Než se chart Helm zprostředkovatele tajných kódů nasadí do clusteru, může to trvat několik minut.

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

Šablona ARM

  1. Vytvořte soubor .json pomocí následujícího formátu. Nezapomeňte aktualizovat hodnotu názvu> clusteru <tak, aby odkazovat na váš 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'))]"
            }
        ]
    }
    
  2. Teď nastavte proměnné prostředí pomocí následujícího příkazu Azure CLI:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Nakonec spuštěním tohoto příkazu Azure CLI nainstalujte rozšíření zprostředkovatele tajných kódů služby Azure Key Vault:

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

Teď byste měli být schopni zobrazit prostředky zprostředkovatele tajných kódů a použít rozšíření ve vašem clusteru.

Ověření instalace rozšíření

Pokud chcete potvrdit úspěšnou instalaci rozšíření zprostředkovatele tajných kódů služby Azure Key Vault, spusťte následující příkaz.

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

Měl by se zobrazit výstup podobný tomuto příkladu.

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

Vytvoření nebo výběr služby Azure Key Vault

Dále zadejte službu Azure Key Vault, která se má použít s připojeným clusterem. Pokud ho ještě nemáte, vytvořte novou službu Key Vault pomocí následujících příkazů. Mějte na paměti, že název trezoru klíčů musí být globálně jedinečný.

Nastavte následující proměnné prostředí:

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

Potom spusťte následující příkaz:

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

Azure Key Vault může ukládat klíče, tajné kódy a certifikáty. V tomto příkladu můžete nastavit tajný kód prostého textu volaný DemoSecret pomocí následujícího příkazu:

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

Než přejdete k další části, poznamenejte si následující vlastnosti:

  • Název tajného objektu ve službě Key Vault
  • Typ objektu (tajný klíč, klíč nebo certifikát)
  • Název prostředku služby Key Vault
  • ID tenanta Azure pro předplatné, ke kterému služba Key Vault patří

Poskytnutí identity pro přístup ke službě Azure Key Vault

Ovladač CSI úložiště tajných kódů v clusterech s podporou arc je v současné době přístupný prostřednictvím instančního objektu. Podle těchto kroků zadejte identitu, která má přístup ke službě Key Vault.

  1. Podle pokynů vytvořte instanční objekt v Azure. Poznamenejte si ID klienta a tajný klíč klienta vygenerovaný v tomto kroku.

  2. Dále se ujistěte, že azure Key Vault má oprávnění GET k vytvořenému instančnímu objektu.

  3. Pomocí ID klienta a tajného klíče klienta z prvního kroku vytvořte tajný klíč Kubernetes v připojeném clusteru:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. Označení vytvořeného tajného kódu:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. Vytvořte SecretProviderClass následující YAML a vyplňte hodnoty pro název trezoru klíčů, ID tenanta a objekty, které se mají načíst z 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
    

    Pro použití s národními cloudy přejděte cloudName na AzureUSGovernmentCloud Azure Government nebo na AzureChinaCloud Microsoft Azure provozovanou společností 21Vianet.

  6. Použijte secretProviderClass pro váš cluster:

    kubectl apply -f secretproviderclass.yaml
    
  7. Vytvořte pod s následujícím YAML a vyplňte název vaší identity:

    # 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. Použití podu v clusteru:

    kubectl apply -f pod.yaml
    

Ověření tajných kódů

Po spuštění podu je k dispozici připojený obsah v cestě svazku zadané v YAML nasazení.

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

Další možnosti konfigurace

Rozšíření zprostředkovatele tajných kódů služby Azure Key Vault podporuje konfigurace chartů Helm.

Následující nastavení konfigurace se často používají s rozšířením zprostředkovatele tajných kódů služby Azure Key Vault:

Nastavení konfigurace Výchozí Popis
enableSecretRotation false (nepravda) Logický typ. Pokud true, pravidelně aktualizuje pod mount a Kubernetes Secret s nejnovějším obsahem z externího úložiště tajných kódů.
rotationPollInterval 2 m Pokud enableSecretRotation ano true, toto nastavení určuje dobu trvání intervalu hlasování o obměně tajných kódů. Tato doba trvání se dá upravit na základě toho, jak často se připojený obsah všech podů a tajných kódů Kubernetes musí znovu synchronizovat na nejnovější verzi.
syncSecret.enabled false (nepravda) Logický vstup. V některých případech můžete chtít vytvořit tajný kód Kubernetes pro zrcadlení připojeného obsahu. Pokud trueumožňuje SecretProviderClasssecretObjects poli definovat požadovaný stav synchronizovaných objektů tajných kódů Kubernetes.

Tato nastavení je možné zadat při instalaci rozšíření pomocí az k8s-extension create příkazu:

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

Tato nastavení můžete po instalaci také změnit pomocí az k8s-extension update příkazu:

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

Podle potřeby můžete pro nasazení použít další nastavení konfigurace. Pokud chcete například změnit kořenový adresář kubelet při vytváření clusteru, upravte az k8s-extension create příkaz:

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

Odinstalace rozšíření zprostředkovatele tajných kódů služby Azure Key Vault

Pokud chcete rozšíření odinstalovat, spusťte následující příkaz:

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

Poznámka:

Odinstalace rozšíření neodstraní definice vlastních prostředků (CRD), které byly vytvořeny při instalaci rozšíření.

Pokud chcete ověřit, že se instance rozšíření odstranila, spusťte následující příkaz:

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

Pokud se rozšíření úspěšně odebralo, ve výstupu se nezobrazí rozšíření zprostředkovatele tajných kódů služby Azure Key Vault. Pokud v clusteru nemáte nainstalovaná žádná další rozšíření, zobrazí se prázdné pole.

Pokud už ho nepotřebujete, nezapomeňte odstranit tajný kód Kubernetes přidružený k instančnímu objektu spuštěním následujícího příkazu:

kubectl delete secret secrets-store-creds

Odsouhlasení a řešení potíží

Rozšíření zprostředkovatele tajných kódů služby Azure Key Vault je samoopravené. Pokud se někdo pokusí změnit nebo odstranit komponentu rozšíření, která byla nasazena při instalaci rozšíření, bude tato komponenta odsouhlasována s původním stavem. Jediné výjimky jsou pro vlastní definice prostředků (CRD). Pokud dojde k odstranění identifikátorů CRD, nebudou odsouhlasené. Pokud chcete obnovit odstraněné identifikátory CRD, použijte az k8s-extension create příkaz znovu s názvem existující instance rozšíření.

Další informace o řešení běžných problémů najdete v průvodcích odstraňováním potíží s open source pro poskytovatele služby Azure Key Vault pro ovladač CSI úložiště tajných kódů a ovladač CSI úložiště tajných kódů.

Další kroky