我是Kubernetes的新手,我面临着从keyvault获取秘密的问题,基本上,我想部署一个存储在Azure密钥库中的具有secret(servicebus connectionstring)的容器,因此需要从Azure密钥库访问秘密密钥。在这个示例yaml中,我硬编码了secretSERVICEBUS_CONNECTIONSTRING。一个示例邮件可以帮助我们。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deployment
strategy: {}
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- image: nginx
name: nginx
env:
- name: SERVICEBUS_CONNECTIONSTRING
value: "Endpoint=sb://servicebus-keda-aks-03.servicebus.windows.net/;SharedAccessKeyName=keda-aks-01;SharedAccessKey=lsTj32UdliVMlHYJhbSdKcEZkqCSX+FqClQWpBvr2da=;EntityPath=my-queue"
我自己没有尝试过,但是如果我没弄错的话,这些页面描述了您需要的内容:
- https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver
- https://samcogan.com/creating-kubernetes-secrets-from-azure-key-vault-with-the-csi-driver/
- https://shailender-choudhary.medium.com/access-secrets-from-azure-key-vault-in-azure-kubernetes-service-e8efffe49427
假设您正在使用AKS集群,在创建pod之后提取秘密可能会变得非常混乱。您可能需要为访问密钥库的特定pod设置权限(服务主体)。或者您可能需要在您的集群上配置CNI,这取决于创建AKS时使用的网络策略。
一个更好的方法是将这些存储在kubernetes的秘密中。您可以在部署pod之前手动创建它们。如下所示:
secret.yml:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: SB_CONN_STR
password: <base64 encoded connection string>
deployment.yml:
spec:
containers:
- name: mycontainer
image: nginx
env:
- name: SERVICEBUS_CONNECTIONSTRING
valueFrom:
secretKeyRef:
name: SB_CONN_STR
key: username
或
如果你想自动化这个,你可以在你的CI/CD作业或管道中完成,从keyvault中提取秘密作为env-vars,然后使用kubectl命令创建秘密。
kubectl create secret generic mysecret
--from-literal=username=SB_CONN_STR
--from-literal=password='S!B*d$zDsb='
希望对你有帮助。