Интеграция хранилища ключей Azure со службой Azure Kubernetes с использованием управляемой идентификации
Я настраиваю интеграцию Keyvault с k8s в Azure. Я могу смонтировать том с секретами с помощью драйвера csi в Azure с помощью управляемых удостоверений. Я могу проверить, что секрет установлен, выполнив команду в модуле и выведя секреты. Однако теперь я хочу раскрыть секреты как переменные среды, но я не понимаю, как это сделать. Ниже приводится следующее
SecretProviderClass
и
Pod
Я развернулся.
spc-keyvault.yaml:
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
name: spc-keyvault
spec:
provider: azure
secretObjects:
- secretName: foobar-secret
data:
- key: foobar
objectName: foobar
type: Opaque
parameters:
keyvaultName: "$keyvault"
usePodIdentity: "true"
useVMManagedIdentity: "false"
userAssignedIdentityID: ""
cloudName: ""
objects: |
array:
- |
objectName: foobar
objectType: secret
objectVersion: ""
resourceGroup: "$resourceGroup"
subscriptionId: "$subId"
tenantId: "$tenantId"
под.ямл:
apiVersion: v1
kind: Pod
metadata:
name: inject-secrets-from-akv
labels:
aadpodidbinding: azure-pod-identity-binding-selector
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET
valueFrom:
secretKeyRef:
name: foobar-secret
key: foobar
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
volumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: spc-keyvault
Вот ошибка, когда я развертываю свой манифест Pod:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Failed 58m (x227 over 108m) kubelet Error: secret "foobar-secret" not found
Normal Pulling 3m51s (x470 over 108m) kubelet Pulling image "nginx"
Ошибка довольно очевидна, нет никакого секрета с названием:
foobar-secret
. Я думал, что драйвер csi автоматически создал необходимые секреты. Итак, после некоторого исследования и изучения документации и исходного кода я нашел предложение добавить в pod yaml. Тогда вам нужно установить
nodePublishSecretRef
с идентификатором клиента aad и секретом клиента.[1, 2] Однако, поскольку я использую управляемую идентификацию, я не уверен, как это сделать.
Кто-нибудь получил эту работу с помощью Managed Identity и может предоставить какое-либо представление? Или мне нужно создать сценарий запуска (через configmap?), Чтобы заполнить монтирование тома как env. переменные.
2 ответа
После дополнительных поисков я обнаружил, что этот бит щекочет в диаграмме управления, чтобы заставить драйвер csi создавать секреты k8s:
secrets-store-csi-driver.syncSecret.enabled = true
Теперь у меня есть секреты k8s. Подумал, что я поделюсь с кем угодно, кто хочет эту функциональность.
Мне удалось решить эту проблему, обновив entrypoint.sh для экспорта секретов в переменные env. Что-то вроде этого:
if [ ! -z ${SECRET_PATH+x} ]
then
echo "Exporting secrets as env. variables."
for f in $(ls ${SECRET_PATH})
do
echo "Exporting $f..."
export $f=$(cat ${SECRET_PATH}/$f)
done
fi