استخدام ملحق Azure Key Vault Secrets Provider لإحضار البيانات السرية في أنظمة مجموعات Kubernetes الممكنة في Azure Arc

يسمح مزود Azure Key Vault For Secrets Store CSI Driver بدمج Azure Key Vault كمخزن أسرار مع مجموعة Kubernetes عبر وحدة تخزين CSI. لأنظمة مجموعات Kubernetes الممكنة في Azure Arc، يمكنك تثبيت ملحق Azure Key Vault Secrets Provider لإحضار البيانات السرية.

تتضمن قدرات ملحق Azure Key Vault Secrets Provider ما يلي:

  • إدخال البيانات السرية/المفاتيح/الشهادات إلى حاويات التطبيق ذات وحدات تخزين مشتركة باستخدام وحدة تخزين مضمنة CSI
  • يدعم قابلية جراب مع SECRETProviderClass CRD
  • يدعم حاويات Linux وWindows
  • يدعم المزامنة مع البيانات السرية في Kubernetes
  • يدعم التدوير التلقائي للبيانات السرية
  • يتم توزيع مكونات الملحق في مناطق التوفر، ما يجعلها متكررة في المنطقة

المتطلبات الأساسية

  • نظام مجموعة مع توزيع Kubernetes مدعوم تم توصيله بالفعل ب Azure Arc. يتم حاليا دعم توزيعات Kubernetes التالية لهذا السيناريو:
    • واجهة برمجة تطبيقات نظام المجموعة في Azure
    • مجموعات Azure Kubernetes Service (AKS) على Azure Stack HCI
    • AKS ممكن بواسطة Azure Arc
    • محرك Google Kubernetes
    • توزيع OpenShift Kubernetes
    • توزيع Canonical Kubernetes
    • خدمة Elastic Kubernetes
    • خطوط شبكة Tanzu Kubernetes
    • Azure Red Hat OpenShift
  • تأكد من استيفاء المتطلبات الأساسية العامة لملحقات نظام المجموعة. يجب عليك استخدام الإصدار 0.4.0 أو الأحدث من ملحق Azure CLI k8s-extension.

تثبيت ملحق Azure Key Vault Secrets Provider على نظام مجموعة Kubernetes الممكن في Arc

يمكنك تثبيت ملحق Azure Key Vault Secrets Provider على نظام المجموعة المتصل في مدخل Microsoft Azure، أو باستخدام Azure CLI، أو عن طريق نشر قالب ARM.

يمكن توزيع مثيل واحد فقط من الملحق على كل نظام مجموعة Kubernetes ممكن في Azure Arc.

تلميح

إذا كان نظام المجموعة خلف خادم وكيل صادر، فتأكد من توصيله ب Azure Arc باستخدام خيار تكوين الوكيل قبل تثبيت الملحق.

مدخل Azure

  1. في مدخل Azure، انتقل إلى Kubernetes - Azure Arc وحدد نظام المجموعة الخاص بك.

  2. حدد الملحقات (ضمن الإعدادات)، ثم حدد + إضافة.

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

  3. من قائمة الملحقات المتوفرة، حدد Azure Key Vault Secrets Provider لتوزيع أحدث إصدار من الملحق.

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

  4. اتبع المطالبات لتوزيع الملحق. إذا لزم الأمر، قم بتخصيص التثبيت عن طريق تغيير الخيارات الافتراضية في علامة التبويب Configuration .

Azure CLI

  1. تعيين متغيرات البيئة:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. ثبّت Secrets Store CSI Driver وملحق Azure Key Vault Secrets Provider عن طريق تشغيل الأمر التالي:

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

يجب أن تشاهد إخراجا مشابها لهذا المثال. قد يستغرق الأمر عدة دقائق قبل نشر مخطط Helm لموفر الأسرار إلى نظام المجموعة.

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

