Użyj rozszerzenia dostawcy wpisów tajnych usługi Azure Key Vault, aby pobrać wpisy tajne do klastrów Kubernetes z obsługą usługi Azure Arc

Dostawca usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych umożliwia integrację usługi Azure Key Vault jako magazynu wpisów tajnych z klastrem Kubernetes za pośrednictwem woluminu CSI. W przypadku klastrów Kubernetes z włączoną usługą Azure Arc można zainstalować rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault w celu pobrania wpisów tajnych.

Możliwości rozszerzenia dostawcy wpisów tajnych usługi Azure Key Vault obejmują:

  • Instaluje wpisy tajne/klucze/certyfikaty do zasobnika przy użyciu woluminu wbudowanego CSI
  • Obsługuje przenośność zasobnika za pomocą klasy SecretProviderClass CRD
  • Obsługuje kontenery systemów Linux i Windows
  • Obsługuje synchronizację z wpisami tajnymi platformy Kubernetes
  • Obsługuje automatyczne obracanie wpisów tajnych
  • Składniki rozszerzenia są wdrażane w strefach dostępności, dzięki czemu są strefowo nadmiarowe

Wymagania wstępne

  • Klaster z obsługiwaną dystrybucją Kubernetes, która została już połączona z usługą Azure Arc. Następujące dystrybucje kubernetes są obecnie obsługiwane w tym scenariuszu:
    • Interfejs API klastra platformy Azure
    • Klastry usługi Azure Kubernetes Service (AKS) w usłudze Azure Stack HCI
    • Usługa AKS włączona przez usługę Azure Arc
    • Aparat Google Kubernetes
    • Dystrybucja rozwiązania OpenShift Kubernetes
    • Dystrybucja rozwiązania Canonical Kubernetes
    • Elastic Kubernetes Service
    • Tanzu Kubernetes Grid
    • Azure Red Hat OpenShift
  • Upewnij się, że zostały spełnione ogólne wymagania wstępne dotyczące rozszerzeń klastra. Musisz użyć wersji 0.4.0 lub nowszej rozszerzenia interfejsu wiersza polecenia platformy k8s-extension Azure.

Instalowanie rozszerzenia dostawcy wpisów tajnych usługi Azure Key Vault w klastrze Kubernetes z obsługą usługi Arc

Rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault można zainstalować w połączonym klastrze w witrynie Azure Portal przy użyciu interfejsu wiersza polecenia platformy Azure lub przez wdrożenie szablonu usługi ARM.

W każdym klastrze Kubernetes z obsługą usługi Azure Arc można wdrożyć tylko jedno wystąpienie rozszerzenia.

Napiwek

Jeśli klaster znajduje się za serwerem proxy ruchu wychodzącego, przed zainstalowaniem rozszerzenia upewnij się, że połączysz go z usługą Azure Arc przy użyciu opcji konfiguracji serwera proxy.

Azure Portal

  1. W witrynie Azure Portal przejdź do pozycji Kubernetes — Azure Arc i wybierz klaster.

  2. Wybierz pozycję Rozszerzenia (w obszarze Ustawienia), a następnie wybierz pozycję + Dodaj.

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

  3. Z listy dostępnych rozszerzeń wybierz pozycję Dostawca wpisów tajnych usługi Azure Key Vault, aby wdrożyć najnowszą wersję rozszerzenia.

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

  4. Postępuj zgodnie z monitami, aby wdrożyć rozszerzenie. W razie potrzeby dostosuj instalację, zmieniając opcje domyślne na karcie Konfiguracja .

Interfejs wiersza polecenia platformy Azure

  1. Ustaw zmienne środowiskowe:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Zainstaluj sterownik CSI magazynu wpisów tajnych i rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault, uruchamiając następujące polecenie:

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

Powinny zostać wyświetlone dane wyjściowe podobne do tego przykładu. Może upłynąć kilka minut, zanim pakiet Helm dostawcy wpisów tajnych zostanie wdrożony w klastrze.

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

