Gunakan Penyedia Azure Key Vault untuk Secrets Store CSI Driver di kluster AKS

Penyedia Azure Key Vault untuk Secrets Store CSI Driver memungkinkan integrasi Azure Key Vault sebagai penyimpanan rahasia dengan kluster Azure Kubernetes Service (AKS) melalui volume CSI.

Prasyarat

  • Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
  • Sebelum memulai, pastikan versi Azure CLI Anda adalah 2.30.0 atau yang lebih baru. Jika ini adalah versi sebelumnya, instal versi terbaru.
  • Jika membatasi Ingress ke kluster, pastikan Port 9808 dan 8095 terbuka.

Versi Kubernetes yang didukung

Versi Kube minimum yang direkomendasikan didasarkan pada jendela dukungan versi Kube yang bergulir. Pastikan Anda menjalankan versi N-2 atau yang lebih baru.

Fitur

  • Memasang rahasia, kunci, dan sertifikat ke pod dengan menggunakan volume CSI
  • Mendukung volume sebaris CSI
  • Mendukung pemasangan beberapa rahasia menyimpan objek sebagai volume tunggal
  • Mendukung portabilitas pod dengan CRD SecretProviderClass
  • Mendukung kontainer Windows
  • Menyinkronkan dengan rahasia Kubernetes
  • Mendukung rotasi otomatis konten yang dipasang dan rahasia Kube yang disinkronkan

Buat kluster AKS dengan Penyedia Azure Key Vault Provider untuk dukungan Secrets Store CSI Driver

Pertama, buat grup sumber daya Azure:

az group create -n myResourceGroup -l eastus2

Untuk membuat kluster AKS dengan kemampuan Penyedia Azure Key Vault untuk Secrets Store CSI Driver, gunakan perintah az aks create dengan add-on azure-keyvault-secrets-provider.

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

Identitas terkelola yang ditetapkan pengguna, bernama azurekeyvaultsecretsprovider-*, dibuat oleh add-on untuk tujuan mengakses sumber daya Azure. Contoh berikut menggunakan identitas ini untuk menghubungkan ke brankas kunci Azure tempat rahasia akan disimpan, tetapi Anda juga dapat menggunakan metode akses identitas lainnya. Perhatikan clientId identitas dalam output:

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

Buat kluster AKS yang ada dengan Penyedia Azure Key Vault untuk dukungan Secrets Store CSI Driver

Untuk meningkatkan kluster AKS yang ada dengan Penyedia Azure Key Vault untuk kemampuan Secrets Store CSI Driver, gunakan perintah az aks enable-addons dengan add-on azure-keyvault-secrets-provider:

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

Seperti yang disebutkan di bagian sebelumnya, add-on membuat identitas terkelola yang ditetapkan pengguna yang dapat digunakan untuk mengautentikasi ke brankas kunci Azure Anda.

Memverifikasi Penyedia Azure Key Vault untuk instalasi Secrets Store CSI Driver

Perintah sebelumnya menginstal Secrets Store CSI Driver dan Penyedia Azure Key Vault di node Anda. Verifikasi bahwa instalasi telah selesai dengan mencantumkan semua pod yang memiliki label secrets-store-csi-driver dan secrets-store-provider-azure di namespace kube-system, dan pastikan bahwa output Anda terlihat mirip dengan output yang ditampilkan di sini:

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

Pastikan bahwa pod Driver CSI Secrets Store dan pod Azure Penyedia Secrets Store berjalan di setiap node di kumpulan node cluster Anda.

Membuat atau menggunakan brankas kunci Azure yang ada

Selain kluster AKS, Anda memerlukan sumber daya brankas kunci Azure yang menyimpan konten rahasia. Ingatlah bahwa nama key vault harus unik secara global.

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

brankas kunci Azure Anda dapat menyimpan kunci, rahasia, dan sertifikat. Dalam contoh ini, Anda akan mengatur rahasia teks biasa yang disebut ExampleSecret:

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

Perhatikan properti berikut untuk digunakan di bagian berikutnya:

  • Nama objek rahasia di brankas kunci
  • Jenis objek (rahasia, kunci, atau sertifikat)
  • Nama sumber daya brankas kunci Azure Anda
  • ID penyewa Azure pada langganan

Berikan identitas untuk mengakses brankas kunci Azure

Driver CSI Secrets Store memungkinkan metode berikut untuk mengakses brankas kunci Azure:

