Secrets PropertySource

Kubernetes 有 Secrets 的概念,用於儲存敏感資料,例如密碼、OAuth 令牌等。本專案提供了與 Secrets 的整合,使 Spring Boot 應用程式可以訪問這些 Secrets。您可以透過設定 spring.cloud.kubernetes.secrets.enabled 屬性來明確啟用或停用此功能。

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

  1. 遞迴地從 secret 掛載中讀取

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

  3. 匹配某些標籤

備註

預設情況下,出於安全原因,**不啟用**透過 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

  1. 透過設定命名 secret

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  2. 透過定義標籤列表

    -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。請參閱 namespace-resolution 以更好地瞭解應用程式名稱空間的解析方式。

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

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

如果您的 classpath 中由於某種原因已經有了 spring-retryspring-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 及更高版本支援。

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

spring.cloud.kubernetes.secrets.enabled

布林值

true

啟用 Secrets PropertySource

spring.cloud.kubernetes.secrets.name

字串

${spring.application.name}

設定要查詢的 secret 名稱

spring.cloud.kubernetes.secrets.namespace

字串

客戶端名稱空間

設定要查詢的 Kubernetes 名稱空間

spring.cloud.kubernetes.secrets.labels

Map

null

設定用於查詢 secrets 的標籤

spring.cloud.kubernetes.secrets.fail-fast

布林值

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

spring.cloud.kubernetes.secrets.retry.enabled

布林值

true

啟用或停用 secrets 重試。

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

長整型

1000

初始重試間隔,單位為毫秒。

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

整數

6

最大嘗試次數。

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

長整型

2000

回退的最大間隔。

spring.cloud.kubernetes.secrets.retry.multiplier

雙精度浮點型

1.1

下一個間隔的乘數。

備註

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

  • 出於安全原因,透過 API 訪問 secrets 可能會受到限制。首選方式是將 secrets 掛載到 Pod。

您可以在 spring-boot-camel-config 中找到一個使用 secrets 的應用程式示例(儘管它尚未更新以使用新的 spring-cloud-kubernetes 專案)

© . This site is unofficial and not affiliated with VMware.