团队
容器很酷。 起初我是反容器的(我不好意思承认),但现在我完全支持使用这项技术。 如果您正在阅读本文,那么您希望已经成功地在 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 都会生成新的密钥值(如果还没有密钥)或重用现有值。
祝你好运!
关于该主题还可以阅读什么:
来源: habr.com