Szablon ARM

  1. Utwórz plik .json przy użyciu następującego formatu. Pamiętaj, aby zaktualizować wartość nazwy> klastra<, aby odwoływać się do klastra.

    {
        "$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. Teraz ustaw zmienne środowiskowe przy użyciu następującego polecenia interfejsu wiersza polecenia platformy Azure:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Na koniec uruchom to polecenie interfejsu wiersza polecenia platformy Azure, aby zainstalować rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault:

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

Teraz powinno być możliwe wyświetlenie zasobów dostawcy wpisów tajnych i użycie rozszerzenia w klastrze.

Weryfikowanie instalacji rozszerzenia

Aby potwierdzić pomyślną instalację rozszerzenia dostawcy wpisów tajnych usługi Azure Key Vault, uruchom następujące polecenie.

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

Powinny zostać wyświetlone dane wyjściowe podobne do tego przykładu.

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

Tworzenie lub wybieranie usługi Azure Key Vault

Następnie określ usługę Azure Key Vault do użycia z połączonym klastrem. Jeśli jeszcze go nie masz, utwórz nową usługę Key Vault przy użyciu następujących poleceń. Należy pamiętać, że nazwa magazynu kluczy musi być globalnie unikatowa.

Ustaw następujące zmienne środowiskowe:

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

Następnie uruchom następujące polecenie:

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

Usługa Azure Key Vault może przechowywać klucze, wpisy tajne i certyfikaty. W tym przykładzie można ustawić wpis tajny w postaci zwykłego tekstu o nazwie DemoSecret przy użyciu następującego polecenia:

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

Przed przejściem do następnej sekcji zanotuj następujące właściwości:

  • Nazwa obiektu wpisu tajnego w usłudze Key Vault
  • Typ obiektu (wpis tajny, klucz lub certyfikat)
  • Nazwa zasobu usługi Key Vault
  • Identyfikator dzierżawy platformy Azure dla subskrypcji, do której należy usługa Key Vault

Zapewnianie tożsamości w celu uzyskania dostępu do usługi Azure Key Vault

Obecnie sterownik CSI magazynu wpisów tajnych w klastrach z obsługą usługi Arc można uzyskać dostęp za pośrednictwem jednostki usługi. Wykonaj następujące kroki, aby zapewnić tożsamość, która może uzyskać dostęp do usługi Key Vault.

  1. Wykonaj kroki , aby utworzyć jednostkę usługi na platformie Azure. Zanotuj identyfikator klienta i klucz tajny klienta wygenerowany w tym kroku.

  2. Następnie upewnij się, że usługa Azure Key Vault ma uprawnienie GET do utworzonej jednostki usługi.

  3. Użyj identyfikatora klienta i wpisu tajnego klienta w pierwszym kroku, aby utworzyć wpis tajny Kubernetes w połączonym klastrze:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. Etykieta utworzonego wpisu tajnego:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. Utwórz element SecretProviderClass z następującym kodem YAML, wypełniając wartości dla nazwy magazynu kluczy, identyfikatora dzierżawy i obiektów do pobrania z wystąpienia usługi 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
    

    Aby korzystać z chmur krajowych, zmień wartość cloudNameAzureUSGovernmentCloud na dla platformy Azure Government lub AzureChinaCloud na platformę Microsoft Azure obsługiwaną przez firmę 21Vianet.

  6. Zastosuj klasę SecretProviderClass do klastra:

    kubectl apply -f secretproviderclass.yaml
    
  7. Utwórz zasobnik przy użyciu następującego kodu YAML, wypełniając nazwę tożsamości:

    # 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. Zastosuj zasobnik do klastra:

    kubectl apply -f pod.yaml
    

Weryfikowanie wpisów tajnych

Po uruchomieniu zasobnika jest dostępna instalowana zawartość na ścieżce woluminu określonej w wdrożeniu YAML.

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

Dodatkowe opcje konfiguracji

Rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault obsługuje konfiguracje pakietu Helm.

Następujące ustawienia konfiguracji są często używane z rozszerzeniem dostawcy wpisów tajnych usługi Azure Key Vault:

Ustawienie konfiguracji Domyślny opis
enableSecretRotation fałsz Typ logiczny. Jeśli trueprogram okresowo aktualizuje zasobnik i wpis tajny Kubernetes przy użyciu najnowszej zawartości z zewnętrznego magazynu wpisów tajnych
rotationPollInterval 2 m Jeśli enableSecretRotation ma truewartość , to ustawienie określa czas trwania interwału sondowania rotacji wpisów tajnych. Ten czas trwania można dostosować na podstawie częstotliwości instalacji zawartości dla wszystkich zasobników i wpisów tajnych kubernetes należy ponownie zsynchronizować z najnowszą wersją.
syncSecret.enabled fałsz Dane wejściowe wartości logicznej. W niektórych przypadkach możesz utworzyć wpis tajny Kubernetes w celu dublowania zainstalowanej zawartości. Jeśli truepole SecretProviderClass umożliwia secretObjects zdefiniowanie żądanego stanu zsynchronizowanych obiektów wpisu tajnego Kubernetes.

Te ustawienia można określić, gdy rozszerzenie jest zainstalowane za pomocą az k8s-extension create polecenia :

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

Te ustawienia można również zmienić po instalacji za pomocą az k8s-extension update polecenia :

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

Możesz użyć innych ustawień konfiguracji zgodnie z potrzebami wdrożenia. Aby na przykład zmienić katalog główny kubelet podczas tworzenia klastra, zmodyfikuj az k8s-extension create polecenie:

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

Odinstalowywanie rozszerzenia dostawcy wpisów tajnych usługi Azure Key Vault

Aby odinstalować rozszerzenie, uruchom następujące polecenie:

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

Uwaga

Odinstalowanie rozszerzenia nie powoduje usunięcia niestandardowych definicji zasobów (CRD), które zostały utworzone podczas instalowania rozszerzenia.

Aby potwierdzić, że wystąpienie rozszerzenia zostało usunięte, uruchom następujące polecenie:

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

Jeśli rozszerzenie zostało pomyślnie usunięte, nie będzie widoczne rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault wymienione w danych wyjściowych. Jeśli nie masz żadnych innych rozszerzeń zainstalowanych w klastrze, zobaczysz pustą tablicę.

Jeśli nie jest już potrzebny, pamiętaj o usunięciu wpisu tajnego kubernetes skojarzonego z jednostką usługi, uruchamiając następujące polecenie:

kubectl delete secret secrets-store-creds

Uzgadnianie i rozwiązywanie problemów

Rozszerzenie dostawcy wpisów tajnych usługi Azure Key Vault jest samonaprawianie. Jeśli ktoś spróbuje zmienić lub usunąć składnik rozszerzenia, który został wdrożony podczas instalacji rozszerzenia, ten składnik jest uzgadniany z jego oryginalnym stanem. Jedynymi wyjątkami są niestandardowe definicje zasobów (CRD). Jeśli identyfikatory CRD zostaną usunięte, nie zostaną one uzgodnione. Aby przywrócić usunięte identyfikatory CRD, ponownie użyj az k8s-extension create polecenia z istniejącą nazwą wystąpienia rozszerzenia.

Aby uzyskać więcej informacji na temat rozwiązywania typowych problemów, zobacz przewodniki rozwiązywania problemów typu open source dla dostawcy usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych i sterownika CSI magazynu wpisów tajnych.

Następne kroki