Aracılığıyla paylaş


Azure Arc özellikli Kubernetes kümelerine gizli dizileri getirmek için Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını kullanın

Gizli Dizi Deposu için Azure Key Vault Sağlayıcısı CSI Sürücüsü, Azure Key Vault'un bir CSI birimi aracılığıyla Kubernetes kümesiyle gizli dizi deposu olarak tümleştirilmesine olanak tanır. Azure Arc özellikli Kubernetes kümeleri için, gizli bilgileri getirmek üzere Azure Key Vault Gizli Bilgi Sağlayıcı uzantısını yükleyebilirsiniz.

Azure Key Vault Gizli Dizi Sağlayıcısı uzantısının özellikleri şunlardır:

  • CSI Satır içi birim kullanarak gizli bilgiler/anahtarlar/sertifikalar pod'a bindirilir.
  • SecretProviderClass CRD ile pod taşınabilirliğini destekler
  • Linux ve Windows kapsayıcılarını destekler
  • Kubernetes Secrets ile eşitlemeyi destekler
  • Gizli bilgilerin otomatik dönmesini destekler
  • Uzantı bileşenleri kullanılabilirlik alanlarına dağıtılarak alanlar arası yedekli hale gelir

İpucu

Çevrimdışı erişim gerekiyorsa veya gizli dizilerin Kubernetes gizli dizi deposuyla eşitlenmesi gerekiyorsa Arc özellikli Kubernetes kümelerinizde gizli dizi yönetimi için Gizli Dizi Deposu uzantısını kullanın.

Önkoşullar

  • Azure Arc'a bağlı desteklenen kubernetes dağıtımına sahip bir küme. Şu anda bu senaryo için aşağıdaki Kubernetes dağıtımları desteklenmektedir:
    • Küme API'si Azure
    • Azure Yerel'de Azure Kubernetes Service (AKS) kümeleri
    • Azure Arc tarafından etkinleştirilen AKS
    • Google Kubernetes Engine
    • OpenShift Kubernetes Dağıtımı
    • Kanonik Kubernetes Dağıtımı
    • Elastic Kubernetes Service
    • Tanzu Kubernetes Grid
    • Azure Red Hat OpenShift
  • Aşağıdaki uç noktalara giden bağlantı:
    • linuxgeneva-microsoft.azurecr.io
    • upstreamarc.azurecr.io
    • *.blob.core.windows.net
  • Küme uzantıları için genel önkoşulları karşıladığınızdan emin olun. Azure CLI uzantısının 0.4.0 veya daha yeni bir k8s-extension sürümünü kullanmanız gerekir.

Arc özellikli kubernetes kümesine Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını yükleme

Bağlı kümenize Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını Azure portalda, Azure CLI kullanarak veya bir ARM şablonu dağıtarak yükleyebilirsiniz.

Azure Arc özellikli kubernetes kümelerinde uzantının yalnızca bir örneği dağıtılabilir.

İpucu

Küme giden ara sunucunun arkasındaysa, uzantıyı yüklemeden önce ara sunucu yapılandırma seçeneğini kullanarak Azure Arc'a bağladığınızdan emin olun.

Azure portalı

  1. Azure portalında Kubernetes - Azure Arc'a gidin ve kümenizi seçin.

  2. Hizmet menüsünde, Ayarlar'ın altında Uzantılar'ı seçin. Ardından + Ekle'yi seçin.

    Azure portalında Arc özellikli kubernetes kümesinin Uzantılar bölmesini gösteren ekran görüntüsü.

  3. Kullanılabilir uzantılar listesinden Azure Key Vault Gizli Dizileri Sağlayıcısı'nı seçerek uzantının en son sürümünü dağıtın.

    Azure portalında Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını gösteren ekran görüntüsü.

  4. Uzantıyı dağıtmak için istemleri izleyin. Gerekirse, Yapılandırma sekmesindeki varsayılan seçenekleri değiştirerek yüklemeyi özelleştirin.

