Použití zprostředkovatele Azure Key Vault pro ovladač CSI úložiště tajných kódů v clusteru AKS

Ovladač CSI úložiště tajných kódů Azure Key Vault umožňuje integraci trezoru klíčů Azure jako úložiště tajných kódů s clusterem Azure Kubernetes Service (AKS) prostřednictvím svazku CSI.

Omezení

  • Kontejner používající připojení svazku subPath nebude při obměně přijímat aktualizace tajných kódů. Vidět

Požadavky

  • Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
  • Než začnete, ujistěte se, že vaše verze Azure CLI je 2.30.0 nebo novější. Pokud se jedná o starší verzi, nainstalujte nejnovější verzi.
  • Pokud omezíte příchozí přenos dat do clusteru, ujistěte se, že jsou otevřené porty 9808 a 8095.

Podporované verze Kubernetes

Minimální doporučená verze Kubernetes je založená na postupném okně podpory verzí Kubernetes. Ujistěte se, že používáte verzi N-2 nebo novější.

Funkce

  • Připojí tajné kódy, klíče a certifikáty k podu pomocí svazku CSI.
  • Podporuje vložené svazky CSI.
  • Podporuje připojení více objektů úložiště tajných kódů jako jeden svazek.
  • Podporuje přenositelnost podů SecretProviderClass pomocí CRD.
  • Podporuje kontejnery Windows.
  • Synchronizace s tajnými kódy Kubernetes
  • Podporuje automatickou obměně připojeného obsahu a synchronizovaných tajných kódů Kubernetes.

Vytvoření clusteru AKS s využitím poskytovatele Azure Key Vault pro podporu ovladačů CSI úložiště tajných kódů

Nejprve vytvořte skupinu prostředků Azure:

az group create -n myResourceGroup -l eastus2

Pokud chcete vytvořit cluster AKS s možností ovladače CSI služby Azure Key Vault Provider for Secrets Store, použijte příkaz az aks create s doplňkemazure-keyvault-secrets-provider.

az aks create -n myAKSCluster -g myResourceGroup --enable-addons azure-keyvault-secrets-provider --enable-managed-identity

Spravovaná identita přiřazená uživatelem s názvem azurekeyvaultsecretsprovider-*, je vytvořena doplňkem pro účely přístupu k prostředkům Azure. Následující příklad používá tuto identitu pro připojení k trezoru klíčů Azure, kde se budou tajné kódy ukládat, ale můžete také použít jiné metody přístupu k identitě. Poznamenejte si identitu clientId ve výstupu:

...,
 "addonProfiles": {
    "azureKeyvaultSecretsProvider": {
      ...,
      "identity": {
        "clientId": "<client-id>",
        ...
      }
    }

Upgrade existujícího clusteru AKS pomocí poskytovatele Azure Key Vault pro podporu ovladačů CSI služby Tajné úložiště tajných klíčů

Pokud chcete upgradovat existující cluster AKS pomocí zprostředkovatele Azure Key Vault pro schopnost ovladače CSI služby Secrets Store, použijte příkaz az aks enable-addons s doplňkemazure-keyvault-secrets-provider:

az aks enable-addons --addons azure-keyvault-secrets-provider --name myAKSCluster --resource-group myResourceGroup

Jak je uvedeno v předchozí části, doplněk vytvoří spravovanou identitu přiřazenou uživatelem, kterou můžete použít k ověření ve službě Azure Key Vault.

Ověření instalace ovladače CSI úložiště tajných klíčů zprostředkovatele Azure Key Vault

Předchozí příkaz nainstaluje ovladač CSI služby Secrets Store a zprostředkovatele Azure Key Vault na uzly. Ověřte, že instalace je hotová, výpisem všech podů, které mají secrets-store-csi-driver popisky secrets-store-provider-azure v oboru názvů kube-system, a ujistěte se, že výstup vypadá podobně jako výstup zobrazený tady:

kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver, secrets-store-provider-azure)'

