Secrets PropertySource
Kubernetes 有 Secrets 的概念,用於儲存敏感資料,例如密碼、OAuth 令牌等。本專案提供了與 Secrets 的整合,使 Spring Boot 應用程式可以訪問這些 Secrets。您可以透過設定 spring.cloud.kubernetes.secrets.enabled 屬性來明確啟用或停用此功能。
啟用後,Fabric8SecretsPropertySource 會從以下來源查詢 Kubernetes 的 Secrets
-
遞迴地從 secret 掛載中讀取
-
以應用程式命名(由
spring.application.name定義) -
匹配某些標籤
備註
預設情況下,出於安全原因,**不啟用**透過 API 消費 Secrets(上述第 2 點和第 3 點)。對 Secrets 的“list”許可權允許客戶端檢查指定名稱空間中的 Secrets 值。此外,我們建議容器透過掛載卷共享 Secrets。
如果您透過 API 啟用 Secrets 的消費,我們建議您使用授權策略(例如 RBAC)限制對 Secrets 的訪問。有關透過 API 消費 Secrets 的風險和最佳實踐的更多資訊,請參閱 此文件。
如果找到 Secrets,其資料將提供給應用程式。
假設我們有一個名為 demo 的 Spring Boot 應用程式,它使用屬性讀取其資料庫配置。我們可以使用以下命令建立 Kubernetes Secret
kubectl create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd
上述命令將建立以下 Secret(您可以使用 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 編碼版本。
您的應用程式隨後可以使用此 secret — 例如,透過將 secret 的值匯出為環境變數
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
-
透過設定命名 secret
-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。請參閱 namespace-resolution 以更好地瞭解應用程式名稱空間的解析方式。
與 ConfigMaps 類似;如果您希望應用程式在無法載入 Secrets 屬性源時啟動失敗,可以將 spring.cloud.kubernetes.secrets.fail-fast=true。
也可以為 Secret 屬性源啟用重試 就像 ConfigMaps 一樣。與 ConfigMap 屬性源一樣,首先您需要設定 spring.cloud.kubernetes.secrets.fail-fast=true。然後您需要在 classpath 中新增 spring-retry 和 spring-boot-starter-aspectj。Secret 屬性源的重試行為可以透過設定 spring.cloud.kubernetes.secrets.retry.* 屬性來配置。
如果您的 classpath 中由於某種原因已經有了 spring-retry 和 spring-boot-starter-aspectj,並且想要啟用快速失敗,但又不想啟用重試;您可以透過設定 spring.cloud.kubernetes.secrets.retry.enabled=false 來停用 Secrets PropertySources 的重試。 |
由於來自 Secrets 的資料通常被視為敏感資料,因此可以將 actuator 的 /env 和 /configprops 端點設定為清理資料,使其不以明文形式顯示。為此,您需要設定
spring.cloud.kubernetes.sanitize.secrets=true
此設定自 3.0.6 及更高版本支援。
| 名稱 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
啟用 Secrets |
|
|
|
設定要查詢的 secret 名稱 |
|
|
客戶端名稱空間 |
設定要查詢的 Kubernetes 名稱空間 |
|
|
|
設定用於查詢 secrets 的標籤 |
|
|
|
當載入 |
|
|
|
啟用或停用 secrets 重試。 |
|
|
|
初始重試間隔,單位為毫秒。 |
|
|
|
最大嘗試次數。 |
|
|
|
回退的最大間隔。 |
|
|
|
下一個間隔的乘數。 |
備註
-
spring.cloud.kubernetes.secrets.labels屬性的行為遵循 基於 Map 的繫結 的定義。 -
出於安全原因,透過 API 訪問 secrets 可能會受到限制。首選方式是將 secrets 掛載到 Pod。
您可以在 spring-boot-camel-config 中找到一個使用 secrets 的應用程式示例(儘管它尚未更新以使用新的 spring-cloud-kubernetes 專案)