0
点赞
收藏
分享

微信扫一扫

在AKS中结合pod identity以及CSI Driver mount key vault中的secret

在之前一篇文章中有介绍过在AKS里如何通过CSI driver这个add on,将secret自动mount到pod中,通过将secret放到key vault中让应用程序自动获取,可以很好地保护一些机密信息的安全

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

但是这种做法有一个小小问题,就是之前我们是用service principal mount的secret,这要求我们需要在AKS上创建一个secret,里边存放service principal的id和pwd,一般情况下如果AKS是由负责运维的team统一管理,应用团队没有权限的话,这种做法不会有什么问题,但是如果应用团队也有AKS权限,这样就不怎么好了,因为有可能应用团队的人可能会有权限查看到secret里的值

所以为了避免这种情况,我们还可以使用pod identity结合​managed service identity一起把所有获取token的步骤完全交给后台Azure完成,在前端不需要有任何明显的pwd这种痕迹

下边来看下具体做法,这个demo要求的前置条件比较多,如果本文没写到的步骤,可以参考以下两篇文章

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

​​在AKS中使用pod identity获取token - 实践​​


环境准备:

1. AKS Cluster * 1

2. User assigned managed identity * 1

3. Key Vault * 1

4. Kubectl client * 1


前置条件:

1. 创建好AKS Cluster

2. 创建好Key Vault

3. 在Key Vault中准备好测试用的secret

4. 创建好测试用的User assigned managed identity

5. 为AKS Cluster Enable CSI driver add on

6. 在AKS Cluster 部署pod identity component


实际操作

给identity授权访问secret

首先先给User assigned managed identity授权访问Key Vault中的secret

在AKS中结合pod identity以及CSI Driver mount key vault中的secret_Cloud

Demo就是个User assigned managed identity

在AKS中结合pod identity以及CSI Driver mount key vault中的secret_Cloud_02


准备yaml文件

接下来就是准备pod identity中的Azure Identity和binding部署文件以及pod的部署文件

AzureIdentity

apiVersion: "aadpodidentity.k8s.io/v1"
kind: AzureIdentity
metadata:
name: <any-name>
spec:
type: 0
resourceID: /subscriptions/<subid>/resourcegroups/<resourcegroup>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<idname>
clientID: <clientid>

AzureIdentityBinding

apiVersion: "aadpodidentity.k8s.io/v1"
kind: AzureIdentityBinding
metadata:
name: <any-name>
spec:
azureIdentity: <name of the AzureIdentity created in previous step>
selector: <label value to match in your pod>

准备SecretProviderClass的yaml

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname-podid
spec:
provider: azure
parameters:
usePodIdentity: "true"
keyvaultName: "kvname"
objects: |
array:
- |
objectName: secret1
objectType: secret # object types: secret, key or cert
objectVersion: "" # [OPTIONAL] object versions, default to latest if empty
- |
objectName: key1
objectType: key
objectVersion: ""
tenantId: "tid" # the tenant ID of the KeyVault

最后准备测试用的pod yaml

apiVersion: v1
kind: Pod
metadata:
labels:
app: podidentitykeyvault
aadpodidbinding: keyvaultdemoselector
name: podidentitykeyvault
spec:
containers:
- image: ***
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 20
timeoutSeconds: 10
failureThreshold: 3
imagePullPolicy: Always
name: podidentitysecret
volumeMounts:
- mountPath: "/mnt/secrets-store"
name: secrets-store-inline
readOnly: true
volumes:
- csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-kv-demo"
name: "secrets-store-inline"

开始部署

kubectl apply -f .\AzureIdentity.yml
kubectl apply -f .\AzureIdentityBinding.yml

在AKS中结合pod identity以及CSI Driver mount key vault中的secret_Cloud_03

部署的过程不一一赘述了,但是可以看到部署之后,Pod正常跑起来,并且可以获取到secret

在AKS中结合pod identity以及CSI Driver mount key vault中的secret_Secret_04

azure assigned identity也正常创建了

kubectl get azureassignedidentity

在AKS中结合pod identity以及CSI Driver mount key vault中的secret_Secret_05

举报

相关推荐

Linux中的 mount -a

0 条评论