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
Napiwek
Jeśli dostęp w trybie offline jest konieczny lub jeśli potrzebujesz wpisów tajnych zsynchronizowanych z magazynem wpisów tajnych Kubernetes, użyj rozszerzenia Magazynu wpisów tajnych do zarządzania wpisami tajnymi w klastrach Kubernetes z włączoną usługą Arc.
Wymagania wstępne
- Klaster z obsługiwaną dystrybucją Kubernetes połączoną 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
- Łączność wychodząca z następującymi punktami końcowymi:
linuxgeneva-microsoft.azurecr.io
upstreamarc.azurecr.io
*.blob.core.windows.net
- 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
W witrynie Azure Portal przejdź do pozycji Kubernetes — Azure Arc i wybierz klaster.
Wybierz pozycję Rozszerzenia (w obszarze Ustawienia), a następnie wybierz pozycję + Dodaj.
Z listy dostępnych rozszerzeń wybierz pozycję Dostawca wpisów tajnych usługi Azure Key Vault, aby wdrożyć najnowszą wersję rozszerzenia.
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
Ustaw zmienne środowiskowe:
export CLUSTER_NAME=<arc-cluster-name> export RESOURCE_GROUP=<resource-group-name>
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
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'))]" } ] }
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>
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.
Wykonaj kroki , aby utworzyć jednostkę usługi na platformie Azure. Zanotuj identyfikator klienta i klucz tajny klienta wygenerowany w tym kroku.
Następnie upewnij się, że usługa Azure Key Vault ma uprawnienie GET do utworzonej jednostki usługi.
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>"
Etykieta utworzonego wpisu tajnego:
kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
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ść
cloudName
AzureUSGovernmentCloud
na dla platformy Azure Government lubAzureChinaCloud
na platformę Microsoft Azure obsługiwaną przez firmę 21Vianet.Zastosuj klasę SecretProviderClass do klastra:
kubectl apply -f secretproviderclass.yaml
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
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 true program 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 true wartość , 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 true pole 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
- Chcesz wypróbować coś? Szybko rozpocznij pracę ze scenariuszem szybkiego startu usługi Azure Arc przy użyciu interfejsu API klastra.
- Dowiedz się więcej o usłudze Azure Key Vault.