Helm 中自動產生秘密

Helm 中自動產生秘密

團隊 Mail.ru 的 Kubernetes aaS 翻譯了一個簡短的註釋 關於如何在更新時自動產生 Helm Secret。 以下是文章作者-開發SaaS解決方案的公司Intoware的技術總監的文字。

容器很酷。 起初我是反容器的(我不好意思承認),但現在我完全支持使用這項技術。 如果您正在閱讀本文,那麼您希望已經成功地在 Docker 的海洋中航行,認識到 Kubernetes 的好處,並使用 Helm 讓您的生活變得更加輕鬆。

然而,有些事情顯然比需要的更困難。

更新時如何自動產生secret?

Kubernetes 金鑰是一種資源,其中包含您想要在程式碼中使用的鍵/值對。 這些可能是資料庫連接字串、電子郵件密碼等。 透過使用機密,您可以在程式碼和設定之間建立清晰的分離,讓您可以輕鬆自訂不同的部署,而無需更改程式碼庫。

常見的情況是兩個模組必須使用公用密鑰進行通訊。 集群外部的任何人都不應該知道此密鑰,因為它用於集群內的一對一通訊。

製造秘密

通常,要在 Helm 中建立機密,您需要:

  • 在值文件中描述秘密;
  • 在部署期間重新定義它;
  • 在部署/pod 中引用它;
  • .... 利潤!

它通常看起來像這樣:

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

使用values.yml中的值的簡單Kubernetes秘密

但假設您不想在值檔中指定您的秘密。

當部署需要共用金鑰時,有許多選項,該共用金鑰必須在安裝過程中產生。

在上面的模組到模組通訊範例中,不希望在部署之外共享秘密。 因此,Helm 非常需要具有自動生成秘密的機制,而無需直接指定它。

掛鉤

掛鉤可讓您在安裝過程中在特定位置運行程式碼。 首次安裝後可能需要執行設定作業,或在執行任何更新之前可能需要完成清理。

為了解決新增安裝過程中產生的金鑰的問題,預先安裝掛鉤是理想的選擇。 但有一個問題:您無法在更新時自動產生密鑰。 Hooks 將在每次更新時起作用。

如果您已經產生了您的秘密並且您的第一次安裝尚未發生,那麼請停止閱讀,預安裝掛鉤將非常適合您。

但是,如果秘密是更新的一部分(可能是安裝過程中不存在的新功能),那麼遺憾的是您無法建立只能執行一次的預安裝掛鉤。

功能

Helm 功能可讓您將各種腳本元素新增至部署腳本。

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

此範例顯示 apiKey 金鑰的值將是安裝期間產生的新 UUID。

Helm 包含一個真正廣泛的功能庫,它利用令人驚嘆的 GO 範本功能和 Sprig 的功能庫來建立自訂部署。

尋找功能

Helm 3.1 中添加 尋找功能,它允許您請求現有部署並且:

  • 檢查資源是否存在;
  • 傳回現有資源的值以供以後使用。

使用這兩種功能,我們可以創建一次性、動態生成的秘密!

# 1. Запросить существование секрета и вернуть в переменной $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
  name: some-awesome-secret
type: Opaque

# 2. Если секрет существует, взять его значение как apiKey (секрет использует кодирование Base64, так что используйте ключ "data")
{{ if $secret -}}
data:
  apiKey: {{ $secret.data.apiKey }}

# 3. Если секрет не существует — создать его (в этот раз используйте "stringData", так как будет обычное значение)!
{{ else -}}
stringData:
  apiKey: {{ uuidv4 | quote }}
{{ end }}

每當伺服器套用新的更新時,Helm 都會產生新的金鑰值(如果還沒有金鑰)或重複使用現有值。

祝你好運!

關於該主題還可以閱讀什麼:

  1. Kubernetes 中的三個級別的自動縮放以及如何有效地使用它們.
  2. 本著盜版精神的 Kubernetes 提供了實作模板.
  3. 我們在 Telegram 中圍繞 Kubernetes 的頻道.

來源: www.habr.com

添加評論