Azure Komut Satırı Arayüzü (Azure CLI)

  1. Ortam değişkenlerini ayarlayın:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Aşağıdaki komutu çalıştırarak Gizli Dizi Deposu CSI Sürücüsünü ve Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını yükleyin:

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

Bu örneğe benzer bir çıktı görmeniz gerekir. Gizli anahtar sağlayıcısı Helm çizelgesinin kümeye dağıtılması birkaç dakika sürebilir.

{
  "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 şablonu

  1. Aşağıdaki biçimi kullanarak bir .json dosyası oluşturun. Kümenizi gösterecek şekilde <cluster-name> değerini güncellediğinizden emin olun.

    {
        "$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. Şimdi aşağıdaki Azure CLI komutunu kullanarak ortam değişkenlerini ayarlayın:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Son olarak, Azure Key Vault Gizli Dizi Sağlayıcısı uzantısını yüklemek için şu Azure CLI komutunu çalıştırın:

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

Artık gizli sağlayıcı kaynaklarını görüntüleyebilmeniz ve kümenizdeki uzantıyı kullanabilmeniz gerekir.

Uzantı yüklemesini doğrulama

Azure Key Vault Gizli Dizi Sağlayıcısı uzantısının başarıyla yüklenmesini onaylamak için aşağıdaki komutu çalıştırın.

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

Bu örneğe benzer bir çıktı görmeniz gerekir.

{
  "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 oluşturma veya seçme

Ardından, bağlı kümenizle kullanılacak Azure Key Vault'ı belirtin. Henüz bir anahtar kasanız yoksa aşağıdaki komutları kullanarak yeni bir Key Vault oluşturun. Anahtar kasanızın adının genel olarak benzersiz olması gerektiğini unutmayın.

Aşağıdaki ortam değişkenlerini ayarlayın:

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

Ardından aşağıdaki komutu çalıştırın:

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

Azure Key Vault anahtarları, gizli dizileri ve sertifikaları depolayabilir. Bu örnekte, aşağıdaki komutu kullanarak adlı DemoSecret bir düz metin gizli dizisi ayarlayabilirsiniz:

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

Sonraki bölüme geçmeden önce aşağıdaki özellikleri not alın:

  • Key Vault'taki gizli nesnenin adı
  • Nesne türü (gizli dizi, anahtar veya sertifika)
  • Key Vault kaynağınızın adı
  • Key Vault'un ait olduğu aboneliğin Azure Kiracı Kimliği

Azure Key Vault'a erişmek için kimlik sağlama

Şu anda Arc özellikli kümelerde Secrets Store CSI Sürücüsüne bir hizmet sorumlusu kimliği üzerinden erişilebilir. Key Vault'unuza erişebilecek bir kimlik sağlamak için bu adımları izleyin.

  1. Azure'da hizmet sorumlusu oluşturmak için adımları izleyin. Bu adımda oluşturulan İstemci Kimliği ve İstemci Sırrı'nı not alın.

  2. Ardından Azure Key Vault'un oluşturulan hizmet sorumlusu için GET iznine sahip olduğundan emin olun.

  3. Bağlantılı kümede bir Kubernetes sırrı oluşturmak için ilk adımdaki İstemci Kimliği ve İstemci Sırrı'nı kullanın.

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. Oluşturulan sırrı etiketle:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. Anahtar Kasası adı, kiracı kimliği ve AKV örneğinizden erişilecek nesneler için değerlerinizi doldurarak aşağıdaki YAML ile bir SecretProviderClass oluşturun.

    # 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
    

    Ulusal bulutlarla kullanmak için, Azure Kamu için cloudNameAzureUSGovernmentCloud olarak değiştirin veya 21Vianet tarafından işletilen Microsoft Azure için cloudName'ü olarak değiştirin.

  6. SecretProviderClass'ı kümenize uygulayın:

    kubectl apply -f secretproviderclass.yaml
    
  7. Kimliğinizin adını doldurarak aşağıdaki YAML ile bir pod oluşturun:

    # 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. Podu kümenize uygulayın:

    kubectl apply -f pod.yaml
    

Gizli bilgileri doğrula

Pod başlatıldıktan sonra, dağıtım YAML'nizde belirtilen birim yolundaki bağlanmış içerik kullanılabilir.

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

Ek yapılandırma seçenekleri

Azure Key Vault Gizli Dizi Sağlayıcısı uzantısı Helm grafik yapılandırmalarını destekler.

Aşağıdaki yapılandırma ayarları, Azure Key Vault Gizli Dizi Sağlayıcısı uzantısıyla sık sık kullanılır:

Yapılandırma Ayarı Varsayılan Açıklama
enableSecretRotation yanlış Boole türü. Eğer true ise, pod montajı ve Kubernetes Gizli Dizisini düzenli aralıklarla, harici gizli depolama alanındaki en son içerikle günceller.
DöngüYoklamaAralığı 2 m Eğer enableSecretRotationtrue ise, bu ayar sır döndürme yoklama aralığı süresini belirtir. Bu süre, tüm podlar ve Kubernetes sırları için bağlantılı içeriklerin en son sürüme ne sıklıkta yeniden senkronize edilmeleri gerektiği temelinde ayarlanabilir.
syncSecret etkinleştirildi yanlış Boole girişi. Bazı durumlarda, bağlı içeriği kopyalamak için bir Kubernetes Secret oluşturmak isteyebilirsiniz. Eğer true, SecretProviderClasssecretObjects alanın senkronize edilen Kubernetes Gizli Dizi nesnelerinin istenen durumunu tanımlamasına izin verir.

Uzantı yüklendiğinde bu ayarlar şu komut kullanılarak az k8s-extension create belirtilebilir:

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

Yüklemeden sonra şu komutu kullanarak az k8s-extension update da bu ayarları değiştirebilirsiniz:

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

Dağıtımınız için gereken diğer yapılandırma ayarlarını kullanabilirsiniz. Örneğin, küme oluştururken kubelet kök dizinini değiştirmek için komutunu değiştirin 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 Sır Sağlayıcısı uzantısını kaldırma

Uzantıyı kaldırmak için aşağıdaki komutu çalıştırın:

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

Not

Uzantı kaldırıldığında, uzantı yüklendiğinde oluşturulan Özel Kaynak Tanımları (CRD) silinmez.

Uzantı örneğinin silindiğini onaylamak için aşağıdaki komutu çalıştırın:

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

Uzantı başarıyla kaldırıldıysa Azure Key Vault Gizli Dizi Sağlayıcısı uzantısı çıkışta listelenmez. Kümenizde başka uzantı yüklü değilse boş bir dizi döndürülür.

Artık ihtiyacınız yoksa, aşağıdaki komutu çalıştırarak hizmet temel kimliğiyle ilişkili Kubernetes gizli anahtarını sildiğinizden emin olun.

kubectl delete secret secrets-store-creds

Mutabakat ve sorun giderme

Azure Key Vault Secrets Sağlayıcı uzantısı kendi kendini iyileştirendir. Birisi uzantı yüklendiğinde dağıtılan bir uzantı bileşenini değiştirmeye veya silmeye çalışırsa, bu bileşen özgün durumuyla mutabıktır. Yalnızca Özel Kaynak Tanımları (CRD) için özel durumlar vardır. Silinen CRD'ler uyumlu hale getirilmez. Silinen CRD'leri geri yüklemek için komutunu mevcut uzantı örneği adıyla yeniden kullanın az k8s-extension create .

Yaygın sorunları çözme hakkında daha fazla bilgi için Bkz. Gizli Dizi Deposu CSI sürücüsü ve Gizli Dizi Deposu CSI Sürücüsü için Azure Key Vault sağlayıcısı için açık kaynak sorun giderme kılavuzları.

Sonraki adımlar