我使用 CSI 驅動程式(檔案)將 AKV 與 AKS 集成。
我可以通過執行以下操作在 Pod 中訪問它們:
## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
## print a test secret 'ExampleSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret
我讓它與我的 PostgreSQL 部署一起作業,執行以下操作:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment-prod
namespace: prod
spec:
replicas: 1
selector:
matchLabels:
component: postgres
template:
metadata:
labels:
component: postgres
aadpodidbinding: aks-akv-identity
spec:
containers:
- name: postgres
image: postgres:13-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB_FILE
value: /mnt/secrets-store/PG-DATABASE
- name: POSTGRES_USER_FILE
value: /mnt/secrets-store/PG-USER
- name: POSTGRES_PASSWORD_FILE
value: /mnt/secrets-store/PG-PASSWORD
- name: POSTGRES_INITDB_ARGS
value: "-A md5"
- name: PGDATA
value: /var/postgresql/data
volumeMounts:
- name: postgres-storage-prod
mountPath: /var/postgresql
- name: secrets-store01-inline
mountPath: /mnt/secrets-store
readOnly: true
volumes:
- name: postgres-storage-prod
persistentVolumeClaim:
claimName: postgres-storage-prod
- name: file-storage-prod
persistentVolumeClaim:
claimName: file-storage-prod
- name: secrets-store01-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: aks-akv-secret-provider
---
apiVersion: v1
kind: Service
metadata:
name: postgres-cluster-ip-service-prod
namespace: prod
spec:
type: ClusterIP
selector:
component: postgres
ports:
- port: 5432
targetPort: 5432
哪個作業正常。
想出我需要做的就是換掉如下的東西:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: app-prod-secrets
key: PGPASSWORD
為了:
- name: POSTGRES_PASSWORD
value: /mnt/secrets-store/PG-PASSWORD
# or
- name: POSTGRES_PASSWORD_FILE
value: /mnt/secrets-store/PG-PASSWORD
我會是金子,但事實并非如此。
在 Pod 中,它以字串的形式讀取值,這讓我對兩件事感到困惑:
- 例如,為什么這適用于 PostgreSQL 部署,但不適用于我的 Django API?
- 有沒有辦法在
env:不將它們轉入秘密和使用的情況下添加它們secretKeyRef?
uj5u.com熱心網友回復:
CSI 驅動程式通過將機密資訊作為檔案放置在檔案系統中來將機密資訊注入 pod。每個秘密將有一個檔案,其中
- 檔案名是秘密的名稱(或秘密提供者類中指定的別名)
- 檔案的內容就是密鑰的值。
CSI 不會創建密鑰的環境變數。將機密添加為環境變數的推薦方法是讓 CSI 創建一個 Kubernetes 機密,然后使用本機構secretKeyRef造
例如,為什么這適用于 PostgreSQL 部署,但不適用于我的 Django API?
在您的 Django API 應用程式中,您將環境變數設定POSTGRES_PASSWORD
為 value /mnt/secrets-store/PG-PASSWORD。即您只是說某個變數應該包含某個值,僅此而已。因此,變數不包含 pat,而不是秘密值本身。
Postgres 部署也是如此,它只是環境變數中的一個路徑。不同之處在于 Postgres 部署如何解釋該值。當使用以結尾的環境變數時,_FILEPostgres 并不期望環境變數本身包含秘密,而是包含檔案的路徑。來自Postgres 影像的檔案:
作為通過環境變數傳遞敏感資訊的替代方法,_FILE 可能會附加到一些先前列出的環境變數中,從而導致初始化腳本從容器中存在的檔案中加載這些變數的值。特別是,這可用于從存盤在 /run/secrets/<secret_name> 檔案中的 Docker 機密中加載密碼。例如:
$ docker run --name some-postgres -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-passwd -d postgres目前,這僅支持 POSTGRES_INITDB_ARGS、POSTGRES_PASSWORD、POSTGRES_USER 和 POSTGRES_DB。
有沒有辦法將它們添加到 env 中:無需將它們轉入秘密并使用 secretKeyRef? 不,不是開箱即用。你可以做的是在你的影像中有一個入口點腳本,它在啟動主應用程式之前讀取你的秘密檔案夾中的所有檔案并將它們設定為環境變數(變數的名稱是檔案名,值是檔案內容) . 這樣,應用程式可以將機密作為環境變數訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446647.html
標籤:天蓝色 Kubernetes 天蓝色 天蓝色密钥库 CSI
上一篇:如何為mongo配置dns決議以從k8s集群內部連接到atlas
下一篇:單個K8S部署中的多個應用程式