NAME                                     READY   STATUS    RESTARTS   AGE
aks-secrets-store-csi-driver-4vpkj       3/3     Running   2          4m25s
aks-secrets-store-csi-driver-ctjq6       3/3     Running   2          4m21s
aks-secrets-store-csi-driver-tlvlq       3/3     Running   2          4m24s
aks-secrets-store-provider-azure-5p4nb   1/1     Running   0          4m21s
aks-secrets-store-provider-azure-6pqmv   1/1     Running   0          4m24s
aks-secrets-store-provider-azure-f5qlm   1/1     Running   0          4m25s

Ujistěte se, že pod ovladače CSI úložiště tajných kódů a pod Azure zprostředkovatele úložiště tajných kódů běží na každém uzlu ve fondech uzlů vašeho clusteru.

Vytvoření nebo použití existujícího trezoru klíčů Azure

Kromě clusteru AKS budete potřebovat prostředek trezoru klíčů Azure, který ukládá obsah tajného kódu. Mějte na paměti, že název trezoru klíčů musí být globálně jedinečný.

az keyvault create -n <keyvault-name> -g myResourceGroup -l eastus2

Váš trezor klíčů Azure může ukládat klíče, tajné kódy a certifikáty. V tomto příkladu nastavíte tajný kód prostého textu s názvem ExampleSecret:

az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSExampleSecret

Poznamenejte si následující vlastnosti pro použití v další části:

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

Poskytnutí identity pro přístup k trezoru klíčů Azure

Ovladač CSI úložiště tajných kódů umožňuje přístup k trezoru klíčů Azure pomocí následujících metod:

Postupujte podle pokynů v tématu Poskytnutí identity pro přístup ke zprostředkovateli Azure Key Vault pro ovladač CSI služby Secrets Store pro zvolenou metodu.

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

Po spuštění podu je připojený obsah na cestě ke svazku, kterou jste zadali v YAML nasazení, k dispozici.

## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/

## print a test secret 'ExampleSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret

Získání certifikátů a klíčů

Návrh Azure Key Vault výrazně rozlišuje klíče, tajné kódy a certifikáty. Funkce certifikátů služby Key Vault byly navrženy tak, aby využívaly své klíčové a tajné funkce. Při vytvoření certifikátu trezoru klíčů se vytvoří také adresovatelný klíč a tajný klíč se stejným názvem. Klíč umožňuje operace s klíči a tajný klíč umožňuje načtení hodnoty certifikátu jako tajného klíče.

Certifikát trezoru klíčů obsahuje také veřejná metadata certifikátu x509. Trezor klíčů ukládá veřejné i soukromé komponenty vašeho certifikátu do tajného kódu. Každou jednotlivou komponentu můžete získat zadáním objectType in SecretProviderClass. Následující tabulka ukazuje, které objekty se mapují na různé prostředky přidružené k vašemu certifikátu:

Objekt Vrácená hodnota Vrátí celý řetěz certifikátů.
key Veřejný klíč ve formátu PEM (Privacy Enhanced Mail)
cert Certifikát ve formátu PEM No
secret Privátní klíč a certifikát ve formátu PEM Yes

Zakázání zprostředkovatele Azure Key Vault pro ovladač CSI úložiště tajných kódů v existujícím clusteru AKS

Poznámka

Před zakázání doplňku se ujistěte, že se nepoužívá SecretProviderClass . Pokus o zakázání doplňku v době, kdy SecretProviderClass existuje, způsobí chybu.

Pokud chcete v existujícím clusteru zakázat funkci ovladače CSI služby Azure Key Vault provider for Secrets Store, použijte příkaz az aks disable-addons s příznakemazure-keyvault-secrets-provider:

az aks disable-addons --addons azure-keyvault-secrets-provider -g myResourceGroup -n myAKSCluster

Poznámka

Pokud je doplněk zakázaný, stávající úlohy nebudou mít žádné problémy a neuvidí žádné aktualizace v připojených tajných kódech. Pokud se pod restartuje nebo se v rámci události vertikálního navýšení kapacity vytvoří nový pod, pod se nepodaří spustit, protože ovladač už není spuštěný.

