Gunakan ekstensi Penyedia Rahasia Azure Key Vault untuk mengambil rahasia ke dalam kluster Kubernetes berbasis Azure Arc

Penyedia Azure Key Vault untuk Driver Secrets Store CSI memungkinkan integrasi Azure Key Vault sebagai penyimpanan rhaasia dengan kluster Kuber melalui volume CSI. Untuk kluster Kubernetes berbasis Azure Arc, Anda dapat menginstal ekstensi Penyedia Rahasia Azure Key Vault untuk mengambil rahasia.

Kemampuan ekstensi Penyedia Rahasia Azure Key Vault meliputi:

  • Memasang secrets/keys/certs pada pod menggunakan volume CSI Inline
  • Mendukung portabilitas pod dengan SecretProviderClass CRD
  • Mendukung kontainer Linux serta Windows
  • Mendukung proses sinkronisasi dengan Rahasia Kubernetes
  • Mendukung rotasi rahasia otomatis
  • Komponen ekstensi disebarkan pada zona ketersediaan, sehingga menjadikannya zona redundan

Prasyarat

  • Kluster dengan distribusi Kubernetes yang didukung yang telah terhubung ke Azure Arc. Distribusi Kubernetes berikut saat ini didukung untuk skenario ini:
    • API Azure Kluster
    • Kluster Azure Kubernetes Service (AKS) di Azure Stack HCI
    • AKS diaktifkan oleh Azure Arc
    • Google Kubernetes Engine
    • Distribusi OpenShift Kubernetes
    • Distribusi Kubernetes Kanonis
    • Layanan Kubernetes Elastis
    • Kisi Kube Tanzu
    • Azure Red Hat OpenShift
  • Pastikan Anda telah memenuhi prasyarat umum untuk ekstensi kluster. Anda harus menggunakan versi 0.4.0 atau ekstensi k8s-extension Azure CLI yang lebih baru.

Menginstal ekstensi Azure Key Vault Secrets Provider pada kluster Kubernetes berbasis Arc

Anda dapat menginstal ekstensi Penyedia Rahasia Azure Key Vault pada kluster yang terhubung di portal Azure, dengan menggunakan Azure CLI, atau dengan menyebarkan templat ARM.

Hanya satu instans ekstensi yang bisa disebarkan pada setiap kluster Kubernetes berbasis Azure Arc.

Tip

Jika kluster berada di belakang server proksi keluar, pastikan Anda menyambungkannya ke Azure Arc menggunakan opsi konfigurasi proksi sebelum menginstal ekstensi.

Portal Azure

  1. Di portal Microsoft Azure, navigasikan ke Kubernetes - Azure Arc serta pilih kluster Anda.

  2. Pilih Ekstensi (di bawah Pengaturan), kemudian pilih + Tambahkan.

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

  3. Dari daftar ekstensi yang tersedia, pilih Azure Key Vault Secrets Provider guna menyebarkan versi terbaru ekstensi.

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

  4. Ikuti perintah guna menyebarkan ekstensi. Jika diperlukan, sesuaikan penginstalan dengan mengubah opsi default pada tab Konfigurasi .

Azure CLI

  1. Atur variabel lingkungan:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Menginstal Driver Secrets Store CSI serta ekstensi Azure Key Vault Secrets Provider dengan menjalankan perintah berikut:

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

Anda akan melihat output yang mirip dengan contoh ini. Mungkin perlu waktu beberapa menit sebelum bagan Helm penyedia rahasia disebarkan ke kluster.

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