قالب ARM

  1. أنشئ ملف .json بالتنسيق التالي. تأكد من تحديث قيمة <اسم-نظام مجموعة> للإشارة إلى نظام المجموعة الخاص بك.

    {
        "$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. الآن قم بتعيين متغيرات البيئة باستخدام أمر Azure CLI التالي:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. وأخيرًا، قم بتشغيل أمر Azure CLI هذا لتثبيت ملحق Azure Key Vault Secrets Provider:

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

يجب أن تكون الآن قادرًا على عرض موارد موفر البيانات السرية واستخدام الملحق في نظام المجموعة الخاص بك.

التحقق من صحة تثبيت الملحق

لتأكيد التثبيت الناجح لملحق Azure Key Vault Secrets Provider، قم بتشغيل الأمر التالي.

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

يجب أن تشاهد إخراجا مشابها لهذا المثال.

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

إنشاء Azure Key Vault أو تحديده

بعد ذلك، حدد Azure Key Vault لاستخدامه مع نظام المجموعة المتصل. إذا لم يكن لديك واحد بالفعل، فقم بإنشاء Key Vault جديد باستخدام الأوامر التالية. ضع في اعتبارك أن اسم مخزن المفاتيح الخاص بك يجب أن يكون فريدا عالميا.

عيّن متغيرات البيئة التالية:

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

أولاً، قم بتشغيل الأمر التالي:

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

يمكن لـ Azure Key Vault تخزين المفاتيح والأسرار والشهادات. على سبيل المثال، يمكنك تعيين بيانات سرية لنص عادي يسمى DemoSecret باستخدام الأمر التالي:

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

قبل الانتقال إلى القسم التالي، لاحظ الخصائص التالية:

  • اسم عنصر البيانات السرية في Key Vault
  • نوع الكائن (السري أو المفتاح أو الشهادة)
  • اسم مورد Key Vault
  • معرف مستأجر Azure للاشتراك الذي ينتمي إليه Key Vault

توفير الهوية للوصول إلى Azure Key Vault

حاليًا، يمكن الوصول إلى Secrets Store CSI Driver على أنظمة المجموعات الممكنة في Arc من خلال كيان الخدمة. اتبع هذه الخطوات لتوفير هوية يمكنها الوصول إلى Key Vault الخاص بك.

  1. اتبع الخطوات لإنشاء كيان خدمة في Azure. لاحظ معرف العميل وسر العميل الذي تم إنشاؤه في هذه الخطوة.

  2. بعد ذلك، تأكد من أن Azure Key Vault لديه إذن GET لكيان الخدمة الذي تم إنشاؤه.

  3. استخدم معرف العميل وسر العميل من الخطوة الأولى لإنشاء سر Kubernetes على نظام المجموعة المتصل:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. تسمية البيانات السرية التي تم إنشاؤها:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. SecretProviderClass أنشئ باستخدام YAML التالي، واملأ القيم الخاصة بك لاسم مخزن المفاتيح ومعرف المستأجر والعناصر لاستردادها من مثيل 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
    

    للاستخدام مع السحب الوطنية، قم بالتغيير cloudName إلى AzureUSGovernmentCloud ل Azure Government، أو إلى AzureChinaCloud Microsoft Azure المشغل بواسطة 21Vianet.

  6. قم بتطبيق SecretProviderClass على مجموعتك:

    kubectl apply -f secretproviderclass.yaml
    
  7. قم بإنشاء كبينة باستخدام YAML التالي، مع ملء اسم هويتك:

    # 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. طبق الكبينة على مجموعتك:

    kubectl apply -f pod.yaml
    

التحقق من صحة الأسرار

بعد بدء تشغيل جراب، يتوفر المحتوى المحمل في مسار وحدة التخزين المحدد في 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

خيارات تكوين إضافية

يدعم ملحق Azure Key Vault Secrets Provider تكوينات مخطط Helm.

يتم استخدام إعدادات التكوين التالية بشكل متكرر مع ملحق موفر أسرار Azure Key Vault:

إعداد التكوين Default ‏‏الوصف
enableSecretRotation true النوع المنطقي. إذا true، يقوم بشكل دوري بتحديث إدخال حاويات التطبيق ذات وحدات التخزين المشتركة والبيانات السرية في Kubernetes بأحدث محتوى من مخزن البيانات السرية الخارجي
rotationPollInterval 2 م إذا كان enableSecretRotation هو true، يحدد هذا الإعداد مدة الفاصل الزمني للاستقصاء عن الاستدارة السرية. يمكن تعديل هذه المدة استنادًا إلى عدد المرات التي يجب فيها إعادة مزامنة المحتويات التي تم إدخالها لجميع حاويات التطبيق ذات وحدات التخزين المشتركة والبيانات السرية Kubernetes إلى أحدث إصدار.
syncSecret.enabled true إدخال منطقي. في بعض الحالات، قد تحتاج إلى إنشاء Kubernetes Secret لعكس المحتوى المحمل. إذا سمح true وSecretProviderClass للحقل secretObjects بتعريف الحالة المرغوبة للعناصر المتزامنة للبيانات السرية في Kubernetes.

يمكن تحديد هذه الإعدادات عند تثبيت الملحق باستخدام الأمر 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

يمكنك أيضا تغيير هذه الإعدادات بعد التثبيت باستخدام az k8s-extension update الأمر :

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

يمكنك استخدام إعدادات التكوين الأخرى حسب الحاجة للتوزيع. على سبيل المثال، لتغيير دليل جذر kubelet أثناء إنشاء نظام مجموعة، قم بتعديل 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 linux.kubeletRootDir=/path/to/kubelet secrets-store-csi-driver.linux.kubeletRootDir=/path/to/kubelet

إلغاء تثبيت ملحق Azure Key Vault Secrets Provider

لإلغاء تثبيت الملحقات، قم بتشغيل الأمر التالي:

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

إشعار

لا يؤدي إلغاء تثبيت الملحق إلى حذف تعريفات الموارد المخصصة (CRDs) التي تم إنشاؤها عند تثبيت الملحق.

للتأكد من حذف مثيل الملحق، قم بتشغيل الأمر التالي:

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

إذا تمت إزالة الملحق بنجاح، فلن ترى ملحق Azure Key Vault Secrets Provider مدرجا في الإخراج. إذا لم يكن لديك أي ملحقات أخرى مثبتة على نظام المجموعة، فسترى صفيفًا فارغًا.

إذا لم تعد بحاجة إليها، فتأكد من حذف سر Kubernetes المقترن بكيان الخدمة عن طريق تشغيل الأمر التالي:

kubectl delete secret secrets-store-creds

التسوية واستكشاف الأخطاء وإصلاحها

مصمم ملحق Azure Key Vault Secrets Provider للإصلاح الذاتي. إذا حاول شخص ما تغيير مكون ملحق تم نشره عند تثبيت الملحق أو حذفه، يتم تسوية هذا المكون مع حالته الأصلية. الاستثناءات الوحيدة هي لتعريفات الموارد المخصصة (CRDs). إذا تم حذف CRDs، فلن يتم تسويتها. لاستعادة CRDs المحذوفة استخدم الأمر az k8s-extension create مرة أخرى مع اسم مثيل الملحق الموجود.

لمزيد من المعلومات حول حل المشكلات الشائعة، راجع إرشادات استكشاف أخطاء المصدر المفتوح وإصلاحها لـ Azure Key Vault provider لـ Secrets Store CSI driver وSecrets Store CSI Driver.

الخطوات التالية