Další možnosti konfigurace

Povolení a zakázání automatického zakazování

Poznámka

Když je povolený ovladač CSI zprostředkovatele Azure Key Vault pro úložiště tajných kódů, aktualizuje připojení podu a tajný kód Kubernetes, který je definovaný v secretObjects poli SecretProviderClass. Provede to pravidelným dotazováním na změny na základě vámi definovaného intervalu hlasování o obměně. Výchozí interval hlasování o obměně je 2 minuty.

Poznámka

Při aktualizaci tajného kódu v externím úložišti tajných kódů po počátečním nasazení podu se tajný klíč Kubernetes a připojení podu pravidelně aktualizují v závislosti na tom, jak aplikace využívá tajná data.

Připojte tajný kód Kubernetes jako svazek: Použijte automatické obměně a synchronizační funkce tajných kódů K8s ovladače CSI úložiště tajných kódů. Aplikace bude muset sledovat změny z připojeného svazku tajných kódů Kubernetes. Při aktualizaci tajného kódu Kubernetes ovladačem CSI se automaticky aktualizuje odpovídající obsah svazku.

Aplikace načte data ze systému souborů kontejneru: Použijte funkci obměně ovladače CSI úložiště tajných kódů. Aplikace bude muset sledovat změnu souboru ze svazku připojeného ovladačem CSI.

Použijte tajný klíč Kubernetes pro proměnnou prostředí: Restartujte pod a získejte nejnovější tajný kód jako proměnnou prostředí. Pomocí nástroje, jako je například Reloader , můžete sledovat změny synchronizovaného tajného kódu Kubernetes a provádět postupné upgrady podů.

Pokud chcete povolit automatické zařazení tajných kódů, při vytváření clusteru enable-secret-rotation použijte příznak:

az aks create -n myAKSCluster2 -g myResourceGroup --enable-addons azure-keyvault-secrets-provider --enable-secret-rotation

Nebo aktualizujte existující cluster s povoleným doplňkem:

az aks addon update -g myResourceGroup -n myAKSCluster2 -a azure-keyvault-secrets-provider --enable-secret-rotation

Pokud chcete zadat vlastní interval otočení, použijte rotation-poll-interval příznak:

az aks addon update -g myResourceGroup -n myAKSCluster2 -a azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 5m

Pokud chcete zakázat automatické zarážky, nejprve zakažte doplněk. Potom doplněk znovu povolte bez příznaku enable-secret-rotation .

Synchronizace připojeného obsahu pomocí tajného kódu Kubernetes

Někdy můžete chtít vytvořit tajný kód Kubernetes pro zrcadlení připojeného obsahu.

Když vytvoříte SecretProviderClass, použijte secretObjects pole k definování požadovaného stavu tajného kódu Kubernetes, jak je znázorněno v následujícím příkladu.

Poznámka

Tady uvedené příklady YAML jsou neúplné. Budete je muset upravit tak, aby podporovaly zvolenou metodu přístupu k vaší identitě trezoru klíčů. Podrobnosti najdete v tématu Poskytnutí identity pro přístup k zprostředkovateli Azure Key Vault pro ovladač CSI úložiště tajných kódů.

Tajné kódy se synchronizují až po spuštění podu, který je připojí. Pokud chcete spoléhat výhradně na synchronizaci s funkcí tajných kódů Kubernetes, nefunguje. Když se odstraní všechny pody, které tajný klíč spotřebovávají, odstraní se také tajný kód Kubernetes.

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-sync
spec:
  provider: azure                             
  secretObjects:                              # [OPTIONAL] SecretObjects defines the desired state of synced Kubernetes secret objects
  - data:
    - key: username                           # data field to populate
      objectName: foo1                        # name of the mounted content to sync; this could be the object name or the object alias
    secretName: foosecret                     # name of the Kubernetes secret object
    type: Opaque                              # type of Kubernetes secret object (for example, Opaque, kubernetes.io/tls)

Poznámka