Templat ARM

  1. Buat file .json dengan format berikut. Pastikan untuk memperbarui <nilai nama> kluster agar merujuk ke kluster Anda.

    {
        "$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. Selanjutnya atur variabel lingkungan dengan menggunakan perintah Azure CLI berikut ini:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Terakhir, jalankan perintah Azure CLI ini guna menginstal ekstensi Penyedia Rahasia Azure Key Vault:

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

Kini Anda seharusnya dapat melihat sumber daya OSM dan menggunakan ekstensi OSM di kluster Anda.

Memvalidasi penginstalan ekstensi

Guna mengonfirmasi keberhasilan penginstalan ekstensi Penyedia Rahasia Azure Key Vault, jalankan perintah berikut.

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

Anda akan melihat output yang mirip dengan contoh ini.

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

Membuat ataupun memilih Azure Key Vault

Selanjutnya, tentukan Azure Key Vault untuk digunakan bersama kluster yang terhubung. Jika Anda belum memilikinya, buatlah Key Vault baru dengan menggunakan perintah berikut. Perlu diingat bahwa nama brankas kunci Anda harus unik secara global.

Atur variabel lingkungan berikut:

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

Kemudian, jalankan perintah berikut:

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

Azure Key Vault dapat menyimpan kunci, rahasia, dan sertifikat. Untuk contoh ini, Anda dapat mengatur rahasia teks biasa yang disebut juga sebagai DemoSecret dengan menggunakan perintah berikut:

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

Sebelum Anda melanjutkan ke bagian berikutnya, harap perhatikan properti berikut ini:

  • Nama objek rahasia pada Azure Key Vault
  • Tipe objek (rahasia, kunci, atau sertifikat)
  • Nama sumber daya dari Azure Key Vault Anda
  • ID Penyewa Azure untuk langganan di mana Key Vault berada

Menyediakan identitas untuk mengakses Azure Key Vault

Saat ini, Driver Secrets Store CSI pada kluster berbasis Arc dapat diakses melalui perwakilan layanan. Ikuti langkah-langkah ini untuk memberikan identitas yang dapat mengakses Key Vault Anda.

  1. Ikuti langkah-langkah untuk membuat perwakilan layanan di Azure. Perhatikan ID Klien serta Rahasia Klien yang dihasilkan dalam langkah ini.

  2. Selanjutnya, pastikan Azure Key Vault memiliki izin GET ke perwakilan layanan yang dibuat.

  3. Gunakan ID klien dan Rahasia Klien dari langkah pertama untuk membuat rahasia Kubernetes pada kluster yang terhubung:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. Beri label pada rahasia yang telah dibuat:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. SecretProviderClass Buat dengan YAML berikut, isi nilai Anda untuk nama brankas kunci, ID penyewa, dan objek yang akan diambil dari instans AKV Anda:

    # 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
    

    Untuk digunakan dengan cloud nasional, ubah cloudName ke AzureUSGovernmentCloud untuk Azure Government, atau ke AzureChinaCloud untuk Microsoft Azure yang dioperasikan oleh 21Vianet.

  6. Terapkan SecretProviderClass ke kluster Anda:

    kubectl apply -f secretproviderclass.yaml
    
  7. Buat pod dengan YAML berikut, yang mengisi nama identitas Anda:

    # 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. Terapkan pod ke kluster Anda:

    kubectl apply -f pod.yaml
    

Validasi rahasia

Setelah pod dimulai, tersedia konten yang dipasang pada jalur volume yang ditentukan dalam penyebaran YAML Anda.

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

Opsi konfigurasi tambahan.

Ekstensi Penyedia Rahasia Azure Key Vault mendukung konfigurasi bagan Helm.

Pengaturan konfigurasi berikut sering digunakan dengan ekstensi Penyedia Rahasia Azure Key Vault:

Pengaturan Konfigurasi Default Deskripsi
enableSecretRotation salah Jenis Boolean. Jika true, ia akan memperbarui pemasangan pod dan Rahasia Kubernetes secara berkala dengan konten terbaru dari penyimpanan rahasia eksternal
rotationPollInterval 2 m Jika enableSecretRotation adalah true, pengaturan ini menentukan durasi interval polling rotasi rahasia. Durasi tersebut dapat disesuaikan berdasarkan seberapa sering konten yang dipasang untuk semua pod dan rahasia Kubernetes perlu disinkronkan ulang ke yang terbaru.
syncSecret.enabled salah Input boolean. Dalam beberapa kasus, Anda mungkin ingin membuat Rahasia Kube untuk mencerminkan konten yang dipasang. Jika true, SecretProviderClass akan memungkinkan secretObjects bidang untuk menentukan status objek Rahasia Kubernetes yang disinkronkan serta diinginkan.

Pengaturan ini dapat ditentukan ketika ekstensi diinstal dengan menggunakan perintah az k8s-extension create:

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

Anda juga dapat mengubah pengaturan ini setelah penginstalan dengan menggunakan az k8s-extension update perintah :

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

Anda dapat menggunakan pengaturan konfigurasi lain sesuai kebutuhan untuk penyebaran Anda. Misalnya, untuk mengubah direktori akar kubelet saat membuat kluster, ubah az k8s-extension create perintah :

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

Menghapus instalan untuk ekstensi Penyedia Rahasia Azure Key Vault

Untuk memasang ekstensi, harap jalankan perintah berikut:

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

Catatan

Menghapus instalan ekstensi tidak menghapus Definisi Sumber Daya Kustom (CRD) yang dibuat ketika ekstensi diinstal.

Untuk mengonfirmasi bahwa instans ekstensi telah dihapus, harap jalankan perintah berikut:

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

Jika ekstensi berhasil dihapus, Anda tidak akan melihat ekstensi Penyedia Rahasia Azure Key Vault yang tercantum dalam output. Jika Anda tidak memiliki ekstensi lain yang terinstal pada kluster Anda, ekstensi ini akan menjadi array kosong.

Jika Anda tidak lagi membutuhkannya, pastikan untuk menghapus rahasia Kubernetes yang terkait dengan perwakilan layanan dengan menjalankan perintah berikut:

kubectl delete secret secrets-store-creds

Rekonsiliasi serta pemecahan masalah

Ekstensi Penyedia Rahasia Azure Key Vault bersifat pemulihan mandiri. Jika seseorang mencoba mengubah atau menghapus komponen ekstensi yang disebarkan ketika ekstensi diinstal, komponen tersebut direkonsiliasi ke status aslinya. Satu-satunya pengecualian adalah bagi Definisi Sumber Daya Kustom (CRD). Jika CRD dihapus, CRD tidak akan mengalami rekonsiliasi. Untuk memulihkan CRD yang dihapus, harap gunakan az k8s-extension create perintah lagi dengan nama instans ekstensi yang ada.

Untuk informasi selengkapnya tentang mengatasi masalah umum, lihat panduan pemecahan masalah sumber terbuka untuk penyedia Azure Key Vault untuk driver Secrets Store CSI serta Driver Secrets Store CSI.

Langkah berikutnya