Ikuti petunjuk di Berikan identitas untuk mengakses Penyedia Azure Key Vault untuk Secrets Store CSI Driver untuk metode yang Anda pilih.

Validasi rahasia

Setelah pod dimulai, konten yang dipasang di jalur volume yang Anda tentukan di YAML penyebaran akan tersedia.

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

Mendapatkan sertifikat dan kunci

Desain Azure Key Vault membuat perbedaan tajam antara kunci, rahasia, dan sertifikat. Fitur sertifikat layanan Key Vault dirancang untuk memanfaatkan kemampuan kunci dan rahasianya. Saat sertifikat brankas kunci dibuat, kunci dan rahasia yang dapat diatasi juga dibuat dengan nama yang sama. Kunci memungkinkan operasi kunci, dan rahasia memungkinkan pengambilan nilai sertifikat sebagai rahasia.

Sertifikat brankas kunci juga berisi metadata sertifikat x509 publik. Gudang kunci menyimpan komponen publik dan privat dari sertifikat Anda secara rahasia. Anda dapat memperoleh setiap komponen individu dengan menentukan objectType di SecretProviderClass. Tabel berikut menunjukkan objek mana yang dipetakan ke berbagai sumber daya yang terkait dengan sertifikat Anda:

Object Mengembalikan nilai Mengembalikan seluruh rantai sertifikat
key Kunci publik, dalam format Privacy Enhanced Mail (PEM) T/A
cert Sertifikat, dalam format PEM Tidak
secret Kunci privat dan sertifikat, dalam format PEM Ya

Nonaktifkan Penyedia Azure Key Vault untuk Secrets Store CSI Driver di kluster AKS yang ada

Catatan

Sebelum Anda menonaktifkan pengaya, pastikan tidak ada SecretProviderClass yang digunakan. Mencoba menonaktifkan pengaya saat SecretProviderClass ada akan menghasilkan kesalahan.

Untuk menonaktifkan kapabilitas Penyedia Azure Key Vault untuk Driver Secrets Store CSI di kluster yang ada, gunakan perintah az aks disable-addons dengan bendera azure-keyvault-secrets-provider:

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

Catatan

Jika add-on dinonaktifkan, beban kerja yang ada tidak akan mengalami masalah dan tidak akan melihat pembaruan apa pun di rahasia yang dipasang. Jika pod dimulai ulang atau pod baru dibuat sebagai bagian dari peristiwa perluasan, pod akan gagal dimulai karena driver tidak lagi berjalan.

Opsi konfigurasi tambahan.

Mengaktifkan dan mennonaktifkan rotasi otomatis

Catatan

Saat Penyedia Azure Key Vault untuk Secrets Store CSI Driver diaktifkan, penyedia akan memperbarui pemasangan pod dan rahasia Kubernetes yang ditentukan di bidang secretObjects pada SecretProviderClass. Penyedia melakukannya dengan polling untuk perubahan secara berkala, berdasarkan interval polling rotasi yang telah Anda tetapkan. Interval polling rotasi defaultnya adalah 2 menit.

Catatan

Ketika rahasia diperbarui di penyimpanan rahasia eksternal setelah penyebaran pod awal, Rahasia Kubernetes dan mount pod akan diperbarui secara berkala tergantung pada bagaimana aplikasi menggunakan data rahasia.

Pasang Rahasia Kubernetes sebagai volume: Gunakan fitur rahasia rotasi otomatis dan Sync K8s dari Driver CSI Secret Store. Aplikasi perlu memperhatikan perubahan dari volume Rahasia Kubernetes yang dipasang. Ketika Rahasia Kubernetes diperbarui oleh Driver CSI, konten volume yang sesuai akan diperbarui secara otomatis.

Aplikasi membaca data dari sistem file kontainer: Gunakan fitur rotasi Driver CSI Secret Store. Aplikasi perlu memperhatikan perubahan file dari volume yang dipasang oleh driver CSI.

Gunakan Rahasia Kubernetes untuk variabel lingkungan: Mulai ulang pod untuk mendapatkan rahasia terbaru sebagai variabel lingkungan. Gunakan alat seperti Reloader untuk melihat perubahan pada Rahasia Kubernetes yang disinkronkan dan melakukan peningkatan bergulir pada pod.

Untuk mengaktifkan rotasi otomatis rahasia, gunakan tanda enable-secret-rotation saat Anda membuat kluster:

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

Atau perbarui kluster yang ada dengan add-on yang diaktifkan:

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

Untuk menentukan interval rotasi kustom, gunakan tanda rotation-poll-interval:

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

