通過使用https://docs.microsoft.com/en-us/azure/aks/csi-secrets-store-nginx-tls這個檔案的參考,我試圖從 AKV 獲取 TLS 機密到 AKS pod。最初,我使用User Assigned Managed Identity創建并配置了CSI 驅動程式配置。
我執行了以下步驟:
- 創建具有 1 個節點池的 AKS 集群。
- 創建 AKV。
- 創建的用戶分配了托管標識并將其分配給節點池,即分配給為 AKS 創建的 VMSS。
- 在 AKS 的“kube-system”命名空間中安裝了 CSI Driver helm chart 。并完成了執行此操作的所有要求。
- 創建 TLS 證書和密鑰。
- 通過使用 TLS 證書和密鑰,創建了 .pfx 檔案。
- 將該 .pfx 檔案上傳到名為“ingresscert”的 AKV 證書中。
- 在 AKS 中創建了名為“ingress-test”的新命名空間。
- 在該命名空間中部署的 secretProviderClass 如下:
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-tls
spec:
provider: azure
secretObjects: # secretObjects defines the desired state of synced K8s secret objects
- secretName: ingress-tls-csi
type: kubernetes.io/tls
data:
- objectName: ingresscert
key: tls.key
- objectName: ingresscert
key: tls.crt
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: "7*******-****-****-****-***********1"
keyvaultName: "*****-*****-kv" # the name of the AKV instance
objects: |
array:
- |
objectName: ingresscert
objectType: secret
tenantId: "e*******-****-****-****-***********f" # the tenant ID of the AKV instance
- 在同一個命名空間中部署了nginx-ingress-controller helm chart,其中證書與應用程式系結。
- 部署的 Busy Box 部署如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-one
labels:
app: busybox-one
spec:
replicas: 1
selector:
matchLabels:
app: busybox-one
template:
metadata:
labels:
app: busybox-one
spec:
containers:
- name: busybox
image: k8s.gcr.io/e2e-test-images/busybox:1.29-1
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: "azure-tls"
---
apiVersion: v1
kind: Service
metadata:
name: busybox-one
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: busybox-one
- 使用命令檢查秘密是否創建
kubectl get secret -n <namespaceName>
這里要注意的一件事是,如果我將 shell 與繁忙的盒子 pod 連接起來,并轉到我提供的用于安裝機密的安裝路徑,我已經看到在那里成功獲取了機密。但是這個秘密沒有顯示在 AKS 的秘密串列中。
我已經對所有 AKS、KV 和清單檔案進行了故障排除,但沒有發現任何問題。如果我遺漏了任何內容或有人對此有解決方案,請告訴我。
提前致謝..!!!
uj5u.com熱心網友回復:
我將此添加為新答案,因為評論中的格式很糟糕:
當您使用 Helm Chart 時,您必須激活values.yamlHelm Chart 中的秘密同步:
secrets-store-csi-driver:
syncSecret:
enabled: true
我仍然建議使用csi-secrets-store-provider-azureas AKS Addon 而不是 Helm-Chart
uj5u.com熱心網友回復:
你的配置對我來說很好。需要考慮的一件事是,User Assigned Managed Identity不應該是您為 AKS 創建的身份,它應該是來自您的節點池 (kubelet) 的托管身份,并且它還需要對 AKV 的許可。
我在使用錯誤的托管身份時遇到了同樣的問題。
userAssignedIdentityID = Kubelet Client Id ( Nodepool Managed Idendity )
命令列界面
export KUBE_ID=$(az aks show -g <resource group> -n <aks cluster name> --query identityProfile.kubeletidentity.objectId -o tsv)
export AKV_ID=$(az keyvault show -g <resource group> -n <akv name> --query id -o tsv)
az role assignment create --assignee $KUBE_ID --role "Key Vault Secrets Officer" --scope $AKV_ID
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370056.html
