0
点赞
收藏
分享

微信扫一扫

在AKS中通过CSI Driver mount key vault中的secret

这篇文章要介绍什么,应该在标题中就能看出来了,这篇主要是介绍如何在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的方式

首先大概介绍下需要准备的内容,大致包含这么多东西

  1. 一个AKS Cluster
  2. 一个SP,以及对应的client id和pwd
  3. 一个Key Vault,在Key Vault里配置一些secret
  4. 添加Access Policy给SP授权访问secret
  5. 部署用的yaml文件

创建cluster,service principal(SP)以及key vault的步骤就不介绍了

直接上干活,首先看下key vault中预配了以下的secret

在AKS中通过CSI Driver mount key vault中的secret_pwd

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

在AKS中通过CSI Driver mount key vault中的secret_vault_02

之后先在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

在AKS中通过CSI Driver mount key vault中的secret_Cloud_03

接下来开始准备部署用的yaml文件,yaml文件主要有两个

  1. SecretProviderClass yaml,用于描述要获取的secret以及通过哪种方式获取secret
  2. 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:
replicas: 2
selector:
matchLabels:
app: apachesecret
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
app: apachesecret
name: apachesecret
spec:
containers:
- image: *****
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 20
timeoutSeconds: 10
failureThreshold: 3
imagePullPolicy: Always
name: apachesecret
volumeMounts:
- mountPath: "/mnt/secrets-store"
name: secrets-store-inline
readOnly: true
volumes:
- csi:
driver: secrets-store.csi.k8s.io
nodePublishSecretRef:
name: keyvaultsecret
readOnly: true
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

在AKS中通过CSI Driver mount key vault中的secret_secret_04

接下来就可以开始部署了

kubectl apply -f "D:\UserData\Desktop\ApacheSecretProviderClassyml.yaml"
kubectl apply -f "D:\UserData\Desktop\ApacheSecretDeployment.yml"

在AKS中通过CSI Driver mount key vault中的secret_Cloud_05

可以看到pod已经跑起来了

kubectl get po

在AKS中通过CSI Driver mount key vault中的secret_pwd_06

而进到pod里,也可以看到secret已经成功pull下来了

在AKS中通过CSI Driver mount key vault中的secret_Azure_07

举报

相关推荐

Linux中的 mount -a

0 条评论