Använda Azure Key Vault-providern för Kubernetes Secrets Store CSI-drivrutin

Gäller för: AKS på Azure Local 22H2, AKS på Windows Server

Kubernetes Secrets Store CSI-drivrutinen integrerar hemligheter med Kubernetes via en CSI-volym (Container Storage Interface). Om du integrerar CSI-drivrutinen för Secrets Store med AKS aktiverat av Azure Arc kan du montera hemligheter, nycklar och certifikat som en volym. Data monteras sedan i containerns filsystem.

Med CSI-drivrutinen Secrets Store kan du även integrera ett nyckelvalv med en av de leverantörer som stöds, till exempel Azure Key Vault.

Innan du börjar

Kontrollera att du har följande förutsättningar innan du börjar:

  • Ett Azure-konto och prenumeration.
  • En befintlig distribution av AKS aktiverad av Arc med ett befintligt arbetsbelastningskluster. Om du inte har någon distribution följer du den här snabbstarten för att distribuera en AKS-värd och ett arbetsbelastningskluster.
  • Om du kör Linux-kluster måste de finnas på version Linux 1.16.0 eller senare.
  • Om du kör Windows-kluster måste de finnas i version Windows 1.18.0 eller senare.
  • Kontrollera att du har slutfört följande installationer:

Få åtkomst till dina kluster med kubectl

Kör följande kommando för att komma åt klustret med hjälp av kubectl. I kommandot ersätter du värdet -name för med ditt befintliga klusternamn. Klusternamnet använder det angivna klustrets kubeconfig fil som standardfil kubeconfig för kubectl:

PowerShell
Get-AksHciCredential -name mycluster

Installera CSI-drivrutinen för Secrets Store

Om du vill installera CSI-drivrutinen för Secrets Store kör du följande Helm-kommando:

PowerShell
helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts

Följande kommando installerar både CSI-drivrutinen för Secrets Store och Azure Key Vault-providern:

PowerShell
helm install csi csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --namespace kube-system

Anteckning

Du bör installera CSI-drivrutinen för Secrets Store och Azure Key Vault-providern kube-system i namnområdet. Den här guiden använder kube-system namnområdet för alla instanser.

Kontrollera att CSI-drivrutinen för Secrets Store och Azure Key Vault-providern har installerats

Kontrollera dina poddar som körs för att kontrollera att CSI-drivrutinen för Secrets Store och Azure Key Vault-providern är installerade genom att köra följande kommandon:

  • Kontrollera att CSI-drivrutinen för Secrets Store är installerad genom att köra det här kommandot:

    PowerShell
    kubectl get pods -l app=secrets-store-csi-driver -n kube-system
    

    Exempel på utdata>

    Output
    NAME                             READY   STATUS    RESTARTS   AGE
    secrets-store-csi-driver-spbfq   3/3     Running   0          3h52m
    
  • Kontrollera att Azure Key Vault-providern är installerad genom att köra det här kommandot:

    PowerShell
    kubectl get pods -l app=csi-secrets-store-provider-azure -n kube-system
    

    Exempel på utdata>

    Output
    NAME                                         READY   STATUS    RESTARTS   AGE
    csi-csi-secrets-store-provider-azure-tpb4j   1/1     Running   0          3h52m
    

Lägga till hemligheter i ett Azure-nyckelvalv

Du behöver en Azure Key Vault-resurs som innehåller dina hemliga data. Du kan använda en befintlig Azure Key Vault-resurs eller skapa en ny.

Om du behöver skapa en Azure Key Vault-resurs kör du följande kommando. Kontrollera att du är inloggad genom att köra az login med dina Azure-autentiseringsuppgifter. Ändra sedan följande värden till din miljö:

Azure CLI
az keyvault create -n <keyvault-name> -g <resourcegroup-name> -l eastus

Azure Key Vault kan lagra nycklar, hemligheter och certifikat. I följande exempel konfigureras en oformaterad hemlighet med namnet ExampleSecret :

Azure CLI
az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSHCIExampleSecret

Skapa en identitet i Azure

Använd tjänstens huvudnamn för att komma åt Azure Key Vault-instansen som du skapade i föregående steg. Du bör registrera utdata när du kör följande kommandon. Du använder både klienthemligheten och klient-ID:t i nästa steg.

Ange klienthemligheten genom att köra följande kommando:

Azure CLI
az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription-id> --name http://secrets-store-test --query 'password' -otsv

Ange klient-ID:t genom att köra följande kommando:

Azure CLI
az ad sp show --id http://secrets-store-test --query 'appId' -otsv

Ange identiteten för åtkomst till Azure-nyckelvalvet

Använd värdena från föregående steg för att ange behörigheter enligt följande kommando:

Azure CLI
az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <client-id>

Skapa Kubernetes-hemligheten med autentiseringsuppgifter

Kör följande kommando för att skapa Kubernetes-hemligheten med autentiseringsuppgifterna för tjänstens huvudnamn. Ersätt följande värden med lämpligt klient-ID och klienthemlighet från föregående steg:

PowerShell
kubectl create secret generic secrets-store-creds --from-literal clientid=<client-id> --from-literal clientsecret=<client-secret>

Som standard har den hemliga butiksprovidern filtrerat klockan aktiverad på hemligheter. Du kan tillåta att kommandot hittar hemligheten i standardkonfigurationen genom att lägga till etiketten secrets-store.csi.k8s.io/used=true i hemligheten:

PowerShell
kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true

Skapa och tillämpa ditt eget SecretProviderClass-objekt

Om du vill använda och konfigurera CSI-drivrutinen för Secrets Store för ditt Kubernetes-kluster skapar du en SecretProviderClass anpassad resurs. Kontrollera att matrisen objects matchar de objekt som du har lagrat i Azure Key Vault-instansen:

YAML
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <keyvault-name>                  # The name of the Azure Key Vault
  namespace: kube-system
spec:
  provider: azure
  parameters:
    keyvaultName: "<keyvault-name>"       # The name of the Azure Key Vault
    useVMManagedIdentity: "false"         
    userAssignedIdentityID: "false" 
    cloudName: ""                         # [OPTIONAL for Azure] if not provided, Azure environment defaults to AzurePublicCloud 
    objects:  |
      array:
        - |
          objectName: <secret-name>       # In this example, 'ExampleSecret'   
          objectType: secret              # Object types: secret, key or cert
          objectVersion: ""               # [OPTIONAL] object versions, default to latest if empty
    tenantId: "<tenant-id>"               # the tenant ID containing the Azure Key Vault instance

Tillämpa SecretProviderClass på klustret

Om du vill distribuera den SecretProviderClass du skapade i föregående steg använder du följande kommando:

PowerShell
kubectl apply -f ./new-secretproviderclass.yaml

Uppdatera och tillämpa ditt klusters YAML-distributionsfil

Uppdatera YAML-filen för distribution för att säkerställa att klustret använder den nya anpassade resursen. Till exempel:

YAML
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: "<keyvault-name>"
        nodePublishSecretRef:                       # Only required when using service principal mode
          name: secrets-store-creds                 # Only required when using service principal mode

Tillämpa sedan den uppdaterade YAML-distributionsfilen på klustret:

PowerShell
kubectl apply -f ./my-deployment.yaml 

Verifiera distributionen av Secrets Store

Om du vill visa hemligheterna som finns i secrets-storekör du följande kommando:

PowerShell
kubectl exec busybox-secrets-store-inline --namespace kube-system -- ls /mnt/secrets-store/

Utdata ska visa namnet på hemligheten. I det här exemplet visas följande utdata:

Output
ExampleSecret

Om du vill visa testhemligheten som finns i secrets-storekör du följande kommando:

PowerShell
kubectl exec busybox-secrets-store-inline --namespace kube-system -- cat /mnt/secrets-store/ExampleSecret 

Utdata ska visa hemlighetens värde. I det här exemplet visas följande utdata:

Output
MyAKSHCIExampleSecret

Nästa steg