Secrets 屬性來源
Kubernetes 具有 Secrets 的概念,用於儲存密碼、OAuth 權杖等敏感資料。此專案提供與 Secrets
的整合,使 Spring Boot 應用程式可以存取密鑰。您可以透過設定 spring.cloud.kubernetes.secrets.enabled
屬性來明確啟用或停用此功能。
啟用後,Fabric8SecretsPropertySource
會從以下來源查詢 Kubernetes 的 Secrets
-
從密鑰掛載點遞迴讀取
-
以應用程式命名(由
spring.application.name
定義) -
符合某些標籤
注意
基於安全考量,預設情況下未啟用透過 API (上述第 2 點和第 3 點) 使用 Secrets。對密鑰的 'list' 權限允許用戶端檢查指定命名空間中的密鑰值。此外,我們建議容器透過掛載卷共享密鑰。
如果您啟用透過 API 使用 Secrets,我們建議您使用授權原則 (例如 RBAC) 限制對 Secrets 的存取。有關透過 API 使用 Secrets 的風險和最佳實務的更多資訊,請參閱 此文件。
如果找到密鑰,則其資料將提供給應用程式。
假設我們有一個名為 demo
的 Spring Boot 應用程式,它使用屬性來讀取其資料庫組態。我們可以使用以下命令建立 Kubernetes 密鑰
kubectl create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd
上述命令將建立以下密鑰(您可以使用 kubectl get secrets db-secret -o yaml
查看)
apiVersion: v1
data:
password: cDQ1NXcwcmQ=
username: dXNlcg==
kind: Secret
metadata:
creationTimestamp: 2017-07-04T09:15:57Z
name: db-secret
namespace: default
resourceVersion: "357496"
selfLink: /api/v1/namespaces/default/secrets/db-secret
uid: 63c89263-6099-11e7-b3da-76d6186905a8
type: Opaque
請注意,資料包含 create
命令提供的文字的 Base64 編碼版本。
然後,您的應用程式可以使用此密鑰,例如,透過將密鑰的值匯出為環境變數
apiVersion: v1
kind: Deployment
metadata:
name: ${project.artifactId}
spec:
template:
spec:
containers:
- env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
您可以透過多種方式選擇要使用的 Secrets
-
透過列出密鑰對應到的目錄
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql
如果您將所有密鑰對應到一個通用根目錄,您可以像這樣設定它們
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
-
透過設定具名密鑰
-Dspring.cloud.kubernetes.secrets.name=db-secret
-
透過定義標籤清單
-Dspring.cloud.kubernetes.secrets.labels.broker=activemq -Dspring.cloud.kubernetes.secrets.labels.db=postgresql
與 ConfigMap
的情況一樣,更進階的組態也是可能的,您可以使用多個 Secret
實例。spring.cloud.kubernetes.secrets.sources
清單使這成為可能。例如,您可以定義以下 Secret
實例
spring:
application:
name: cloud-k8s-app
cloud:
kubernetes:
secrets:
name: default-name
namespace: default-namespace
sources:
# Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
- name: s1
# Spring Cloud Kubernetes looks up a Secret named default-name in namespace n2
- namespace: n2
# Spring Cloud Kubernetes looks up a Secret named s3 in namespace n3
- namespace: n3
name: s3
在上述範例中,如果未設定 spring.cloud.kubernetes.secrets.namespace
,則名為 s1
的 Secret
將在應用程式執行的命名空間中查找。請參閱 命名空間解析,以更好地了解如何解析應用程式的命名空間。
與 ConfigMaps
類似;如果您希望應用程式在無法載入 Secrets
屬性來源時啟動失敗,您可以設定 spring.cloud.kubernetes.secrets.fail-fast=true
。
也可以為 Secret
屬性來源啟用重試 就像 ConfigMaps
一樣。與 ConfigMap
屬性來源一樣,首先您需要設定 spring.cloud.kubernetes.secrets.fail-fast=true
。然後,您需要將 spring-retry
和 spring-boot-starter-aop
新增至您的類別路徑。Secret
屬性來源的重試行為可以透過設定 spring.cloud.kubernetes.secrets.retry.*
屬性來配置。
如果您已經因為某些原因在類別路徑中擁有 spring-retry 和 spring-boot-starter-aop ,並且想要啟用快速失敗,但不想要啟用重試;您可以透過設定 spring.cloud.kubernetes.secrets.retry.enabled=false 來停用 Secrets PropertySources 的重試。 |
由於來自 Secrets 的資料通常被視為敏感資料,因此可以使 actuator 的 /env
和 /configprops
端點清理資料,使其不會以純文字顯示。為了做到這一點,您需要設定
spring.cloud.kubernetes.sanitize.secrets=true
自 3.0.6
及更高版本起支援此設定。
名稱 | 類型 | 預設 | 描述 |
---|---|---|---|
|
|
|
啟用 Secrets |
|
|
|
設定要查找的密鑰名稱 |
|
|
用戶端命名空間 |
設定要查找的 Kubernetes 命名空間 |
|
|
|
設定用於查找密鑰的標籤 |
|
|
|
設定密鑰掛載的路徑(範例 1) |
|
|
|
啟用或停用透過 API 使用密鑰(範例 2 和 3) |
|
|
|
啟用或停用在載入 |
|
|
|
啟用或停用密鑰重試。 |
|
|
|
初始重試間隔(毫秒)。 |
|
|
|
最大嘗試次數。 |
|
|
|
最大退避間隔。 |
|
|
|
下一個間隔的乘數。 |
註釋
-
spring.cloud.kubernetes.secrets.labels
屬性的行為與 基於 Map 的繫結 定義的行為相同。 -
spring.cloud.kubernetes.secrets.paths
屬性的行為與 基於 Collection 的繫結 定義的行為相同。 -
基於安全考量,透過 API 存取密鑰可能會受到限制。建議的方式是將密鑰掛載到 Pod。
您可以在 spring-boot-camel-config 找到使用密鑰的應用程式範例(雖然尚未更新為使用新的 spring-cloud-kubernetes
專案)