这篇文章要介绍什么,应该在标题中就能看出来了,这篇主要是介绍如何在AKS中将Azure Key Vault中的secret mount到storage中,这种场景应该算是非常标准的安全设计了,像是一些比较隐秘的信息一般都推荐放在Key Vault里,这样会比较安全,举个例子,数据库或者应用的username和pwd,放在Key Vault中,然后让pod自动读取key vault中的信息,这样可以最大程度避免信息泄露的风险
而如果想实现这点的话,就需要用到今天介绍的内容,主要其实是通过CSI driver来实现的,以前这东西叫Flex Volume,获取secret中的内容肯定是需要有权限的,而拿到授权的方式其实有很多种,包括service principal,pod identity,vmss identity等多种,本次主要用的是service principal的方式
首先大概介绍下需要准备的内容,大致包含这么多东西
- 一个AKS Cluster
- 一个SP,以及对应的client id和pwd
- 一个Key Vault,在Key Vault里配置一些secret
- 添加Access Policy给SP授权访问secret
- 部署用的yaml文件
创建cluster,service principal(SP)以及key vault的步骤就不介绍了
直接上干活,首先看下key vault中预配了以下的secret

现在添加一个access policy,给service principal授予secret的get,list权限

之后先在K8S上创建一个secret,这个secret会包含service principal的id和pwd,csi driver会读取这个secret然后通过service principal的id和pwd拿到token,进而拉取key vault里的secret
kubectl create secret generic keyvaultsecret --from-literal clientid=<AZURE_CLIENT_ID> --from-literal clientsecret=<AZURE_CLIENT_SECRET>
kubectl label secret keyvaultsecret secrets-store.csi.k8s.io/used=true
接下来开始准备部署用的yaml文件,yaml文件主要有两个
- SecretProviderClass yaml,用于描述要获取的secret以及通过哪种方式获取secret
- App yaml,常规应用部署的yaml,包含mountpath以及使用的secret
SecretProviderClass yaml
apiVersionsecrets-store.csi.x-k8s.io/v1
kindSecretProviderClass
metadata
  name"spc-keyvault" 
  namespace"default" 
spec
  providerazure                   
  parameters
    usePodIdentity"false"
    useVMManagedIdentity"false"
    userAssignedIdentityID"***" # Service Principal ID
    keyvaultName"mxyvault"
    objects
      array:
        - |
          objectName: username
          objectType: secret
        - |
          objectName: userpwd
          objectType: secret
    tenantId"****" # tenant IDApp yaml
apiVersionapps/v1
kindDeployment
metadata
  labels
    appapachesecret
  nameapachesecret
spec
  replicas2
  selector
    matchLabels
      appapachesecret
  strategy
    rollingUpdate
      maxSurge1
      maxUnavailable1
    typeRollingUpdate
  template
    metadata
      labels
        appapachesecret
      nameapachesecret
    spec
      containers
image*****
          livenessProbe
            httpGet
              path/
              port80
            initialDelaySeconds30
            periodSeconds20
            timeoutSeconds10
            failureThreshold3
          imagePullPolicyAlways
          nameapachesecret
          volumeMounts
mountPath"/mnt/secrets-store"
              namesecrets-store-inline
              readOnlytrue
      volumes
csi
            driversecrets-store.csi.k8s.io
            nodePublishSecretRef
              namekeyvaultsecret
            readOnlytrue
            volumeAttributes
              secretProviderClass"spc-keyvault"
          name"secrets-store-inline"这样一个简单的demo就搞差不多了,接下来在部署之前,需要先给AKS开启add on,否则secret provider class这个resource是不会被识别的
az aks enable-addons --addons azure-keyvault-secrets-provider --name myAKSCluster --resource-group myResourceGroup
接下来就可以开始部署了
kubectl apply -f "D:\UserData\Desktop\ApacheSecretProviderClassyml.yaml"
kubectl apply -f "D:\UserData\Desktop\ApacheSecretDeployment.yml"
可以看到pod已经跑起来了
kubectl get po
而进到pod里,也可以看到secret已经成功pull下来了