Untuk menonaktifkan rotasi otomatis, gunakan tanda disable-secret-rotation:

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

Sinkronkan konten yang dipasang dengan rahasia Kube

Terkadang Anda mungkin ingin membuat rahasia Kubernetes untuk mencerminkan konten yang dipasang.

Saat Anda membuat SecretProviderClass, gunakan bidang secretObjects untuk menentukan status rahasia Kubernetes yang diinginkan, seperti yang ditunjukkan pada contoh berikut.

Catatan

Contoh di sini tidak lengkap. Anda harus mengubahnya untuk mendukung metode akses yang Anda pilih ke identitas brankas kunci Anda.

Rahasia akan disinkronkan hanya setelah Anda memulai pod untuk memasangnya. Hanya mengandalkan sinkronisasi dengan fitur rahasia Kubernetes tidak berfungsi. Ketika semua Pod yang menggunakan rahasia dihapus, rahasia Kubernetes juga akan dihapus.

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)

Catatan

Pastikan bahwa objectName di bidang secretObjects cocok dengan nama file konten yang dipasang. Jika Anda menggunakan objectAlias sebagai gantinya, hal ini harus cocok dengan alias objek.

Mengatur variabel lingkungan untuk mereferensikan rahasia Kubernetes

Setelah membuat rahasia Kubernetes, Anda dapat mereferensikannya dengan mengatur variabel lingkungan di pod Anda, seperti yang ditunjukkan pada contoh kode berikut:

Catatan

Contoh di sini tidak lengkap. Anda harus mengubahnya untuk mendukung akses identitas brankas kunci Azure yang telah Anda pilih.

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"

Metrik

Penyedia Azure Key Vault

Metrik disajikan melalui Prometheus dari port 8898, tetapi port ini tidak diekspos di luar pod secara default. Akses metrik melalui localhost dengan menggunakan kubectl port-forward:

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

Tabel berikut mencantumkan metrik yang disediakan oleh Penyedia Azure Key Vault untuk Secrets Store CSI Driver:

Metrik Deskripsi Tag
keyvault_request Distribusi berapa lama waktu yang dibutuhkan untuk keluar dari brankas kunci os_type=<runtime os>, provider=azure, object_name=<keyvault object name>, object_type=<keyvault object type>, error=<error if failed>
grpc_request Distribusi berapa lama waktu yang dibutuhkan untuk permintaan gRPC os_type=<runtime os>, provider=azure, grpc_method=<rpc full method>, grpc_code=<grpc status code>, grpc_message=<grpc status message>

Secrets Store CSI Driver

Metrik dilayani melalui Prometheus dari port 8095, tetapi port ini tidak terbuka di luar pod secara default. Akses metrik melalui localhost dengan menggunakan kubectl port-forward:

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

Tabel berikut mencantumkan metrik yang disediakan oleh Secrets Store CSI Driver:

Metrik Deskripsi Tag
total_node_publish Jumlah total permintaan pemasangan volume yang berhasil os_type=<runtime os>, provider=<provider name>
total_node_unpublish Jumlah total permintaan pelepasan volume yang berhasil os_type=<runtime os>
total_node_publish_error Jumlah total kesalahan dengan permintaan pemasangan volume os_type=<runtime os>, provider=<provider name>, error_type=<error code>
total_node_unpublish_error Jumlah total kesalahan dengan permintaan pelepasan volume os_type=<runtime os>
total_sync_k8s_secret Jumlah total rahasia Kubernetes yang disinkronkan os_type=<runtime os, provider=<provider name>
sync_k8s_secret_duration_sec Distribusi berapa lama waktu yang dibutuhkan untuk menyinkronkan rahasia Kubernetes os_type=<runtime os>
total_rotation_reconcile Jumlah total rotasi yang direkonsiliasi os_type=<runtime os>, rotated=<true or false>
total_rotation_reconcile_error Jumlah total rotasi yang direkonsiliasi dengan kesalahan os_type=<runtime os>, rotated=<true or false>, error_type=<error code>
total_rotation_reconcile_error Distribusi berapa lama waktu yang dibutuhkan untuk merotasi konten penyimpanan rahasia untuk pod os_type=<runtime os>

Langkah berikutnya

Setelah Anda mempelajari cara menggunakan Penyedia Azure Key Vault untuk Secrets Store CSI Driver dengan kluster AKS, lihat Mengaktifkan driver CSI untuk Azure Disk dan Azure Files di AKS .