Secrets 屬性來源

Kubernetes 具有 Secrets 的概念,用於儲存密碼、OAuth 權杖等敏感資料。此專案提供與 Secrets 的整合,使 Spring Boot 應用程式可以存取密鑰。您可以透過設定 spring.cloud.kubernetes.secrets.enabled 屬性來明確啟用或停用此功能。

啟用後,Fabric8SecretsPropertySource 會從以下來源查詢 Kubernetes 的 Secrets

  1. 從密鑰掛載點遞迴讀取

  2. 以應用程式命名(由 spring.application.name 定義)

  3. 符合某些標籤

注意

基於安全考量,預設情況下未啟用透過 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

  1. 透過列出密鑰對應到的目錄

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql

    如果您將所有密鑰對應到一個通用根目錄,您可以像這樣設定它們

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
  2. 透過設定具名密鑰

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  3. 透過定義標籤清單

    -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,則名為 s1Secret 將在應用程式執行的命名空間中查找。請參閱 命名空間解析,以更好地了解如何解析應用程式的命名空間。

ConfigMaps 類似;如果您希望應用程式在無法載入 Secrets 屬性來源時啟動失敗,您可以設定 spring.cloud.kubernetes.secrets.fail-fast=true

也可以為 Secret 屬性來源啟用重試 就像 ConfigMaps 一樣。與 ConfigMap 屬性來源一樣,首先您需要設定 spring.cloud.kubernetes.secrets.fail-fast=true。然後,您需要將 spring-retryspring-boot-starter-aop 新增至您的類別路徑。Secret 屬性來源的重試行為可以透過設定 spring.cloud.kubernetes.secrets.retry.* 屬性來配置。

如果您已經因為某些原因在類別路徑中擁有 spring-retryspring-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 及更高版本起支援此設定。

表 1. 屬性
名稱 類型 預設 描述

spring.cloud.kubernetes.secrets.enabled

Boolean

true

啟用 Secrets PropertySource

spring.cloud.kubernetes.secrets.name

String

${spring.application.name}

設定要查找的密鑰名稱

spring.cloud.kubernetes.secrets.namespace

String

用戶端命名空間

設定要查找的 Kubernetes 命名空間

spring.cloud.kubernetes.secrets.labels

Map

null

設定用於查找密鑰的標籤

spring.cloud.kubernetes.secrets.paths

List

null

設定密鑰掛載的路徑(範例 1)

spring.cloud.kubernetes.secrets.enableApi

Boolean

false

啟用或停用透過 API 使用密鑰(範例 2 和 3)

spring.cloud.kubernetes.secrets.fail-fast

Boolean

false

啟用或停用在載入 Secret 時發生錯誤時,應用程式啟動失敗

spring.cloud.kubernetes.secrets.retry.enabled

Boolean

true

啟用或停用密鑰重試。

spring.cloud.kubernetes.secrets.retry.initial-interval

Long

1000

初始重試間隔(毫秒)。

spring.cloud.kubernetes.secrets.retry.max-attempts

Integer

6

最大嘗試次數。

spring.cloud.kubernetes.secrets.retry.max-interval

Long

2000

最大退避間隔。

spring.cloud.kubernetes.secrets.retry.multiplier

Double

1.1

下一個間隔的乘數。

註釋

  • spring.cloud.kubernetes.secrets.labels 屬性的行為與 基於 Map 的繫結 定義的行為相同。

  • spring.cloud.kubernetes.secrets.paths 屬性的行為與 基於 Collection 的繫結 定義的行為相同。

  • 基於安全考量,透過 API 存取密鑰可能會受到限制。建議的方式是將密鑰掛載到 Pod。

您可以在 spring-boot-camel-config 找到使用密鑰的應用程式範例(雖然尚未更新為使用新的 spring-cloud-kubernetes 專案)