Ujistěte se, že objectName pole odpovídá secretObjects názvu souboru připojeného obsahu. Pokud místo toho použijete objectAlias , měl by odpovídat aliasu objektu.

Nastavení proměnné prostředí pro odkaz na tajné kódy Kubernetes

Po vytvoření tajného kódu Kubernetes na něj můžete odkazovat nastavením proměnné prostředí v podu, jak je znázorněno v následujícím ukázkovém kódu:

Poznámka

Příklad zde ukazuje přístup k tajnému kódu prostřednictvím proměnných env a prostřednictvím svazku nebo svazkuMount. To je pro ilustrativní účely. Tyto dvě metody mohou existovat nezávisle na druhé.

kind: Pod
apiVersion: v1
metadata:
  name: busybox-secrets-store-inline
spec:
  containers:
    - name: busybox
      image: k8s.gcr.io/e2e-test-images/busybox:1.29-1
      command:
        - "/bin/sleep"
        - "10000"
      volumeMounts:
      - name: secrets-store01-inline
        mountPath: "/mnt/secrets-store"
        readOnly: true
      env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: foosecret
            key: username
  volumes:
    - name: secrets-store01-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "azure-sync"

Metriky

Poskytovatel azure Key Vault

Metriky se obsluhují přes Prometheus z portu 8898, ale tento port není ve výchozím nastavení vystaven mimo pod. Přístup k metrikám přes localhost pomocí:kubectl port-forward

kubectl port-forward -n kube-system ds/aks-secrets-store-provider-azure 8898:8898 &
curl localhost:8898/metrics

Následující tabulka uvádí metriky, které poskytuje poskytovatel azure Key Vault pro ovladač CSI úložiště tajných kódů:

Metric Popis Značky
keyvault_request Distribuce doby, po které trvalo získání z trezoru klíčů os_type=<runtime os>, provider=azure, object_name=<keyvault object name>, object_type=<keyvault object type>, error=<error if failed>
grpc_request Distribuce doby trvání požadavků gRPC os_type=<runtime os>, provider=azure, grpc_method=<rpc full method>, grpc_code=<grpc status code>, grpc_message=<grpc status message>

Ovladač CSI úložiště tajných kódů

Metriky se obsluhují z portu 8095, ale tento port není ve výchozím nastavení vystaven mimo pod. Přístup k metrikám přes localhost pomocí:kubectl port-forward

kubectl port-forward -n kube-system ds/aks-secrets-store-csi-driver 8095:8095 &
curl localhost:8095/metrics

Následující tabulka uvádí metriky poskytované ovladačem CSI úložiště tajných kódů:

Metric Popis Značky
total_node_publish Celkový počet úspěšných žádostí o připojení svazků os_type=<runtime os>, provider=<provider name>
total_node_unpublish Celkový počet úspěšných žádostí o odpojení svazku os_type=<runtime os>
total_node_publish_error Celkový počet chyb s požadavky na připojení svazku os_type=<runtime os>, provider=<provider name>, error_type=<error code>
total_node_unpublish_error Celkový počet chyb s požadavky na odpojování svazku os_type=<runtime os>
total_sync_k8s_secret Celkový počet synchronizovaných tajných kódů Kubernetes os_type=<runtime os, provider=<provider name>
sync_k8s_secret_duration_sec Distribuce toho, jak dlouho trvalo synchronizaci tajného kódu Kubernetes os_type=<runtime os>
total_rotation_reconcile Celkový počet odsouhlasení otočení os_type=<runtime os>, rotated=<true or false>
total_rotation_reconcile_error Celkový počet odsouhlasení otočení s chybou os_type=<runtime os>, rotated=<true or false>, error_type=<error code>
total_rotation_reconcile_error Distribuce doby trvání obměna obsahu úložiště tajných kódů pro pody os_type=<runtime os>

Další kroky

Teď, když jste se naučili používat zprostředkovatele Azure Key Vault pro ovladač CSI úložiště tajných kódů s clusterem AKS, přečtěte si téma Povolení ovladačů CSI pro disky Azure a Azure Files v AKS.