團隊
容器很酷。 起初我是反容器的(我不好意思承認),但現在我完全支持使用這項技術。 如果您正在閱讀本文,那麼您希望已經成功地在 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 都會產生新的金鑰值(如果還沒有金鑰)或重複使用現有值。
祝你好運!
關於該主題還可以閱讀什麼:
來源: www.habr.com