Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure Key Vault-providern för CSI-drivrutinen (Secrets Store Container Storage Interface) möjliggör integrering av ett Azure Key Vault som ett hemligt arkiv med ett AKS-kluster (Azure Kubernetes Service) via en CSI-volym.
Funktioner
- Monterar hemligheter, nycklar och certifikat till en podd med hjälp av en CSI-volym.
- Stöder interna CSI-volymer.
- Stöder montering av flera secrets store-objekt som en enda volym.
- Stöder poddportabilitet med CRD
SecretProviderClass(Custom Resource Definition). - Stöder Windows-containrar.
- Synkroniserar med Kubernetes-hemligheter.
- Stöder autorotation av monterat innehåll och synkroniserade Kubernetes-hemligheter.
Begränsningar
- En container som använder en
ConfigMapellerSecretsom ensubPathvolymmontering får inte automatiska uppdateringar när hemligheten roteras, vilket är en Kubernetes-begränsning. För att ändringarna ska börja gälla måste programmet läsa in den ändrade filen igen genom att antingen söka efter ändringar i filsystemet eller genom att starta om podden. Mer information finns i Secrets Store CSI Driver: kända begränsningar. - Tillägget skapar en hanterad identitet med namnet
azurekeyvaultsecretsprovider-xxxxxi nodresursgruppen (MC_) och tilldelar den till vm-skalningsuppsättningen automatiskt. Du kan använda den här hanterade identiteten eller din egen hanterade identitet för att få åtkomst till nyckelvalvet. Det är inte möjligt att förhindra skapandet av identiteten.
Förutsättningar
- Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
- Kontrollera att din version av Azure CLI är 2.30.0 eller senare. Om det är en tidigare version installerar du den senaste versionen.
Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
Terraform som är version 1.6 eller senare.
Azure CLI installerat och loggat in. installera den senaste versionen.
Behörigheter för att skapa AKS och Key Vault resurser.
Ange din Azure-prenumeration i Azure CLI med följande kommando. Ersätt
<subscriptionId>med ditt prenumerations-ID.az account set --subscription <subscriptionId>
Nätverk
- Om du använder isolerade nätverkskluster rekommenderar vi att du konfigurerar en privat slutpunkt för åtkomst till Azure Key Vault.
- Om klustret har utgående typ
userDefinedRoutingoch använder en brandväggsenhet som kan styra utgående trafik baserat på domännamn, till exempel Azure Firewall, kontrollerar du att nödvändiga regler för utgående nätverk och FQDN tillåts. - Om du begränsar Ingress till klustret kontrollerar du att portarna 9808 och 8095 är öppna.
Roller
- I Azure CLI arbetsflöden används rollen Key Vault Secrets Officer för att ge ditt konto behörighet att skapa en hemlighet. Terraform-exemplet använder rollen Key Vault-administratör och ger tilläggsidentiteten rollen Key Vault Secrets User.
- I artikeln för att ge åtkomst till Azure Key Vault, behöver den identitet som används med
SecretProviderClassKey Vault-certifikatanvändare åtkomstkeytillcertificateeller och Key Vault-hemlighetsanvändare för att få åtkomstsecrettill objekttypen.
Skapa ett AKS-kluster
Skapa ett AKS-kluster med Azure Key Vault-leverantören för stöd av Secrets Store CSI Driver.
Skapa variabler som används i kommandona för att skapa ett AKS-kluster och Key Vault.
export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM") export KEYVAULT_NAME=myKeyVault${RANDOM_STRING} export RESOURCE_GROUP=myResourceGroup export CLUSTER_NAME=myAKSCluster export LOCATION=eastus2Azure Key Vault-namn måste vara globalt unika, alfanumeriska, inklusive bindestreck och 3–24 tecken. Namnet på nyckelvalvet sammanfogar
KEYVAULT_NAMEvariabelnsmyKeyVaultvärde medRANDOM_STRINGvariabelns sträng på 10 tecken.Skapa en Azure-resursgrupp med kommandot
az group create.az group create --name $RESOURCE_GROUP --location $LOCATIONSkapa ett AKS-kluster med Azure Key Vault-providern för CSI-drivrutinsfunktionen i Secrets Store med hjälp av
az aks createkommandot med parametern--enable-addons azure-keyvault-secrets-provider.Parametern
--enable-addonsskapar en användartilldelad hanterad identitet med namnetazurekeyvaultsecretsprovider-xxxxsom du kan använda för att autentisera till ditt nyckelvalv. Den hanterade identiteten lagras i nodens resursgrupp (MC_) och tilldelas automatiskt till skaleringsuppsättningen för virtuella maskiner. Du kan använda den här hanterade identiteten eller din egen hanterade identitet för att få åtkomst till nyckelvalvet. Det är inte möjligt att förhindra skapandet av identiteten.az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --enable-addons azure-keyvault-secrets-provider \ --generate-ssh-keysTips/Råd
Om du vill använda Microsoft Entra-arbetsbelastnings-ID
az aks createmåste kommandot innehålla parametrarna--enable-oidc-issueroch--enable-workload-identity.
Skapa ett AKS-kluster
Skapa en main.tf fil och kopiera följande testade exempelkonfiguration till den.
Lagringsplatsen Azure Terraform GitHub underhåller exemplet. Exemplet skapar resursgruppen, AKS-klustret, Azure Key Vault, exempelhemligheten och de nödvändiga rolltilldelningarna.
terraform {
required_version = ">= 1.5.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.116"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
}
provider "azurerm" {
features {
resource_group {
prevent_deletion_if_contains_resources = false
}
}
}
data "azurerm_client_config" "current" {}
resource "random_string" "suffix" {
length = 6
upper = false
special = false
}
locals {
location = "eastus"
resource_group_name = "rg-aks-kv-csi-demo-${random_string.suffix.result}"
aks_name = "aks-kv-csi-demo"
key_vault_name = "kvcsidemo${random_string.suffix.result}"
secret_name = "ExampleSecret"
}
resource "azurerm_resource_group" "this" {
name = local.resource_group_name
location = local.location
}
resource "azurerm_log_analytics_workspace" "this" {
name = "law-aks-kv-csi-demo"
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
sku = "PerGB2018"
retention_in_days = 30
}
resource "azurerm_kubernetes_cluster" "this" {
name = local.aks_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
dns_prefix = "akskvcsidemo"
kubernetes_version = null
oidc_issuer_enabled = true
workload_identity_enabled = true
default_node_pool {
name = "system"
node_count = 1
vm_size = "Standard_D2s_v3"
upgrade_settings {
drain_timeout_in_minutes = 0
max_surge = "10%"
node_soak_duration_in_minutes = 0
}
}
identity {
type = "SystemAssigned"
}
key_vault_secrets_provider {
secret_rotation_enabled = false
}
oms_agent {
log_analytics_workspace_id = azurerm_log_analytics_workspace.this.id
}
network_profile {
network_plugin = "azure"
load_balancer_sku = "standard"
}
tags = {
scenario = "aks-keyvault-csi"
}
}
resource "azurerm_key_vault" "this" {
name = local.key_vault_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = "standard"
purge_protection_enabled = false
soft_delete_retention_days = 7
enable_rbac_authorization = true
public_network_access_enabled = true
}
resource "azurerm_role_assignment" "current_user_kv_admin" {
scope = azurerm_key_vault.this.id
role_definition_name = "Key Vault Administrator"
principal_id = data.azurerm_client_config.current.object_id
}
resource "azurerm_key_vault_secret" "example" {
name = local.secret_name
value = "HelloFromKeyVault"
key_vault_id = azurerm_key_vault.this.id
depends_on = [
azurerm_role_assignment.current_user_kv_admin
]
}
resource "azurerm_role_assignment" "aks_csi_secrets_user" {
scope = azurerm_key_vault.this.id
role_definition_name = "Key Vault Secrets User"
# This is the managed identity automatically created by the AKS Key Vault CSI addon.
principal_id = azurerm_kubernetes_cluster.this.key_vault_secrets_provider[0].secret_identity[0].object_id
}
output "resource_group_name" {
value = azurerm_resource_group.this.name
}
output "aks_cluster_name" {
value = azurerm_kubernetes_cluster.this.name
}
output "key_vault_name" {
value = azurerm_key_vault.this.name
}
output "key_vault_secret_name" {
value = azurerm_key_vault_secret.example.name
}
output "tenant_id" {
value = data.azurerm_client_config.current.tenant_id
}
output "aks_csi_client_id" {
value = azurerm_kubernetes_cluster.this.key_vault_secrets_provider[0].secret_identity[0].client_id
}
output "aks_csi_object_id" {
value = azurerm_kubernetes_cluster.this.key_vault_secrets_provider[0].secret_identity[0].object_id
}
Distribuera konfigurationen. Från en Bash-session kör du följande kommandon för att distribuera resurserna:
terraform init terraform validate terraform plan terraform applyAnge variablerna som används i de återstående kommandona från Terraform-utdata:
export RESOURCE_GROUP=$(terraform output -raw resource_group_name) export CLUSTER_NAME=$(terraform output -raw aks_cluster_name) export KEYVAULT_NAME=$(terraform output -raw key_vault_name)
Uppdatera ett befintligt AKS-kluster
Uppdatera ett befintligt AKS-kluster med Azure Key Vault-providern för CSI-drivrutinsstöd för Secrets Store.
Skapa variabler som används i kommandona. Ersätt värdena efter behov för att uppdatera ditt befintliga AKS-kluster eller Key Vault.
Om du till exempel använder ett befintligt nyckelvalv ersätter
KEYVAULT_NAMEdu variabelns värde utan att använda variabelnRANDOM_STRING.Om du inte har något nyckelvalv måste Azure Key Vault-namn vara globalt unika, alfanumeriska, inklusive bindestreck och 3–24 tecken. Namnet på nyckelvalvet sammanfogar
KEYVAULT_NAMEvariabelnsmyKeyVaultvärde medRANDOM_STRINGvariabelns sträng på 10 tecken. Du kan skapa nyckelvalvet senare i den här artikeln.export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM") export KEYVAULT_NAME=myKeyVault${RANDOM_STRING} export RESOURCE_GROUP=myResourceGroup export CLUSTER_NAME=myAKSCluster export LOCATION=eastus2Uppdatera ett befintligt AKS-kluster med Azure Key Vault-providern för CSI-drivrutinsfunktionen i Secrets Store med hjälp av
az aks enable-addonskommandot och aktiveraazure-keyvault-secrets-providertillägget. Tillägget skapar en användartilldelad hanterad identitet som du kan använda för att autentisera till ditt nyckelvalv.az aks enable-addons \ --addons azure-keyvault-secrets-provider \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPNär du har aktiverat Azure Key Vault-hemlighetsprovidern skapar AKS en hanterad identitet med namnet
azurekeyvaultsecretsprovider-xxxxsom du kan använda för att autentisera till ditt nyckelvalv. Den hanterade identiteten lagras i nodens resursgrupp (MC_) och tilldelas automatiskt till skaleringsuppsättningen för virtuella maskiner. Du kan använda den här hanterade identiteten eller din egen hanterade identitet för att få åtkomst till nyckelvalvet. Det är inte möjligt att förhindra skapandet av identiteten.
Verifiera installationen av den hanterade identiteten och nyckelvalvsprovidern
Följande kommandon använder variablerna $CLUSTER_NAME och $RESOURCE_GROUP . De Azure CLI arbetsflödena definierar dessa variabler tidigare, och Terraform-arbetsflödet anger dem från utdata efter distributionen.
Verifiera den hanterade identiteten
Använd följande steg för att verifiera att en hanterad identitet skapades och tilldelades skalningsuppsättningen för klustrets virtuella maskiner.
Kontrollera att den hanterade identiteten skapades och tilldelades klustret med hjälp av
az aks showkommandot .az aks show \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --query addonProfiles{ "azureKeyvaultSecretsProvider": { "config": { "enableSecretRotation": "false", "rotationPollInterval": "2m" }, "enabled": true, "identity": { "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444", "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster" } } }Egenskapen
resourceIdvisar resursgruppen och identitetens namnazurekeyvaultsecretsprovider-myakscluster.Kontrollera att den hanterade identiteten har tilldelats nodresursgruppens skalningsuppsättning för virtuella datorer.
NODE_RG=$(az aks show \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --query nodeResourceGroup --output tsv) VMSS_NAME=$(az vmss list \ --resource-group $NODE_RG \ --query [].name --output tsv) az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'Utdata visar resurs-ID för Virtuella Maskinskalningsuppsättningar
Microsoft.Compute/virtualMachineScaleSetsoch egenskapenuserAssignedIdentitiesmed ett resurs-ID förazurekeyvaultsecretsprovider-myaksclustersom bekräftar att identiteten har tilldelats den Virtuella Maskinskalningsuppsättningen.
Verifiera installationen av Azure Key Vault-providern för Secrets Store CSI-drivrutinen
Hämta autentiseringsuppgifterna för AKS-klustret med hjälp av
az aks get-credentialskommandot .az aks get-credentials \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPKontrollera att installationen är klar med
kubectl get podskommandot som visar alla poddar medsecrets-store-csi-driveretiketterna ochsecrets-store-provider-azureikube-systemnamnområdet.kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wideFlaggan
-o wideinnehåller den nod som varje podd körs på i utdata.Dina utdata bör se ut ungefär som följande exempelutdata:
NAME READY STATUS RESTARTS AGE NODE aks-secrets-store-csi-driver-4vpkj 3/3 Running 2 4m25s aks-nodepool1-12345678-vmss000002 aks-secrets-store-csi-driver-ctjq6 3/3 Running 2 4m21s aks-nodepool1-12345678-vmss000001 aks-secrets-store-csi-driver-tlvlq 3/3 Running 2 4m24s aks-nodepool1-12345678-vmss000000 aks-secrets-store-provider-azure-5p4nb 1/1 Running 0 4m21s aks-nodepool1-12345678-vmss000000 aks-secrets-store-provider-azure-6pqmv 1/1 Running 0 4m24s aks-nodepool1-12345678-vmss000001 aks-secrets-store-provider-azure-f5qlm 1/1 Running 0 4m25s aks-nodepool1-12345678-vmss000002
Skapa nytt nyckelvalv
az keyvault create Kör kommandot för att skapa ett nytt nyckelvalv med Azure RBAC aktiverat.
az keyvault create \
--name $KEYVAULT_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--enable-rbac-authorization
Azure RBAC är aktiverat som standard när du skapar ett nytt nyckelvalv även om du inte inkluderar parametern --enable-rbac-authorization .
För mer information om behörighetsmodeller för Key Vault och Azure RBAC, se Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med Azure rollbaserad åtkomstkontroll.
Uppdatera befintligt nyckelvalv
Kör kommandot az keyvault update för att uppdatera ett befintligt nyckelvalv med Azure rollbaserad åtkomstkontroll (Azure RBAC). Parametern --enable-rbac-authorization krävs för att aktivera Azure RBAC när du uppdaterar ett befintligt nyckelvalv som har Azure RBAC inaktiverat.
az keyvault update \
--name $KEYVAULT_NAME \
--resource-group $RESOURCE_GROUP \
--enable-rbac-authorization
Mer information om nyckelvalvsbehörighetsmodeller och Azure RBAC finns i Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med en rollbaserad åtkomstkontroll i Azure
Lägg till rolltilldelning och hemlighet i nyckelvalvet
Kör kommandot
az keyvault showför att kontrollera att nyckelvalvet har Azure RBAC aktiverat.az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.enableRbacAuthorizationUtdata ska vara
true.Lägg till en rolltilldelning för ditt användarkonto i nyckelvalvets omfång med
az role assignment createkommandot så att du kan lägga till en hemlighet i nyckelvalvet i nästa steg.Rollen Key Vault Secrets Officer med unik identifierare
b86a8fe4-44ce-4948-aee5-eccb2c155cd7läggs till och du kan använda antingen namnet eller den unika identifieraren. Det är bra att använda rollens unika identifierare för att förhindra problem om rollnamnet ändras.KEYVAULT_ID=$(az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query id -o tsv) MYID=$(az ad signed-in-user show --query id --output tsv) az role assignment create \ --assignee-object-id $MYID \ --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \ --scope $KEYVAULT_ID \ --assignee-principal-type UserDet kan ta flera minuter innan rolltilldelningen börjar gälla. Du kan kontrollera att rolltilldelningen skapades med följande kommando:
az role assignment list \ --assignee-object-id $MYID \ --scope $KEYVAULT_ID \ --query '[].{Role:roleDefinitionName, Scope:scope}' \ --output tableSkapa en oformaterad hemlighet med namnet
ExampleSecreti nyckelvalvet med kommandotaz keyvault secret set.Ditt nyckelvalv kan lagra nycklar, hemligheter och certifikat. Parametern
valueanvänder variabelnRANDOM_STRINGför att skapa ett unikt värde för hemligheten.az keyvault secret set \ --vault-name $KEYVAULT_NAME \ --name ExampleSecret \ --value MyAKSExampleSecret${RANDOM_STRING}Kontrollera att hemligheten har lagts till i nyckelvalvet med kommandot
az keyvault secret show.az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
Skapa nytt nyckelvalv
Terraform-exemplet som ingick tidigare skapar ett nytt nyckelvalv med Azure RBAC aktiverat, tilldelar nödvändiga roller och skapar ExampleSecret. Ingen separat konfigurationsuppdatering krävs.
Hämta nyckelvalvets namn från Terraform-utdata.
KEYVAULT_NAME=$(terraform output -raw key_vault_name)Kontrollera att
ExampleSecrethar lagts till i nyckelvalvet med kommandotaz keyvault secret show.az keyvault secret show \ --vault-name $KEYVAULT_NAME \ --name ExampleSecret
Rensa resurser
Om du ska gå till nästa artikel och behöver dessa resurser ignorerar du följande steg. Om du är klar och inte planerar att fortsätta till nästa artikel bör du ta bort resurserna som skapas i den här artikeln för att undvika onödiga kostnader.
Ta bort klustrets autentiseringsuppgifter från din lokala .kube/config-fil .
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTTa bort resursgruppen och alla resurser i den, inklusive resurser i nodresursgruppen (
MC_) med kommandotaz group delete.az group delete --name $RESOURCE_GROUP --yes --no-wait
Kommandot terraform destroy tar bort alla resurser som definierats i den aktuella Terraform-konfigurations- och tillståndsfilen. Kör endast det här kommandot från arbetskatalogen som används för den här artikeln.
Varning
Om du arbetar med befintliga eller produktionsresurser, granskar du utförandeplanen noggrant innan du kör:
terraform plan -destroy
Undvik att köra terraform destroy mot delad eller importerad infrastruktur om du inte är säker på att det är säkert att ta bort den. Mer information finns i Terraform-dokumentationen för terraform destroy-kommandot .
Ta bort klustrets autentiseringsuppgifter från din lokala .kube/config-fil .
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTKör följande kommando för att ta bort resurserna som skapats i den här artikeln:
terraform destroy
Nästa steg
I den här artikeln har du lärt dig hur du använder Azure Key Vault-providern för Secrets Store CSI-drivrutinen i ett AKS-kluster. Terraform-exemplet ger tilläggsidentiteten åtkomst till hemligheter i nyckelvalvet. Om du vill konfigurera en SecretProviderClass eller använda en annan identitet fortsätter du till nästa artikel.