这篇文章要介绍什么,应该在标题中就能看出来了,这篇主要是介绍如何在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
apiVersion secrets-store.csi.x-k8s.io/v1
kind SecretProviderClass
metadata
name"spc-keyvault"
namespace"default"
spec
provider azure
parameters
usePodIdentity"false"
useVMManagedIdentity"false"
userAssignedIdentityID"***" # Service Principal ID
keyvaultName"mxyvault"
objects
array:
- |
objectName: username
objectType: secret
- |
objectName: userpwd
objectType: secret
tenantId"****" # tenant ID
App yaml
apiVersion apps/v1
kind Deployment
metadata
labels
app apachesecret
name apachesecret
spec
replicas2
selector
matchLabels
app apachesecret
strategy
rollingUpdate
maxSurge1
maxUnavailable1
type RollingUpdate
template
metadata
labels
app apachesecret
name apachesecret
spec
containers
image *****
livenessProbe
httpGet
path /
port80
initialDelaySeconds30
periodSeconds20
timeoutSeconds10
failureThreshold3
imagePullPolicy Always
name apachesecret
volumeMounts
mountPath"/mnt/secrets-store"
name secrets-store-inline
readOnlytrue
volumes
csi
driver secrets-store.csi.k8s.io
nodePublishSecretRef
name keyvaultsecret
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下来了